语义分割—对FCN、U-Net、SegNet的一点理解

语义分割—对FCN、U-Net、SegNet的一点理解

最近在看语义分割的论文,有很多高级的方法,今天再回味了一下语义分割元老级的一些方法,在这里只写大概的理解,详细内容还是建议看论文

FCN

FCN是元老,提出了全卷积网络,将原本网络顶层的全连接结构用卷积结构代替。这样就将原本输出的一维向量改为二维特征图的形式,保存了二维信息。实现语义分割还需将特征图上采样到与原图对应的size,这里问题就出现了。

FCN-8s:为了解决FCN直接上采样的问题,FCN-32s、-16s、-8s采用反卷积的方法,一步步对特征图进行上采样,并且借鉴特征提取部分相应尺度的特征图(这里的借鉴操作为:特征图copy过来、与刚刚进行过deconv的特征图进行对应像素add
语义分割—对FCN、U-Net、SegNet的一点理解_第1张图片
FCN-32s:deconv(featureMap16_16, stride=32) --> output: 512_512
语义分割—对FCN、U-Net、SegNet的一点理解_第2张图片
FCN-16s:temp = add(deconv(featureMap16_16, stride=2),pool4)
deconv(16s:temp, stride=16) --> output: 512_512语义分割—对FCN、U-Net、SegNet的一点理解_第3张图片
FCN-8s:
temp1 = add(deconv(featureMap16_16, stride=2),pool4)
temp2=add(deconv(temp1, stride=2), pool3)
deconv(temp, stride=8) --> output: 512_512语义分割—对FCN、U-Net、SegNet的一点理解_第4张图片

通过add的方法借鉴了之前特征提取的信息,来给上采样提供更多的辅助信息,8s较32s效果提升很多,但是依然比较模糊,对图像的细节不敏感。

U-Net

U-Net采用图像patches进行训练,部分解决了标注数据不足的问题,
其实容易引起过拟合的,这里不多说了,与FCN的不同在于,同样的目的:给decode上采样更多信息,使其更加锐化,恢复图像细节),这里依然借鉴网络前端特征提取时保存的信息,不同于FCN,U-Net的借鉴方法为(特征concat
语义分割—对FCN、U-Net、SegNet的一点理解_第5张图片
将前层对应尺度特征图与deconv后的相同size特征图进行concat,在通过卷积组合特征,送人下一个deconv层。
所以与FCN其实差不多的,这里的主要区别是借鉴方式

SegNet

语义分割—对FCN、U-Net、SegNet的一点理解_第6张图片
这位语义分割的小元老依然致力于解决上采样中回复信息不足的问题,不同于FCN、U-Net,这里借鉴方式为(pooling indices
因为在pooling时丢失了位置信息,这里在上采样时借鉴之前保存的pooling indices恢复特征值(max values在max pooling)的位置信息。如下图:左边是pooling indices的方法
语义分割—对FCN、U-Net、SegNet的一点理解_第7张图片
这种基于pooling indices的上采样方法更加锐化了边缘,同时存储空间的需求大大减小了,这里借鉴东西是需要内存滴呀(之前FCN要保留特征图,SegNet只保存indices就可以了)

总结:
语义分割主要解决的问题是在前端backbone提取丰富的特征信息的基础上如何恢复原图相应的细节信息,来给每个像素分类。通过FCN、U-net、SegNet的深入理解,也能够帮助我们掌握add、 concat的区别,更重要的是,对于一个问题的解决,我们能够看到解决问题思路的过程(各种解决方案),并且引发我们的思考。

你可能感兴趣的:(语义分割,深度学习,人像分割与Matting)