本文为AI研习社编译的技术博客,原标题 Road scene understanding using Deep Learning,作者为 Bogdan Djukic。 翻译 | 王祎 校对 | 陶玉龙 整理 |余杭
将语义分割的最终输出应用到道路识别场景中
语义分割是深度学习的方法之一,通过语义分割,我们可以对图片中的每一个像素赋予含义,即将像素划分到一个预先设定的类中。从上边的 GIF 图可以看出,我们在语义切分的过程中将像素分为两类(分别是道路和非道路),其中我们将识别为道路的部分标上了颜色。
通过语义分割的方法,我们可以根据特定的需求来将场景进行切分。通过这一点,汽车可以识别出当前场景下哪一块是可行驶区域,这一点对无人驾驶汽车来说尤为重要。
语义分割的方法之一就是使用全卷积网络(FCN),一篇来自于伯克利大学的论文很好地阐释了其原理和架构。我们接下来的实现就会基于这篇论文来展开。
传统的卷积网络是由卷积层和几个全连接层组合而成的。这类架构对于分类问题来说很有用(诸如:这是一条路吗?),但是对于需要在图片中定位道路这种问题(诸如:路在哪里?),我们就需要一个新的网络来维护这些特殊信息。这就是 FCN 产生的由来,也向人们传达了语义分割最先进的成果。
要构建 FCN,有以下三个要点:
接下来让我们详细地看看应该如何实现上述步骤。
我们的FCN架构包含两个部分:编码器和解码器
FCN 架构
对于编码器的构建,我们利用已在 ImageNet 数据集上预训练的 VGG16 模型进行编码,我们将 VGG16 模型上的全连接层全部用卷积来替代。编码器将图片中的特征抽取出来,并且把它应用在解码器中。
构建完编码器后,下一步就是构建解码器,解码器是通过转置卷积层,对编码器末层进行上采样来实现的。卷积转置本质上来说就是反向卷积
FCN架构是由预训练模型、全连接层替换和卷积转置构成的架构
在最后,我们会在某些特定的层之间添加跳跃层,其中这些特定层需要能够允许网络使用不同的像素大小。跳跃层在降低信息流失的同时也保证了网络可以很好地纵观整个图片。由于传统的卷积网络往往会聚焦于图片中的某一部分,因此添加跳跃层能够很好地提升切分效果。
FCN 中的跳跃连接
由于跳跃层的添加可能会极大地影响到模型的大小,因此添加的时候要谨慎一点。
利用 FCN 进行道路理解被作为 Udacity Self Driving nano degree program 项目的一部分而得以实现。其中我使用 Python 和 TensorFlow 构建并训练了模型。我的模型训练是在 NVIDIA 1080Ti 上进行的,训练 30 遍花了不到 1 个小时的时间。输出如下图:
相关代码可以参见我的 GitHub 主页:
bdjukic/CarND-Semantic-Segmentation Contribute to CarND-Semantic-Segmentation development by creating an account on GitHub.github.com
原文链接:
https://towardsdatascience.com/road-scene-understating-using-deep-learning-c3610f6b1c4