深度学习与TensorFlow:FCN论文学习笔记

这篇文章陆陆续续看了快两周,其中也遇到了自己很多的知识的漏洞,踩了很多坑,这里希望能够和大家说一说,也希望大家可以分享一下自己的看法.

1:FCN基本思路

自从CNN成功之后,很多人都在尝试使用CNN进行图像分割,个人认为CNN最厉害的地方是他的多层结构可以自动提取学习的特征,并且将其学习,并且将提取的这些特征进行分类,但是我们当用CNN进行图像分割的时候,CNN的这项优势反而变成了劣势,因为在特征提取时丢失了一些细节,反倒没有办法指出某些像素点属于那些物体,而FCN跟传统的CNN进行像素分割不同,FCN是试图从抽象的这些抽象的特征中恢复每个像素的类别,也就是从物体的分类到像素点级别的分类,这可以说是一个很大的突破.

2:end-to-end模型怎么理解?

在论文阅读中,我们多次发现读者强调FCN是end-to-end的,这一个部分我觉得用NLP的流程思路去想想还是挺有意思的.在我们之前的NLP对话系统中,往往是由很多个模块组成的,每一个模块单独执行一块任务,这些模块合在一起就构成了整个系统,这样有些面向对象的思想,但是这样每一个模块质量的好坏将直接影响到下一个步骤甚至是整个任务,这是非端到端的.

现在到了深度学习了,深度学习的模型直接在训练过程中从输入数据开始,到达输出端就会有一个输出结果,这样和真实的结果之间就会有一个误差值,这个误差会经过反向传播之后不断进行迭代,每层进行微调,直到我们的模型误差达到一个合理的范围.

最后通俗的说,端到端模型就是输入原始数据,经过模型,获得你想要的结果.

3:FCN基本结构

FCN将传统CNN中的全连接层转化成一个个的卷积层

在上图中,我们可以看到FCN将传统的CNN中的三层全连接层全部修改为卷积层,卷积核的大小(通道数,宽,高)分别为(4096,1,1)、(4096,1,1)、(1000,1,1)。所有的层都是卷积层,所以叫做FCN.

但是我们熟悉卷积原理我们应该知道,每一次卷积都是对图像的一次缩小,每一次缩小带来的是分辨率越低,图像越模糊,而在第一部分我们知道FCN是通过像素点进行图像分割,那FCN是怎么解决的这一个问题?

答案是上采样,比如我们在3次卷积后,图像分别缩小了2 4 8倍,因此在最后的输出层,我们需要进行8倍的上采样,从而得到原来的图像大小.而上采样本身就是一个反卷积实现的,论文中的解释:卷积的forward、backward操作对调,也就是转置卷积.

上图是这个卷积和反卷积上采样的过程:所说的是对第5层的输出(32倍放大)反卷积到原图大小,得到的结果还是不够精确,一些细节无法恢复。于是Jonathan将第4层的输出和第3层的输出也依次反卷积,分别需要16倍和8倍上采样,结果就精细一些了。

有对反卷积不理解的同学可以去看看知乎的提问,如果通俗易懂的解释反卷积?

从论文中得到的结果来看,从32倍,16倍,8倍到最终结果,结果越来越精细.

4:优点和不足

优点:

1:模型的拓展性简单

主要结构与很多模型都类似,基本上现在的采用CNN的模型都可以通过将全连接层转换为卷积层来转化为全卷机模型,这样就可以输出空间的映射.

2:速度快速,高效

因为避免了由于使用像素块而带来的重复存储和计算卷积的问题。

缺点:

1:结果不够精细

从上图中来看,进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感.

2:没有考虑像素之间的关系,缺乏空间一致性.

5:展望

FCN虽然有一些缺点,但是我们更应该关注他的优点,关注他启发性的思路,通过像素与像素之间的关系来去将图像进行分割,比如有一些学者采用了FCN+CRF的结合,这都是一些大胆的创新,值得我们学习.

引用资料:

1:FCN学习笔记 https://zhuanlan.zhihu.com/p/34453588

2:什么是 end-to-end 神经网络https://www.zhihu.com/question/51435499

推荐阅读更多精彩内容