点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
本文转自:AI算法与图像处理
本文讨论的重点跟踪算法如何应用在车道线应用中,即从得到车道线检测结果开始,到连续稳定地车道线跟踪的过程。包含车道线模型、鲁棒的拟合方法和跟踪。
车道线检测和跟踪是自动驾驶中必不可少的功能,LDW(车道偏离预警)、LKA(车道保持辅助)等功能模块都依赖于连续稳定的车道线检测和跟踪。(多)目标跟踪算法已经得到充分研究,而且相关算法解析和综述网上已经有很多了,也可以在计算机视觉life相关文章中找到,不再赘述。但是以上跟踪的分析,大多针对点目标,而此处我们关注跟踪算法如何应用在车道线应用中。一般来说跟踪和检测需要分开实施,如果有端到端一步实现检测+跟踪的方法,烦请不吝赐教。
本文先简单介绍车道线检测结果和问题,然后建立车道线的多项式模型,以及获得模型参数需要的鲁棒的拟合算法。接着介绍常见的跟踪算法,以Kalman滤波为主。最后是车道线相关资源干货分享。
获得车道线检测结果
车道线跟踪前提是拿到车道线检测结果。车道线检测的传统图像处理方法有:梯度+颜色信息、参数空间投票、边缘检测+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) 等。
拟合后即可以得到车道线模型中的多项式系数 。
选择车道线跟踪方法
跟踪需要完成的任务是对目标和其他状态量(对于本研究为多项式系数 )进行增加、预测、更新和删除四个操作。以下表格罗列了部分文献的车道线跟踪的方法。
(增加)刚开始增加车道线状态量向量 作为初始化。之后,只要本时刻有新检测结果输入,而上一帧没有对应的车道线信息,即把新检测到的车道线状态量为 赋给 ,即增加一条车道线。此处检测量由测量方程决定,由于测量系统参数矩阵 为单位矩阵,计检测到的 就是 ,因此忽略测量方程。
(预测)首先需要通过上一时刻车辆状态信息 (车速和车辆角速度)和上一时刻状态量 预测本时刻状态量 ,即状态方程为 ,其中 是和车速有关的矩阵, 是和角速度有关的矩阵,合起来代表以上一时刻车辆状态为条件,对本时刻状态量的预测。
(更新)如果本时刻某条预测好的车道线和本时刻检测到的车道线满足某种匹配规则,即可认为是同一条车道线,需要用Kalman增益 综合利用预测和检测的信息来更新车道线状态。具体做法:系统协方差矩阵更新为 ,通常测试场景一定,假设系统噪声协方差矩阵 为一个固定的对角方阵。随后计算
此处测量协方差矩阵 为对角方阵,可以根据当前检测结果的置信度而改变。最后得到更新的本时刻状态为,更新的本时刻协方差矩阵为 。其中最关键的 是衡量更相信检测结果的程度,或可理解为概率。当检测抖动较大、车道线不清晰、遮挡严重等情况,检测的置信度下降, 减小,更相信预测,因此起到稳定车道线的作用。
(删除)如果某条车道线一直是预测得出的,并没有匹配上新检测的车道线进行更新,则当前时刻如果预测次数大于某一寿命阈值后,就删除。
如果采用更复杂的模型,例如状态方程或测量方程是非线性的,以上Kalman滤波不再使用,需要使用拓展Kalman滤波(EKF)。EKF是在把非线性关系通过泰勒级数展开(忽略高次项)转化成(伪)线性关系基础上的Kalman滤波。
近年来粒子滤波也广泛运用在车道线检测中,因为Kalman滤波基于噪声高斯分布的假设,而车道线噪声分布通常不符合这个分布,因此粒子滤波一定程度上解决了噪声任意分布下的跟踪问题。也有研究把Kalman滤波和粒子滤波结合起来,同时具备Kalman滤波稳定的优点和粒子滤波环境适应性强的优点。
至此,经过跟踪处理,就能够输出空间上比较稳定、时间上比较连续的车道线模型参数了。利用这些模型参数,就可以把车道线结果重新投影到原图上,把结果显示出来。
资源分享
感觉分享些资源干货可以有效地提高流量,所以我也放了些觉得比较好的链接。
偏重于车道线跟踪的文献和综述:
[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
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~