SegNet-----论文分析(个人理解)
1. 概述: SegNet之前,语义分割的许多方法都是直接采用设计图像分类的方法去解决,虽然有时获得的结果还说得过去,但总体来说比较粗糙。其实很容易理解为什么,在图像分类的过程中,我们都是将特征图进行多次卷积与max pooling,并进行展开为全连接层,最终依赖softmax等函数进行概率的计算,在此过程中,图像经过一系列下采样早已经失去了边界信息,边界信息的丢失对于图像分类没有什么影响,但是图像分割就不一样了,它需要根据边界来细致的将某个物体分割出来。基于这个大背景下,又借鉴了FCN与U-Net结构,作者提出了SegNet。 2. 总体分析 SegNet是一种全新的深度全卷积神经网络(其实很简单),它的整个组成为编码器网络、解码器网络以及一个softmax分类层,但此处的softmax是针对每个像素都进行计算,具体网络细节接下来说。该网络的创新之处就在于在每一次下采样时都将最大池化的位置记了下来,上采样时再直接怼回去,其余补0。这些操作,也的确让SegNet网络取得了较为不错的结果。 3. 网络结构分析 OK,网络结构分析,先上图: 流程:输入图像-----编码器网络------解码器网络-------softmax分类------输出分割图像
编码器网络:由13个卷积层组成,并且这13个卷积层对应着VGG16网络的前13个卷积层(作者原论文里这样写的),每个编码器都会与卷积核进行卷积产生一个feature map,然后对feature map进行批规范化和ReLU的非线性变换,这些反映在图中就对应蓝色的块。在这之后,会有一个2*2大小且stride = 2 的滑动窗口来进行max pooling。
多次的下采样可以实现更多的平移不变性,以及实现更加鲁棒的分类,但同时也会降低feature map的分辨率,越来越多的边界信息丢失不利用进行轮廓的分割,因此迫切需要解决,因此提出将最大池化索存储的方法,详细下面说。
解码器:与编码器网络相对应,也有13个卷积层,每一次卷积后也有一个批规范化与ReLU函数,但与编码器不同,编码器网络的每一层后所接的是一个unsampling层。
unsampling层详解:这一块其实弄清楚两个问题就行: 1.SegNet为何要记录最大池化的索引? 答:在每次经过最大池化与下采样之后,会降低特征图的空间分辨率,这样则不利于边界轮廓的分割。所以此时可以通过将所有的特征图都存储下来,但是这样对于内存消耗较大,因此文中提出,只记录最大池化的索引,虽然这样的存储会带来轻微的精度损失,但对低于实际的应用任然是适用的。
2.根据记录的最大索引怎样进行上采样? 答:在之前编码的过程中将做大池化索引的位置都存储了下来,在之后的上采样过程中,将最大池化索引处的值直接填回原处,其余地方补0,这样就能够得到一个较为稀疏的特征图,接下来通过卷积即可得到稠密的特征图。 清楚这两个问题以后,接下来看它的网络结构就很容易理解了—网络结构
在编码器的最后一层是pooling层,此时还是下采样,到这里,编码器的使命就结束了。接下来就是解码的任务了,其实每一层做的都是和编码相反的工作,只不过稍微多了点区别,首先将之前的pooling后的结果按照存储的最大池化所在的下标位置给填回去,填回去以后feature map就变大了,于时就需要在其他地方填0,这时再将得到的feature map与卷积核进行卷积,生成密集的特征图,后将批处理规范化步骤应用于每个映射。
*4. 创新点
- 在encoder部分的最大池化操作时记录了最大值所在位置(索引),然后在 decoder 时通过对应的池化索引实现非线性上采样,这样在上采样阶段就无需学习。上采样后得到的是一个稀疏特征图,再通过普通的卷积得到稠密特征图,再重复上采样。最后再用激活函数得到onehot 分类结果。
- SegNet 主要比较的是 FCN,FCN解码时用反卷积操作来获得特征图,再和对应 encoder 的特征图相加得到输出。SegNet 的优势就在于不用保存整个 encoder 部分的特征图,只需保存池化索引,节省内存空间;第二个是不用反卷积,上采样阶段无需学习,尽管上采样完以后还要卷积学习。
5. 结果* 相比于FCN,SegNet有更少的内存利用率和更高效的计算。 在CamVid上与其他传统方法相比:与使用CRF的方法相比,SegNet具有明显的竞争力。 与其他深层网络相比:SegNet的优势也比较明显。 (个人愚见,不足请指出!谢谢)
|