利用深度学习进行语义分割学习笔记

语义分割的目标是自动从一张图像中分割出前景,并识别前景的类别,如下图所示。利用深度学习进行语义分割的开山之作Fully Convolutional Networks for Semantic Segmentation提出用1×1的卷积层代替全连接层,使图像的几何信息得以保留,这样一来,就可以逐个像素地构建loss。这一方法简称FCN。后来,Deeplab系列方法(DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs)又再FCN的基础上,提出了利用atrous convolution扩大卷积核的感受野,用FCN进行粗提取,用CRF(条件随机场)进行精修,取得了很好的效果。

FCN模型解读

语义分割的任务相当于将图像中的每个像素划分到对应的类别中。为了实现这一点,网络结构上,最后的传统的全连接层就肯定不能再用了,因为全连接层完全打乱了像素的二维结构。取而代之的是1×1的卷积层。conv 1×1的作用我的另一篇博文中有讲(CNN中1×1卷积核的作用)。举个例子,如果conv 1×1卷积层的输入是1×14×14×1000(即batch size = 1, 特征图长宽都是14,通道数是1000),输出是(1×14×14×10),那么conv 1×1就相当于对这1000个特征通道进行线性组合,产生10个通道的特征图。从另一个角度看,我们着重观察特征图中的一个像素点,比如左上角的那个像素点,坐标(0,0)。由于输入特征图有1000个通道,因此在坐标(0,0)处有1000个特征。经过conv 1×1,相当于对这1000个特征构建了一个输入是1000,输出是10的全连接层。而类似的,输入特征图上每个像素点都经过了一个1000×10的全连接层,得到了10维的输出。这么一来,即实现了特征融合,也没有破坏特征图的二维结构。

训练网络最关键的一步就是loss的构建。自然而然的,我们可以这样构建loss。假设网络最后一层的输出尺寸是(h×w×classnum)。首先将图像的每个像素点进行标记,得到标记图。然后将标记图像resize到(h×w)大小,并根据标记生成one-hot形式的标签(现在标签图的shape是h×w×classnum),最后逐个像素点进行比对,利用softmax交叉熵或其它的loss函数,就可以构建网络的loss。

一般在网络前向传播的过程中,特征图的尺寸是会越来越小的。FCN解决这一问题的方式比较简单粗暴,直接用卷积转置把特征图还原到原来的尺寸。FCN的loss就是用还原尺寸后的图像与label图像产生的。当然如果直接对最后一层进行卷积转置,会丢失很多多尺度信息。因此FCN采用了以下结构。做了3步卷积转置升采样,每一步都会加入前面特征提取阶段pool层的输出特征。这么一来在一定程度上保留了多尺度信息。升采样过程也更加循序渐进。

发表评论

电子邮件地址不会被公开。 必填项已用*标注