车道线跟踪前提是拿到车道线检测结果。车道线检测的传统图像处理方法有:梯度+颜色信息、参数空间投票、边缘检测+Hough变换及其变形、k-means聚类和利用图像特征检测等方法。传统的车道检测方法需要高度定制化,包括许多手工特征提取和后处理方法。当测试环境改变时,常常需要大量调参工作,甚至需要更换后处理方法。很多时候需要在鸟瞰图上利用车道线空间相互关系进行处理。近两年(从2017年开始)开始出现了许多基于深度学习的方法,如SCNN,VPGNET,Lanenet,甚至是图像分割(可通行区域)等,实现了端到端的检测,在原图上很好的利用了环境信息,提高稳定性。除了检测出存在曲线和位置,还要区分出不同车道的车道线,通常需要提供左左,左,右,右右共四条车道线,即能区分出三条车道。这里检测结果应包括点坐标、颜色、线型、置信度等信息。当然也有研究把线型的确定称为车道线识别。当状况良好的时候,仅靠车道线检测就能连续输出车道线,例如网上广为流传的Udacity提供的开源项目[8],仅靠梯度+颜色信息的检测方法,就能检测出几乎所有帧里的车道线,没有明显遗漏。因此后处理只需要对车道检测出来的点进行拟合并延伸到灭点即可,无需更多跟踪过程。如下图所示,当前车道线被红色线标记出来。但是几乎所有实际路况,或多或少存在路面有修补、有积水、有阴影、车道线被遮挡、污损等情况以及车辆颠簸、上下坡等更极端的工况。下面的动图是LaneNet原始检测结果(from Karol Majek),车道线检测出的概率越高的地方颜色越亮。其中右侧路沿绿色的检测结果时断时续,在进入阴影时,检测失效,这是因为没有用跟踪进行结果稳定。因此,引入了车道线跟踪很重要,根据历史状态和道路几何关系,补充检测丢失、错误的车道线,并使车道线在空间位置上更稳定。
建立车道线模型
跟踪第一步,是要根据场景要求,合理地用较少参数准确描述出车道线,即把检测结果抽象成模型参数。但直接用图片像素上的曲线建立模型并不理想,而是需要转换到车体坐标系下建立模型,这是因为车体坐标系下模型参数的物理意义才更清晰。而且通常冗余设计包含多个相机,多个相机也必须统一到车体坐标系。通常使用逆透视变换把图片坐标转化为车体坐标。下图左红色坐标系定义了车体坐标系,坐标系原点为车辆中心(根据不同标准车辆中心位置定义不同,不具体讨论)。假设路面水平,车道线模型可以用多项式来表示,但是其中的多项式系数的物理含义并不直观。我们可以改写成如下形式其中 是车道线的位置即截距(),是车道线角度(),是车道线曲率(),是车道线曲率的变化率()。车道线曲率半径为 (),如上图右上的Radius of Curvature的数值。以上所有参数都是在处分析的,通过对求多次导得到。需要说明的是,公式进行了必要的近似,只有车辆沿道路正常往前开或转向不明显——即较小——时,角度才近似于一阶项系数,曲率也才能近似于的二阶导数(可参考曲率的定义)。另外,也有文献用车道宽度、车中心偏离车道中心位置、车道线角度以及曲率四个参数来表征车道线,如文献[1] 。还有文献采用二次B条样函数表示车道线模型。作为一般讨论,这里用水平路面四个参数表征一条车道线,较简洁,而且和真实物理量之间也有清晰的对应关系。
鲁棒的曲线拟合
选定车道线模型后,需要利用车道线检测结果(通常为散点,需要事先变换到车体坐标下)拟合该模型的参数。这里主要介绍两种比较常用的方法,最小二乘法和RANSAC(随机抽样一致性),此处假设大家都大概了解这两个算法的原理。最小二乘法是最小化残差平方和的一种最优化方法,广泛应用的原因之一是其平方和的形式,便于整理成矩阵相乘的形式,例如线性最小二乘容易得到闭合解,其中是包含、、、的矩阵。而且平方形式便于求导和泰勒展开,才能有后面的Gauss-Newton和LM最优化迭代算法。不过,最小二乘法的过拟合问题会显著影响车道线拟合效果,造成泛化误差增加。因为车道线参数在一定范围内不会有特别大的突变,如很少曲率特别大的弯道等,所以车道线以低阶多项式表达为主,根据经验,二阶形式能表示大部分情况。这种情况下如果有车道线检测有误差,会使得拟合曲线曲率异常,此时车道线模型中的三阶项就会产生明显的问题(此时三阶项系数可能会异常的大),如下图所示。而且同一条线前后帧可能也会跳动剧烈,因为帧与帧之间的噪声不同,拟合误差大。解决办法之一是直接降低拟合阶数,不过最好能够自适应地调节并切换模型阶数,否则失去了该模型的意义。还可以采用带正则项的最小二乘,闭合解为,其中是正则系数。因为正则化抑制了系数的异常变大,降低了噪声的影响。下图是直接最小二乘和带正则项的最小二乘的拟合效果比较,可以看到后者在高阶拟合时对噪声不那么敏感(此处拟合阶数大于3阶,只是为了展示问题)。即便如此,最小二乘可能仍然不够鲁棒,因为最小二乘要用所有输入的点来计算,异常点不可避免地影响到拟合效果。例如有较大误差的噪声信号的情况(下图左),或者有多条车道线结果被错误包含在一条车道线的结果中的情况(下图右)。RANSAC算法提供了另一种鲁棒性拟合的思路。RANSAC通过迭代算法找到包含最多内点(实际有用的数据点)数量的拟合曲线。由于只用内点进行拟合,而噪声或另一车道线的数据就会被当成外点,外点对拟合没有任何贡献。该算法用随机数据抽样的数据来拟合,因此一定概率能找到最优拟合曲线。但是,当这个概率——拟合置信度——很大时,如,就可以认为找到的曲线近似等于实际的曲线。经实验验证,对于包含%误差的数据集,RANSAC的效果远优于直接最小二乘法。RANSAC算法收敛的关键在于参数的选取,参数有:某个点是外点的概率(噪声或者错误车道线),每次抽样的点数,抽样次数和算法收敛设定的阈值,这几个参数的关系如下图所示。下图的表格为不同条件下的选取。另外,还有一个参数是内点选取范围距离,该值与和样本点方差有关,如时,。当然RANSAC算法在某些情况下也会拟合错误,还有其他的鲁棒的算法,如Least Median Squares (LMS)、Preemptive RANSAC、PROgressive Sample and Consensus (PROSAC)、M-estimator Sample and Consensus (MSAC) 等。拟合后即可以得到车道线模型中的多项式系数。
感觉分享些资源干货可以有效地提高流量,所以我也放了些觉得比较好的链接。偏重于车道线跟踪的文献和综述:[1] 2006-Video-based lane estimation and tracking for driver assistance Survey, System, and Evaluation[2] 2009-Probabilistic Lane Tracking in Difficult Road Scenarios Using Stereovision[3] 2013-Integrated Lane and Vehicle Detection, Localization and Tracking A Synergistic Approach[4] 2016-A REVIEW ON LANE DETECTION ANDTRACKING TECHNIQUES[5] 2006-Single Camera 3D Lane Detection and Tracking Based on EKF for Urban Intelligent Vehicle[6] 2006-Realtime lane tracking of curved local road[7] 2009-ROBUST LANE DETECTION AND TRACKING WITH RANSAC AND KALMAN FILTER开源项目和项目分享:[8] Udacity自动驾驶项目。https://github.com/udacity/CarND-Advanced-Lane-Lines,https://zhuanlan.zhihu.com/p/52623916[9] 百度无人车车道线检测挑战赛。https://github.com/gujingxiao/Lane-Segmentation-Solution-For-BaiduAI-Autonomous-Driving-Competition[10] galenballew/SDC-Lane-and-Vehicle-Detection-Tracking(https://github.com/galenballew/SDC-Lane-and-Vehicle-Detection-Tracking)[11] 车道线检测集锦,其中包括2017-2019年最新的文章、源代码、blog和数据库等(深度学习的检测和分割内容较多,跟踪内容较少)。https://github.com/amusi/awesome-lane-detection