改进FCN的车道线实例分割检测方法
2022-10-17邓天民蒲龙忠
邓天民,蒲龙忠,万 桥
(重庆交通大学 交通运输学院,重庆 400074)
0 引 言
近年来,随着无人驾驶技术的不断发展,车道线检测作为无人驾驶领域关键的一环也得到了更多学者的关注研究。在实际驾驶场景中,路况复杂多变,车道线线型也多种多样,以至于车道线检测任务难度较大,适用于无人驾驶的车道线检测技术还不够完善。
传统的基于模型的方法利用三次均匀B样条曲线模型结合霍夫变换拟合车道线[1]和使用NMPC的方法实现车道线的跟踪检测[2];基于特征的方法主要通过环境颜色[3]、车道线纹理[4]和车道线几何形状[5]等搭配霍夫变换[6]或滤波[7]的方法来识别、检测车道线,但传统方法因计算量大,在车辆遮挡和地面污损等复杂道路场景下泛化性差,精度低等原因已不适用于自动驾驶,因此,基于深度学习的方法应运而生。He等[8]提出利用前视图区分行驶车道和车辆,利用俯视图区分车道线和箭头等的CNN(convolutional neural networks)模型,效果较好但实时性较差。编解码器体系结构(visual geometry group,VGG)[9]、残差网络(residual network,ResNet)[10]以及全卷积网络(fully convolutional network,FCN)[11]等的提出解决了车道线检测中卷积神经网络会造成空间信息的部分丢失问题;Enet(efficient neural network)[12]通过设置主分支和扩展更快、更有效进行大规模计算以提升车道线检测速度。但大部分基于深度学习的方法检测结果不够准确、检测速度慢,达不到安全性和实时性的要求。
针对以上问题,本文提出将车道线检测问题转换为实例分割问题以识别车道线的方法。首先基于改进FCN神经网络提高车道线信息特征提取能力,得到车道线的像素点图和二值化语义分割图;然后通过聚类算法对车道线像素点进行聚类并形成不同实例;最后通过逆透视变换和最小二乘法对车道线进行拟合,得到拟合后的车道线检测模型。
1 改进FCN的车道线检测方法
全卷积网络(FCN)是一种在不带有全连接层的情况下能进行密集预测的网络[13],它不同于CNN网络通过全连接层得到的特征向量以进行目标分类,FCN在VGG16网络架构基础上将全连接层改变为卷积层,使用上采样操作对末端特征图进行处理,最后得到与输入图像尺寸一致的特征图,从而充分保留原图的空间信息,同时也能提取特征让每个像素得到一个预测值,从而解决了语义级别的图像分割问题。基于FCN网络结构,本文通过网络卷积优化改进和网络分支设计等操作,提出一种基于改进FCN的车道线实例分割检测方法。
1.1 FCN-VGG16网络架构
本文采用FCN-VGG16作为车道线检测的网络主体结构,该网络包含多个编码器层和解码器层,编码器层和解码器层为一一对应关系。
VGG16总共有16层,其中包含13个卷积层和3个全连接层,在输入任意大小图片尺寸后,首先通过两个64卷积核卷积,进行一次池化(max pooling),然后再次经过两次128个卷积核卷积后进行池化操作,再重复两次3个512个卷积核卷积后,再次池化,最后经过三次全连接。其中,VGG16使用了3×3的小型卷积核,是最小的能够捕获上下左右和中心概念的尺寸,足以捕捉到横、竖以及斜对角像素的变化。每层卷积的滑动步长stride=1,padding=1。VGG16的池化核为2×2,stride=2。在编码过程中,通过多个卷积层提取图像特征,增加通道;通过多次池化操作来缩减输入数据的空间维度,增大感受野。部分网络使用大尺寸卷积核来提升感受野,这样对模型来说确实有提升,但增加了模型的参数量,训练时间更久,检测时间也随之加长,而VGG16使用小尺寸卷积核的模型训练时间更短,实时处理能力更强。
FCN在VGG16网络基础上对最后一个卷积层的热点图进行上采样层(up sampling)来还原图像尺寸,进行输出图逐元素叠加作为解码器输出,在逐像素的训练后,对每个像素都产生预测,最后逐像素分类预测显示在上采样后的特征图上,得到语义分割图。基于FCN的图像语义分割算法流程如图1所示。
1.2 网络结构改进
FCN网络能够进行目标分类和语义分割,因此可以对其改进以解决车道线检测问题。本文设计的基于FCN的改进网络为双分支结构网络,用分割的方法解决车道线检测问题。网络直接输出车道线像素以及每个车道线像素对应的ID(类别),进行颜色区分,进而实现车道线检测。网络主要从以下4个方面进行改进:
(1)多分支网络设计。通过叠加嵌入分支和分割分支,可得到两个分支分别输出的预测图,实现端到端训练;
(2)网络压缩。通过对网络结构的压缩,减少不必要的卷积层,加快训练和检测的速度,提高网络的实时性;
(3)卷积核替换。将网络编码结构中最后一层卷积的常规正方形卷积核替换为非对称卷积核,非对称卷积能保证与常规方形卷积的结果等价的同时降低运算量;
(4)激活函数设计。使用FReLU激活函数,更好适用于当前的实例分割检测项目。
改进的FCN网络结构如图2所示。
1.2.1 多分支网络设计
如图2所示,编码阶段第四次最大池化层的输出分别被输入到两个卷积块,进行多任务分支分别用于二值分割(binary segment)和实例分割(instance segment)卷积操作。相对应的,两个编码过后开始两个解码操作,对每一个卷积块的输出进行相应的上采样(使用反卷积上采样),并层层进行输出图逐元素叠加,然后采用DBSCAND聚类方法,将嵌入分支的单个车道线像素点以二值化分割图为基础进行聚类,两分支结合训练和预测,大幅提升模型的预测精度,保证预测结果的准确性。本文将改进后的FCN网络命名为MB-FCN(multitasking branch fully convolutional networks)。
(1)车道线语义分割(segmentation branch)
主要用于获取车道像素的分割结果,即筛选出车道线像素和非车道线像素,将图像像素点分为车道线和背景,并输出一个二值化图像。
由于图像中车道线和背景的像素点分布不均衡问题会出现在训练集的构建中,尤其是在图像中出现车道线被车辆遮挡或者没有清晰车道线时,为提高车道线检测的准确率,训练集会补充被遮挡或不清晰的车道线,采用可较快更新网络参数数值的交叉熵损失函数训练二值化分割模型效果较好,计算交叉熵损失的函数为
(1)
(2)车道线嵌入分割(embedding branch)
车道线嵌入分割部分主要进行实例分割操作,将图像中的车道线像素点划分为不同的车道线实例。该网络解码得到的输出图中每一个像素对应一个N维的向量,在该N维嵌入空间中同一车道线的像素点距离更接近,而不同车道线的像素点的向量距离较大。根据该特点,聚类同属于一车道的特征点,聚类损失函数L由L1和L2组成,其中,L1负责拉近嵌入的同属一车道线的像素点,L2负责分离并推散嵌入的相异车道线的像素点。损失函数L设计如下
(2)
(3)
L=L1+L2
(4)
其中,C代表车道线数量;Nc表示某一车道线的聚类像素点数。μc代表某一车道线像素点的嵌入均值向量值;xi表示某一像素点的嵌入向量;μCA与μCB表示两不同车道线所含的不同像素点 (CA,CB) 的均值向量;δ1、δ2分别为聚类半径和集群聚类距离阈值,均为人为设定; [x]+=max(0,x)。
实验时,为了将像素进行聚类,在上述的实例分割损失函数中设置δ2>6δ1。 本文采用基于密度的空间的聚类算法DBSCAN,将相邻车道区分开来,从而得到独立的单个车道线像素图。DBSCAN可以在具有噪声的数据库中发现任意形状的簇,能够连接密度足够大的相连区域,通过空间数据分布的紧密程度决定聚类情况,直到将所有的车道线像素分配给对应的车道。
1.2.2 网络压缩
卷积网络结构一般比较复杂,多层卷积可以更好的提取特征,但是过多的卷积结构会造成信息冗余且不会较好提升精度。因此本文在不影响训练和测试精度的情况下对VGG16网络第二次池化后的第三次卷积和第四次池化后的第三次卷积进行相应的剪除,以加快运算速度,满足智能驾驶的实时性需求。压缩后的网络编码结构见表1。
1.2.3 卷积核替换
本文使用3×1和1×3的非对称卷积核替代原VGG模型中的3×3卷积核。
普通卷积核大小通常为3×3或5×5,用以对图像进行特征的提取,VGG模型卷积操作中使用的为3×3的卷积核,本文在网络编码结构中最后一层卷积中利用3×1和1×3的非对称卷积核替代3×3卷积核(图3),因为高层次的卷积中图片大小较小,较为适用非对称卷积操作[14],使用非对称卷积操作不仅可以降低大量的参数,加快训练和检测速度,而且可以保证与常规3×3卷积相同的效果。
表1 网络编码结构
1.2.4 激活函数的选择
本文采用一种能用于图像识别任务的简单但有效的激活函数,FReLU激活函数[15](图4),通过增加一个空间条件来扩展ReLU/PReLU函数,通过非常小的运算开销,将对空间不敏感的激活函数扩展为拥有视觉扩展并自动建立模型的激活函数。相较于传统的Sigmoid、TanH等激活函数可能出现的梯度消失、函数值输出为常数、网络收敛困难等问题;FReLU激活函数不仅可以提高单个任务的性能,也不存在梯度消失问题,且运算速度较快,还可以进行稀疏表达,也使模型的收敛速度维持在一个稳定状态,可以很好地迁移到其它视觉任务。激活函数表示为n=max(m,T(m)), 其中T(m) 表示扩展运算的特征提取法。
为了实现空间条件,使用参数化池化窗口(parametric pooling window)来创建空间依赖性(使用高度优化的深度可分离卷积算符和BN层来实现)
f(mc,i,j)=max(mc,i,j,T(mc,i,j))
(5)
(6)
FReLU函数的设计可以让每个像素点在激活操作中产生空间视野,在对空间的响应中进行非线性变换并提升对视野的依赖性。函数max(·) 给每个像素提供了一个看空间背景或不看空间背景的选择。考虑一个有n个FReLU层的网络 {F1,F2,…,Fn}, 每个FReLU层Fi有h×h个参数窗口。为了简洁起见,只分析FReLU层,而不考虑卷积层。由于最大选择在1×1和h×h之间,所以F1之后的每个像素都有一个激活函数集 {1,1+x}(x=h-1)。 在Fn层之后,集合就变成了 {1,1+x,1+2x,…,1+nx}, 这给每个像素提供了更多的选择,如果n足够大,可以近似于任何布局,如图5所示。
图5中不同大小的正方形代表了顶部激活层中每个像素的不同激活场。 max(·) 允许每个像素选择在每层中寻找或不寻找,在足够多的层数后,形成大量大小不一的方块。因此,不同大小的方块可以近似于图5(a)斜线的形状,图5(b)弧线的形状,这些都是比较常见的自然物体布局,弧线也适用于弯曲的车道线检测。
1.3 车道线拟合
为了方便拟合车道线像素点,本文采用逆透视变换,将运动图像转换成俯视图。其中将现实世界中的点P′(XW,YW,ZW) 从世界坐标系到相机坐标系的关系如图6所示,转换公式如下
(7)
式中:H为旋转矩阵,T表示偏移向量,即坐标的平移。P(XC,YC,ZC) 为对应的相机坐标系中的点。
在得到相机坐标后,要将属于透视投影关系的三维相机坐标系转化为平面坐标系,再通过平面坐标系转化为图像坐标系,其中,相机坐标和平面坐标转换的公式为
(8)
(9)
其中,k为相机焦距,为相机坐标原点与图像坐标原点的距离,点 (x,y) 为在图像坐标系的成点。
从平面坐标得到图像坐标系, (u,v), (x,y) 分别表示以像素为单位的图像坐标系的坐标和以毫米为单位的图像坐标系的坐标,如图7所示。
像素坐标系和图像坐标系都在成像平面上,图像坐标转换为像素坐标的公式如下
(10)
最终通过上面坐标系的转换就可以将一个点从世界坐标系转换到像素坐标系。图8为根据相机采集的原图进行逆透视变换后的鸟瞰效果图。
通过逆透视变换的方法,得知每个像素点属于哪个车道后,将像素点集合转换为鸟瞰图,并对不同车道分配不同ID,将每一个车道实例进行参数曲线拟合并用不同颜色线条表示不同车道线。常用的拟合模型有霍夫变换、最小二乘法、三次曲线和贝塞尔曲线拟合[16-18]。本文采用最小二乘法对车道线像素点进行拟合,为了得到真实的预测情况,最后还要将拟合后的曲线回归原始图片中,得到更好的车道线检测效果。
2 实验及结果分析
2.1 实验数据集
本实验使用的是Tusimple数据集,Tusimple数据集是自动驾驶领域权威公司图森未来专为研究自动驾驶关键算法和解决方法所创立的数据集。Tusimple数据集总共包含128 160张图片,图片来源于中等天气条件下,车辆白天在高速公路多条车道情景下行驶的视频,取每秒视频分为连续的20帧,包含不同的交通状况,取最后一帧进行车道线标注。数据集共分为两部分,训练集和测试集,训练集包含72 520张图片,其中标注图片3626张,测试集包含55 640张图片,数据集图片尺寸统一为1280*720。
2.2 实验设置
本实验在Windows10环境下,依赖于Tensorflow_gpu-1.14.0,Python-3.7.6,另调用Numpy-1.18.1,Tqdm-4.42.1,Glog-0.3.1,Easydict-1.9,Matplotlib-3.1.3,Opencv-4.4.0,Scikit_learn-0.22.1等函数库完成程序支持;硬件平台为处理器:Intel(R)Core(TM)i7-6700K CPU@3.6GHz×8,显卡:GeForce GTX 1070Ti/PCIe。
为了实现车道线的精确检测,需要进行模型训练和参数优化调整,达到训练次数或要求的收敛条件为止。针对深度学习网络训练数据量大、超参数优化耗时长的问题,本文采用Hyperopt方法选取和优化超参数,通过对经验和实验的总结,选择将标注的3626各样本总共训练42 000次停止,根据超参数的设置,最终以损失值和准确率等来评价网络结构效果,得到最终权重文件。通过选取和优化,网络结构最优超参数见表2。
表2 网络超参数设置
网络的训练损失变化曲线如图9所示。
由图9能够发现训练损失值下降平稳,随着学习率和迭代次数不断变化,最后在迭代42 000次左右趋于稳定,表明训练结果良好。
2.3 实验对比分析
2.3.1 车道线检测准确率分析
因为自动驾驶行车安全要求较高,所以对车道线检测的要求也很严格。因此采用两个标准来评价检测效果:准确率 (acc) 和漏检率 (FN)。 其中每幅图像的平均正确点数作为准确率判断指标,即模型判断正确的数据占总数据的比例
(11)
其中,Cim为正确分割的像素点数目,Sim表示标注的真实的车道线像素点数。同时设定一个阈值,当标注点与检测点匹配率大于阈值时则这个点检测正确。
漏检率的计算方法如式(12)所示
(12)
其中,Mpred代表没有检测到的车道线数量,Ngt代表真实存在的车道线数量。
训练准确率曲线如图10所示。
为了验证改进后模型的良好效果,对不同改进方面分别进行了训练实验。实验结果如表3和图11所示。
表3 不同改进方案对模型性能影响分析
由表3和图11可知,文本设计的第7个模型算法在检测准确率和检测速度方面较未设计前均有较大改进,综合效果最好,说明了设计模型算法的合理性和有效性,为最优方案。
为了测试算法在复杂场景下车道线检测的准确率和漏检率,对测试集55 640张图片进行了测试,部分结果如图12所示,并且为了表明算法的泛化性,选取常规、车辆遮挡、地面污损、阴影、强曝光等5个场景图片用本文所提算法进行测试结果展示,检测结果如图13所示,可以看出在多种场景下,基于本文所提算法不仅在常规道路结构上有较好的效果,在有车辆遮挡、车道线污损、强光环境、地面阴影等情况下也有良好检测效果。
对不同场景进行车道线总数和正确检测数统计,正确检测数与车道线总数比值记为匹配准确率,结果见表4。
表4 不同道路场景下的匹配准确率
在车辆遮挡情况下,由本文提出的MB-FCN优化算法检测,测试结果表明,本文提出的模型结构和算法具有较高的检测精度和较好的鲁棒性,在识别效果和抗干扰能力方面也有较大提升。在挑选的测试图片中取得了良好的测试效果,其中在常规道路上的准确率最高,在强曝光和阴影环境下的准确率最低,还可以看出车道线检测准确率受外部因素影响较大,原因可能是因为强光和阴影下道路特征信息难以提取。
为了进一步验证本文方法的性能效果,使用几种典型车道线检测方法进行测试,表5展示了本文方法与几种典型方法在图森测试集上的结果比较。本文在Tusimple数据集的平均准确率为97.2817%,由实验结果可以看出本文方法平均漏检率相比于文献[19]降低了0.53%,而准确率相比文献[19]和文献[20]分别提高了和0.88%和0.75%。文献[20]采用行列卷积的形式,训练时需要使用固定顺序的车道线标签数据集,而本文方法只需要训练图片与标签一一对应的关系,标注操作简单,减少了大量工作量,更贴合实际。
表5 几种典型车道线检测方法准确率、漏检率对比
图14是在图森数据集下直线和弯曲道路检测结果,可看出在有污损的曲线车道线情况下该方法检测准确性良好,测试结果表明在改进后的算法中,直线车道和曲线车道的车道线检测准确率都有较大提高;且随着驾驶场景的变化,车道线检测也有较强的鲁棒性。
2.3.2 车道线检测时间测试
由于辅助驾驶对系统实时性要求较高,检测速度是一个很重要的评价指标。表6为车道线检测在现有主流模型和MB-FCN模型上单张检测时间和检测速度比较。
表6 本文方法与典型方法检测速度比较
测试结果表明,MB-FCN网络检测速度接近于轻量化网络Enet,优于复杂网络SCNN,综合检测准确率与检测速度来看,MB-FCN网络表现出了最优检测效果。
3 结束语
本文所提出的基于改进FCN的车道线实例分割检测方法,采用改进的FCN网络进行车道线的特征提取和分割,利用DBSCAN聚类算法进行聚类并分配ID,通过逆透视变换和二次拟合得到更加精准的车道线,最后对ID分配颜色区分不同车道线并还原到原图输出,得到更加直观的检测结果,方法可以满足车道线检测任务中关键指标准确率与实时性的要求。未来将注重在深度学习中运用迁移学习和车道线类型区分方面的研究,以增加检测的多样性和泛化性并提升模型效率,提高无人驾驶技术水平,进一步保证无人车遵守交通规则,保证驾驶安全。