CV | SCNN: Spatial CNN for Traffic Lane Detection 车道线检测算法SCNN“最全的”学习笔记

 

题外话:

可能因为是节假日,所以这篇文章的标题非常的标题党哈哈哈哈哈~ 回归严肃,过去一段时间花了比较多的精力学习这个算法,所以想借此空闲时间,好好总结和复盘一下。感兴趣的朋友们,欢迎评论区讨论,如果有理解不对的地方也欢迎大家指正。

 

前言

车道线检测在自动驾驶感知任务中占据重要的一席,它可以辅助自动驾驶的车道保持,同时也可以为车辆定位等工作提供较强的先验信息。目前,常见的方法大抵是基于路面的语义分割(如:FCN等)对车辆相机捕捉的画面可视范围中的车道线,进行分类及分割检测,以辅助实现车辆自动驾驶的车道保持等功能。而SCNN的创新点同时也是值得学习的地方是,它清晰定义了车道线算法需要处理的车道线范围(至多检测四条车道线),同时将交通规则融入数据标注中,也较好地规避了路面遮挡等情况对车道线检测的负面影响。当然它也存在一些弊端,比如使用的切片处理(文中后续会详细解释)在落地方面较难优化,特殊的语义定义有些待处理的弊端。下面我会基于2017年在AAAI上发表的这篇论文 Spatial As Deep: Spatial CNN for Traffic Scene Understanding 进行算法的介绍。本文由港中文的在读博士xingang大大提出,作者人非常nice,大家有疑惑可以去github上留言邮件。

 

1. 摘要

CNN模型在语义分割上展现出了强大的潜力,但它对于图像的行间、列间的空间处理能力还有待发掘。这类空间关系对于有显著的形状和空间约束、并且表观特征比较单一的检测目标非常重要。车道线检测正好符合以上的目标约束,如下图(a)所示。以此为入口,作者提出了SCNN,该算法对feature进行切片处理再进行逐层卷积,使得特征可以按行或按列方向有效地传递。SCNN的这个特点使得其对长条形的检测目标很有优势,如下图中(a)和(b)所示,该算法较CNN模型而言可以在遮挡及路面磨损的情况下获得较好的结果,在语义分割任务中,对长条形的路杆同样可以处理的更好。

CV | SCNN: Spatial CNN for Traffic Lane Detection 车道线检测算法SCNN“最全的”学习笔记

 

2. 背景介绍及研究现状

近年来,自动驾驶在学术上和工业界里都获得了大量的关注。自动驾驶系统中一个重要的任务是理解道路场景,包括车道线检测、语义分割等等。车道线检测算法可以辅助自动驾驶车辆自动行驶,并且已经被应用到车辆驾驶辅助系统中。与通用的语义分割不同的是,车道线检测任务中我们面临的问题是,车道线具有较强的结构特征,如上图中(a)所示,车道线通常呈放射相邻状;如图(a)所示,车道线通常会被遮挡,按照传统的语义分割算法的处理模式,只处理可见区域的车道线,遮挡的部分不能被检测,在道路状况相对拥挤的情况下,检测性能定会大大降低。

为了较好地解决遮挡问题导致的精度下降,作者提出了SCNN算法。在SCNN中,比较核心的创新点在于作者提出对backbone网络输出的特征矩阵进行切片处理,并且对其进行逐行或逐列方向上的一维卷积操作。这个设计有利于传递细长形的目标特征,如车道线或路杆等。而且,这个切片设计可以很好地解决遮挡问题,如上图(a)所示,尽管车道线会被部分遮挡,只要有可见的部分,SCNN都可以较好地将车道线整条地预测出来。

下面介绍一下研究现状。在深度学习普及前,大部分的车道线检测算法都是基于人为设计的特征处理的,对很多复杂的场景处理的都不太好。Huval等人在2015年将深度学习和车道线检测结合在一起,不过仅基于一个不太大的数据集。然而,深度学习在语义分割方向的应用近年来取得了很大的进展。在挖掘神经网络的空间特征方面,也有人尝试使用RNN将每行或每列的特征传递,然而仅限于同行或同列的信息传递。Liang等人也提出使用LSTM来进行语义分割,但是这类方法的计算代价较大。在语义分割方面,研究者们也倾向于将CNN和CRF或MRF进行结合,我的个人感觉是传统方法的延续性做法。

分析了这么多研究现状后,说一下SCNN的三个主要优点。

1)相比使用传统的MRF/CRF做后处理,SCNN在空间特征的捕捉上更有效。

2)从训练的角度分析,SCNN中的切片处理将特征信息以叠加的方式进行传递(参见ResNet,原文用的是residual这个词),因而更容易训练和收敛。

3)SCNN这种特殊的结构很灵活,可以应用到其他的深度学习任务中。

 

3. 方法SCNN

3.1 车道线检测数据集CULane

前言中提到过,SCNN相较于其他的车道线检测算法的优点在于将检测范围清晰定义,至多只会检测当前道路的四条车道线。如下图(a)所示,SCNN的输出为左二线、左一线、右一线和右二线,分别对应为蓝色、绿色、红色和黄色标注的线。并且,前言中也提到,SCNN将待检测的四条车道线与交通规则结合。这两个特点主要体现在本文release的CULane数据集。该数据集包含了超过8万张图,涵盖常见场景(Normal)、拥挤场景、夜晚场景等9个场景的数据,各个场景所占比例如图(b)所示。

CV | SCNN: Spatial CNN for Traffic Lane Detection 车道线检测算法SCNN“最全的”学习笔记
图 3-1 数据集采样图及各场景比例图

 

CULane数据集中,每帧数据都包含需要检测的车道线的标注值及每条车道线对应的标签(左二线、左一线、右一线和右二线)。之前提到的SCNN的两个优点,一个是遮挡方面的问题,数据的标注规则中将遮挡的车道线预测标注,如上图(a)所示,这样使得SCNN在处理遮挡的数据时,仍可以较好地预测出遮挡的车道线部分。另一方面,标注规则将交通规则融合,如Y形线或人行横道处,车道线对应停止标注。

 

3.2 Spatial CNN

传统的分割方法通常会使用CRF/MRF来对其分割结果进行后处理。然而,这样的两段式后处理pipeline不是很有利于在抽取特征阶段就挖掘和利用图像的空间特征。而作者提出的SCNN可以更好更有效地学习到车道线的空间信息,是一个端到端的方法。下图为SCNN的整体流程示意图。

CV | SCNN: Spatial CNN for Traffic Lane Detection 车道线检测算法SCNN“最全的”学习笔记
图 3-2 (a)传统的CNN+CRF算法框架(b)SCNN算法框架

 

下面具体给出SCNN的特殊切片设计。如图3-2所示,我们就SCNN_D部分进行具体解释。在backbone基础网络处理后,我们得到的特征矩阵为C*H*W,其中C、H和W对应着特征矩阵的channel(通道)、height(高度)、width(宽度)。在SCNN_D处理环节中,我们将这个特征矩阵按行切片,即得到H个特征切片,如图中所示。第一片特征经一维的卷积操作后,从上向下叠加传递,类似于ResNet的处理方式,第二片特征加上第一片特征的卷积输出后,进行一维卷积操作,以此向下传递,直到最后一片特征处理完毕。该特征矩阵传递到下一个处理模块SCNN_U。SCNN_D表示从上向下处理,SCNN_U代表从下向上,SCNN_R则表示从左向右,SCNN_L表示从右向左。

CV | SCNN: Spatial CNN for Traffic Lane Detection 车道线检测算法SCNN“最全的”学习笔记

切片的处理过程公式化如上所示。经过四个SCNN模块处理后,特征矩阵(C*H*W)经过再一次卷积操作,输出为n个通道的分割结果。由于backbone中对原图有下采样操作,最后进行像素级别的损失函数计算前,作者对图像进行了对应倍数的上采样放大操作。以上为SCNN的整体流程介绍,是不是清晰明确 ^________________________^

 

4. 实验

SCNN的实验主要在CULane数据集和Cityscapes上进行。训练技巧上,作者使用标准的SGD,batch size为12,0.01的初始化学习率等。更多的训练细节请参考原文。

 

4.1 模型的推断和输出

车道线检测任务的输出通常对接精确的曲线拟合。如图4-1所示,SCNN模型的输出为4个分割mask,分别对应左二线、左一线、右一线和右二线的标签。另一方面,SCNN还会输出一个1*4的一维向量,以指示是否存在对应类别车道线,如[0, 1, 1, 1],则说明该输入的图像中只包含左一线、右一线和右二线,左二线的存在标签为0则意味着不存在左二线。根据该一维向量,作者对SCNN的输出mask进行处理,最后用三次样条曲线来拟合最终的车道线曲线。

CV | SCNN: Spatial CNN for Traffic Lane Detection 车道线检测算法SCNN“最全的”学习笔记
图 4-1 (a)训练模型的结构图 (b)车道线预测的流程示意图

 

4.2 模型评估

为判断每条车道线是否被正确检测,作者将每条车道线视为30像素宽的线状前景。评估过程中,计算预测结果mask和真值mask之间的交并比(IoU)。当交并比超过设定的阈值时,则判断为检测正确。实验中,作者使用了0.3和0.5作为评估阈值。如图4-2所示,正确的车道线标注为蓝色,错误检测的车道线标注为红色。除此之外,作者还使用了F-measure来评估算法的鲁棒性,具体定义感兴趣的大家可以看下原文。

CV | SCNN: Spatial CNN for Traffic Lane Detection 车道线检测算法SCNN“最全的”学习笔记
图 4-2 基于IoU的评估过程 绿线表示真值,蓝线表示正确的预测结果,红线表示错误的预测结果

 

4.3 实验设计

1)多方向SCNN模块的有效性

本实验主要针对SCNN的四个方向模块的有效性进行验证。如表4-1所示,作者对比了纯基础网络、基础网络+额外的一个卷积层、仅包含SCNN_D模块、仅包含SCNN_DU模块、以及全部的SCNN_DULR模块模型的性能。

CV | SCNN: Spatial CNN for Traffic Lane Detection 车道线检测算法SCNN“最全的”学习笔记
表 4-1

 

2)一维卷积kernel width核尺寸性能对比

本实验主要针对切片模块中,对每个切片进行一维卷积的核尺寸对实验性能的影响。表4-2为不同核尺寸的一维卷积得到的SCNN模型的性能结果,可以看到的是w=9时的性能最佳。

CV | SCNN: Spatial CNN for Traffic Lane Detection 车道线检测算法SCNN“最全的”学习笔记
表 4-2

 

3)SCNN操作位置的性能对比

本实验的设计旨在验证在pipeline的不同位置进行SCNN模块操作的性能对比。表4-3中所示,实验分别将SCNN放置在输出模块和最后的隐层位置进行训练,实验结果表明放在最后的隐层时SCNN的处理效果更佳。

CV | SCNN: Spatial CNN for Traffic Lane Detection 车道线检测算法SCNN“最全的”学习笔记
表 4-3

 

4)串行和并行SCNN的性能对比

本实验旨在验证SCNN的多个方向模块串行和并行处理的性能区别。表4-4所示,串行的SCNN模块会取得更优的性能。

CV | SCNN: Spatial CNN for Traffic Lane Detection 车道线检测算法SCNN“最全的”学习笔记
表 4-4

 

5)与现有state-of-the-art算法性能对比

为验证SCNN的有效性,作者在本实验中将SCNN与几个现有的算法进行比较。表4-5和图4-1所示为实验结果,综合起来,SCNN的性能最佳。

CV | SCNN: Spatial CNN for Traffic Lane Detection 车道线检测算法SCNN“最全的”学习笔记
图 4-1 SCNN与多种现有算法的实验结果对比
CV | SCNN: Spatial CNN for Traffic Lane Detection 车道线检测算法SCNN“最全的”学习笔记
表 4-5

 

6)时间效率对比

本实验旨在验证SCNN的时间效率优势,性能对比如表4-6所示,其中CPU和GPU的硬件版本见表下小字。

CV | SCNN: Spatial CNN for Traffic Lane Detection 车道线检测算法SCNN“最全的”学习笔记
表 4-6

 

7)cityscapes数据库的实验

为验证SCNN的通用性,作者将其应用到cityscapes数据集上进行语义分割实验。如表4-7所示,SCNN在细长型的目标处理任务中,例如:杆,会取得更好的结果。

CV | SCNN: Spatial CNN for Traffic Lane Detection 车道线检测算法SCNN“最全的”学习笔记
表 4-7
CV | SCNN: Spatial CNN for Traffic Lane Detection 车道线检测算法SCNN“最全的”学习笔记
图 4-2 SCNN在cityscapes上的预测结果

如图4-2中所示,作者将LargeFOV和LargeFOV+SCNN模型的检测结果进行对比。SCNN的细长型优势也可以从图中观察到。

 

5. 结论

SCNN算法的特殊切片设计使得其对细长型的分割目标具有更好的空间关系学习能力,也可以更好的处理路面遮挡、磨损等情况。总体说来,SCNN在车道线检测领域方向上,开辟了一种新的思路,很值得学习和借鉴。另外,作者的git repo给的非常完备,源代码使用lua torch实现,还给了caffe的SCNN生成程序,真的非常贴心了。欢迎大家各种讨论~

 

 

最后,愿大家春天快乐,假期好好休息,充满电,努力向前~!

PS 感觉近几年总是会有些着急,不过最近看到的一个复利原理让我突然可以安心下来。里面提到,人的技能也好、人脉也罢,都需要长时间的积累,即量变。量变积累过程缓慢匀速,可能会让我们丧失相信某种“可能”的信念。这个时候要坚持住,要足够耐心,要保留体力,保持积累,等待拐点的到来。当量变到质变开始转变,也就是拐点出现,人的收获才开始出现起色。而这个拐点,通常发生在40岁左右,看到这个数据的时候,内心就平静了很多,踏实慢慢的积累吧。耐心一些~