视频语义分割----Fully Convolutional Networks for semantic Segmentation(2015)
这是我接触视频语义分割看的第一篇论文,它是2015年得一篇论文,虽然年代有点久远,但我认为作为慢慢了解计算机视觉以及视频语义分割,还是有一定价值,虽然之前有过一些基本的深度学习基础,但看起来仍有没理解透得地方。
摘要总结
这篇论文主要讲述了作者搭建了一个全卷积网络,输入任意尺寸的图像,经过有效推理和学习得到了相同尺寸的输出,在端到端、像素到像素的训练方式下的卷积网络超过了现有语义分割方向的最先进技术。
Instruction
传统的基于CNN的分割方法-----基于图像块的分割(每个像素被标记为它所在的区域patch的类别),这种方法是存在缺点的(它们没有做到端到端,最后的输出也不是图像)
图1 全卷积网络能有效学习对每个像素做出dense prediction ,比如语义分割
而作者是第一个进行端到端训练FCN工作,同时在工作中(1)使用像素级的预测;(2)使用预训练模型。通过最后的上采样层进行预测,通过前面的下采样层进行特征学习。
语义分割问题中存在着全局信息和局部信息的矛盾,文章设计了一种跳跃连接结构来解决这个问题。
Related
主要是介绍了一下前人的工作,与前人方法不同的点在于:作者适应和扩展深度分类架构,使用图像分类作为监督预训练,和从全部图像的输入和ground truths(用于有监督训练的训练集的分类准确性)通过全卷积微调进行简单且高效的学习。
Fully convolutional networks
3.1 Adapting classifiers for dense prediction
图2 全连接转卷积
以往的分类网络中(1)输入图像大小是固定的,因为网络中有全连接层的话,大小必须是固定的;(2)产生非空间性的输出,丢弃了空间信息。
而在FCN中,采用全卷积来代替全连接层则可以解决以往分类网络中的问题。那么如何将全卷积转为全连接呢?有如下例子:AlexNet卷积化的过程,假设执行特征提取的卷积层的最后一层输出为256×7×7,得到后面的4096个神经元;那么改为用7×7的卷积核对该256×7×7的输出特征图做卷积,也可以获得4096×1×1的向量。由于卷积核大小和输入的特征图尺寸相同,就保证了转换后的卷积层的运算结果和之前的全连接层是一样的。
3.2. Shift-and-stitch is filter rarefaction
这个地方有点没看明白,所以直接从知乎Shift and stitch理解 - 知乎 (zhihu.com)才理解清楚,现复制一下这位大佬对shift-and-stich方法的解释
在Semantic Segmentation中,由于CNN网络的下采样,使得输出是coarse的,要想得到 pixel级别的dense prediction,其中一种方法是shift and stitch,介绍如下。
假设降采样因子为s
,那么output map(这里为了简单起见,仅考虑二维)的spatial size则是 input的 1/s
, 平移 input map, 向左或向上(向右向下情况一样),偏移量为(x,y)
, 其中,x,y∈{0,1,…,s-1}。
这样就得到 s^2 个 inputs,通过网络前向传播自然得到 s^2 个outputs,将outputs 交织成与origin input 大小相同的output map,就实现了pixel级别的dense prediction。
设网络只有一层 2x2 的maxpooling
层且 stride = 2
,所以下采样因子 为2, 我们需要对input image
的 pixels
平移 (x,y)
个单位,即将 image
向左平移 x
个pixels
, 再向上平移y
个单位,整幅图像表现向左上方向平移,空出来的右下角就以0
padding
。我们当然可以采取 FCN
论文中的做法,将图像向右下角平移,空出来的左上角用 0 padding
,这两种做法产生的结果是一致的,没有本质区别。(x,y)
取(0
,0
), (0
,1
),(1
,0
),(1
,1
) 后,就产生了 s^2=4 个input
,不妨记为: shifted input (0,0)
、shifted input (0,1)
,shifted input (1,0)
,shifted input (1,1)
(图中的数字表示像素值,不是索引值 ).
4
个input
分别进行 2x2 的maxpooling
操作后,共产生了4
个output
,
最后,stitch the 4 different output
获得`dense prediction,
3.3. Upsampling is backwards strided convolution
主要讲述了上采样方法,常用的上采样有:(1)插值:双线性插值(2)转置卷积(3)反池化。这篇文章采用了双线性插值初始化转置卷积。
下面参考相关博文简单理解一下双线性插值和转置卷积这两种上采样方法:
(1)双线性插值
双线性插值是插值算法中的一种,是线性插值的扩展。利用原图像中目标点四周的四个真实存在的像素值来共同决定目标图中的一个像素值,其核心思想是在两个方向分别进行一次线性插值。
(2)转置卷积
考虑正常的卷积过程,对于一个 4x4的输入图像,用3x3卷积核,padding=0,stride=1,进行卷积,能得到2x2的输出图像。把输入及输出分别展开成为一维向量,记为 i 及 o 。则卷积可以看做是矩阵运算 o=Ci ,其中 C 的表达式如下:
注:1.转置卷积就是将卷积转置了一下,然后与输入相乘,可以得到更大的输入,实际上无论卷积还是转置卷积都是将滤波器先转为topliz矩阵,再与reshape后的输入相乘,具体转置卷积的实现是对input加pad实现的,具体可以自己画图看看
2.转置卷积并不是真正的反卷积,而是只是把input的size变大了而已,
3.双线性插值与转置卷积的联系是,在fcn中双线性插值可以用转置卷积实现,也不能说实现,可以模拟出双线性插值的功能,因为转置卷积真正的实现需要0pad嘛
3.4. Patchwise training is loss sampling
**Patchwise training:**预测一个像素点的分类,需要输入一个n*n的patch(附带周围的一些像素),喂给分类网络,以这个patch的分类结果作为中心的像素点的分类。
作者认为补丁训练就是损失采样,但没有发现它可以为密集预测带来更快或更好的收敛。
4. Segmentation Architecture
主要讲解了文章算法的设计细节。
4.1. From classififier to dense FCN
主要讲述了作者对分类网络的选择,具体的操作以及增加数据集进行训练。
4.2. Combining what and where
这个图展示了作者通过添加将最终预测层与具有更精细步长的较低层相结合的链接来解决输出粗糙的问题。将线形拓扑转变为 DAG,其边缘从较低层向前跳到较高层,由于他们看到的像素更少,更精细的尺度预测应该需要更少的层,因此从更浅的网络输出中制作它们是有意义的。结合精细层和粗略层可以让模型做出尊重全局结构的局部预测。作者分别试验了三种不同的跳跃连接结构,以下是其效果图:
可以看出FCN-8s的效果最好。
4.3. Experimental framework
主要讲述了实验的一些细节,配置参数之类的。
5. Results
主要讲述了实验结果与评价指标。
6. Conclusion
全卷积网络是一类丰富的模型,现代分类卷积网络是其中的一个特例。认识到这一点,将这些分类网络扩展到分割,并通过多分辨率层组合改进架构,可以显着提高最先进的水平,同时简化和加速学习和推理。
参考资料:
1.https://blog.csdn.net/weixin_44501699/article/details/116494329
2.https://zhuanlan.zhihu.com/p/56035377
3.https://zhuanlan.zhihu.com/p/439429095
4.https://blog.csdn.net/zxyhhjs2017/article/details/85049312
anlan.zhihu.com/p/56035377