自动驾驶入门日记-2-图像语义分割

对交通场景的有效认知是自动驾驶中的关键一环,尤其是对道路可行域的识别和检测,对前方车辆行人的识别和轨迹预测,这些行为的预测准确性直接决定了自动驾驶汽车的安全性能,例如几年前一辆特斯拉L2级别的自动驾驶汽车由于将一辆白色大货车误识别为天空,导致车毁人亡的悲剧。同时相比于激光雷达的物体检测,使用RGB图像信息可以完成在雾、雪、沙尘暴等恶劣天气条件下的物体检测并且成本较低。而单纯的物体检测会丢失场景的相对位置信息,因此快速准确的图像语义分割将给自动驾驶对环境的感知带来极大的帮助。

第一篇深度学习语义分割模型--FCN(Fully Convolutional Networks for Semantic Segmentation)

图像语义分割,简单而言就是给定一张图片,对图片上的每一个像素点分类

FC-DenseNet103 模型在 CamVid 数据集上得到了最好的结果

之前的分类网络是将二维图片信息转化为一维类别信息进行输出,输出信息是类别信息(分类任务)或者坐标信息(识别任务)。而图像语义分割广义上将讲就是对图片中的每个像素进行分类,不同例如讲上图中的道路规定为类别1,车辆为类别2等等,然后对每个像素进行相应标记就可以啦。这样一来,以前的分类和检测的网络结构就不适合做语义分割任务啦,因为语义分割任务输出结果是二维信息,因此原文作者将以前网络结构中的全连接层替换为全卷积层,这样输出结果就变成了二维的了。


原论文中的网络结构示意图

但是单纯的将全连接层替换为卷积层会由于之前的池化操作导致分辨率降低的问题,为了将分割图像变得和原图像一样大,作者提出了一种叫做上采样或者反卷积(Deconvolution)的操作,如图。


反卷积操作

但是反卷积是个一对多的操作,因此如何进行反卷积操作也是需要解决的问题之一,后续将会介绍相关解决方案。

可是还有一个问题,池化操作为了减少计算量以及调高网络稳定性而牺牲了一些底层信息(纹理信息),因此卷积层越多,损失信息越多,直接对网络最后一层进行反卷积操作得到的分割结果十分粗糙,因此为了利用更多的底层信息,作者设计了跳跃结构(Skip Layer)对不同池化层进行上采样,结果如下。


跳跃结构


不同上采样结构得到的结果

本篇论文为深度学习应用于语义分割的开山之作,是CVPR2015的Best Paper,理论上并无较大的创新,但是工程实现上还是有很多值得学习的地方,因此下面简单结合代Github码进行一下论文复现。

代码使用来自于Marvin Teichmann在Github上分享的代码,代码基于Tensorflow框架,数据使用Kitti的驾驶数据集,具体代码和使用可以浏览Github相关页面,作者介绍的很详细。P.s原论文作者公布的代码。

实现过程里的注意细节:

根据图像语义分割(1)- FCN描述,在具体实现过程中有两个细节需要注意。

1.第一个卷积层添加pad=100

论文作者给出的Caffe代码里第一个卷积层添加了100个像素的边界,原因是FC6的卷积输出为h6=(h5−7)/1+1=(h−192)/2^5,所以图片长款要大于192,但该操作引入了许多噪声,因此当图片尺寸不是很小的时候不必进行该操作。


代码片段

2.反卷积层如何与crop层配合获得原图尺寸


 decovolution+crop获得原图尺寸

根据卷积的尺寸计算公式

I′h=(Ih−kh+2∗pad)/stride+1

反卷积公式很容易推得

Ih=(I′h−1)∗stride+kh−2∗pad

据此得到 upscore层的输出为

h7=(h6−1)∗32+64=h+38

这与原图尺寸不一样,因此还需要crop层将多出的38抠掉: 

Caffe的Blob为4D数据(N,C,H,W)(N,C,H,W),因此 axis=2 表示处理数据的 H 和 W 维度;而 offset=19 表示对这两个维度两边都跳过19做crop(padding的反向操作).

FCN的优点(贡献)和不足

优点和贡献

1.为深度学习解决语义分割提供了基本思路,激发了很多优秀的工作

2.输入图像大小没有限制,结构灵活

3.更加高效,节省时间和空间

不足

1.结果不够精细,边界不清晰

2.没有充分考虑到语义间的上下文关系

3.padding操作可能会引入噪声


针对上述不足,后续有许多经典工作出现,以后将一一学习介绍。

祝好!愿与诸君一起进步。

你可能感兴趣的:(自动驾驶入门日记-2-图像语义分割)