欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

分段论文摘要:deeplab-v2;FCN-XS;基于 resnet 的 FCN

最编程 2024-04-09 17:13:20
...

1. Fully Convolutional Neural Nets

论文:Fully Convolutional Networks for Semantic Segmentation, Jonathan Long
提出了一种end-to-end的segmentation网络结构,并且由于全卷积神经网络自身的一定程度上不受空间位置及尺度的影响的特性,可以实现任意大小的输入。

1.1 从fully connected到fully convolution

Transforming

上图的上半部分是经典的AlexNet的分类网络结构(或者说是一半的AlexNet),最后三层都是全连接层,最后输出1000分类的结果,从结果看出是猫的概率最大。下图是Long的FCN结构,前面五层没有任何区别。为了保证转换过程参数个数没有变化,用一个和输入一样大小的卷积核,对于一个7×7*512的conv(第五层,这里用512是因为图里的256只是AlexNet的一半)输出,为了转换为4096×1×1,用4096个filter,每个filter为512组,每组大小7×7,也就是说filter大小为512×7×7。

1.2 学习upsampling - Deconvolution

Deconvolution1
Deconvolution2

Deconvolution的过程更像是一个input变为权重,filter才是组成图片的主体。初始化的时候可以初始化为双线性插值的效果,计算过程就如同convolution的误差反向传播一样。

1.3 结合high resolution层来refine结果


得到的结果与pool3或者pool4层结合(pool层需要先用1×1 convolution来得到pixel predication)。FCN-8s就是利用了pool3层的,(原始输出结果本身是stride=32,也就是FCN-32s),pool3等价于融入了stride为8的结果,再做upsampling还原为原图大小,称为FCN-8s。从结果可以看出,这样的输出是最为精细的。

2. Dilated Convolution

论文:DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs, Liang-Chieh Chen
这里不讨论CRF的用法,只说这篇文章提出的Dilated Convolution,一种更为简单粗暴的做法,在segmentation任务重起到不小的作用。

Dilated Convolution也可以叫做atrous convolution,是从信号处理中借鉴到的技术。它的意思是filter本身是有“洞”的:

Paste_Image.png

这种做法避免了直接使用跨度很大的upsampling,在网络原有参数不变的情况下,可以提升最后的score map的分辨率,增加每一个单元对应的receptive field的大小。在这篇论文中,还利用了不同rate的atrous convolution,并在最后将数据进行融合。

3. Resnet based FCN

论文:Wider or Deeper: Revisiting the ResNet Model for Visual Recognition, Zifeng Wu

了解了以上背景,再读这篇文章就明白许多。Resnet的利用使得网络可以变的更深,从一定程度上解决了degradation,不过本文作者又提出了一种关于网络的有效深度的概念,并通过一些短小的例子和计算指出Resnet是一种物理结构远深于有效深度的网络,故而考虑wider也许是一个不错的选择。

网络结构

每一个Block都是由两组Resnet结构的小block组成(filter大小为3×3),每一个小block中会有一个identity map,在含有down sample的小block中,identity map也要做相应的stride不为1的conv。B6/B7采用的结构是如同花瓶一样的bottleneck结构。

绿色三角代表down sampling,但是在segmentation任务中这些down sampling,无论是以stride不为1的convolution形式,还是以pooling形式都会去掉。对于pixel classification的任务来说,应该尽量避免用pooling层过多,因为pooling对空间变化不敏感,会使得要求对pixel进行精细化分类时造成一定的影响。同时,down sampling影响最后的输出分辨率,但是为了能保持receptive field足够大,所以会在segmentation的B6,B7中加入dilation来弥补取消了down sampling的影响。当然中间block内部的down sampling是一定会存在的,输出结果一般来讲是输入的8分之一,16分之一或者32分之一,在前面几层block的第一部分都会有stride为2的conv层存在。

除此之外,还有一个用来提升accuracy的trick,是用低分辨率的输出来组成一个较高分辨率的输出。这个trick不止用在test阶段,也用在train阶段,比如我们实际训练输出的是stride为8的输出(大小为8分之一),但是经过2×2轮,我们用这四个输出结果组成了4分之一的输出。参考论文:High-performance Semantic Segmentation Using Very Deep Fully Convolutional Networks

训练时我们可以为了内存的限制和运算效率以及考虑数据量这些考量,选择crop和resize图片,比如在cityscapes中图片大小(2048, 1024),但是实际crop出一个(504, 504)大小的图来输入网络训练。最后test阶段,可以直接输入原图,一样可以得到训练阶段的正确率效果,这是因为Fully Convolution结构的好处。