精华内容
下载资源
问答
  • 点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达 本文转自:AI算法与图像处理本文讨论的重点跟踪算法如何应用在车道线应用中,即从得到车道线检测结果开...

    点击上方“小白学视觉”,选择加"星标"或“置顶

    重磅干货,第一时间送达
    
    

    本文转自: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增益 综合利用预测和检测的信息来更新车道线状态。具体做法:系统协方差矩阵更新为 ,通常测试场景一定,假设系统噪声协方差矩阵 为一个固定的对角方阵。随后计算

      此处测量协方差矩阵 为对角方阵,可以根据当前检测结果的置信度而改变。最后得到更新的本时刻状态为,更新的本时刻协方差矩阵为 。其中最关键的 是衡量更相信检测结果的程度,或可理解为概率。当检测抖动较大、车道线不清晰、遮挡严重等情况,检测的置信度下降, 减小,更相信预测,因此起到稳定车道线的作用。

    • (删除)如果某条车道线一直是预测得出的,并没有匹配上新检测的车道线进行更新,则当前时刻如果预测次数大于某一寿命阈值后,就删除。

    如果采用更复杂的模型,例如状态方程或测量方程是非线性的,以上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“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

    展开全文
  • 点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达 本文转自|人工智能与算法学习 本文讨论的重点跟踪算法如何应用在车道线应用中,即从得到车道线检测结果...

    点击上方“小白学视觉”,选择加"星标"或“置顶

    重磅干货,第一时间送达
    
    本文转自|人工智能与算法学习
    

    本文讨论的重点跟踪算法如何应用在车道线应用中,即从得到车道线检测结果开始,到连续稳定地车道线跟踪的过程。包含车道线模型、鲁棒的拟合方法和跟踪。本文原创。

    车道线检测和跟踪是自动驾驶中必不可少的功能,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增益 综合利用预测和检测的信息来更新车道线状态。具体做法:系统协方差矩阵更新为 ,通常测试场景一定,假设系统噪声协方差矩阵 为一个固定的对角方阵。随后计算

      此处测量协方差矩阵 为对角方阵,可以根据当前检测结果的置信度而改变。最后得到更新的本时刻状态为,更新的本时刻协方差矩阵为 。其中最关键的 是衡量更相信检测结果的程度,或可理解为概率。当检测抖动较大、车道线不清晰、遮挡严重等情况,检测的置信度下降, 减小,更相信预测,因此起到稳定车道线的作用。

    • (删除)如果某条车道线一直是预测得出的,并没有匹配上新检测的车道线进行更新,则当前时刻如果预测次数大于某一寿命阈值后,就删除。

    如果采用更复杂的模型,例如状态方程或测量方程是非线性的,以上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“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

    展开全文
  • 车道线跟踪

    千次阅读 2016-08-09 10:25:06
    在完成车道线检测后,接下来要做的就是车道线跟踪,这也是智能汽车辅助驾驶的关键技术。 在此领域的研究中,产生了多种车道线算法,如AURORA的自适应的模板相关法,该方法只能在路面状况缓慢变化时工作良好;LOIS...

    在完成车道线检测后,接下来要做的就是车道线的跟踪,这也是智能汽车辅助驾驶的关键技术。

    在此领域的研究中,产生了多种车道线算法,如AURORA的自适应的模板相关法,该方法只能在路面状况缓慢变化时工作良好;LOIS的变形模板法,能处理图像中车道边缘比较弱的情况,而且还能排除路面阴影、污水等的影响;RALPH 系统从前方道路中提取梯形区域,对此区域进行二次采样并将其变换到平面道路图中;MOB-RAB系统假设道路是平坦的,通过把透视图变换为平面图得到车道线;SCARF系统利用颜色视觉及单线和双线的语义;Waxman 等人采用两步图像处理的方法提高道路识别跟踪速度;Redmill 运用匹配滤波和Kalman滤波检测道路,其中Kalman 滤波被用来保持平滑,并预测下一帧图像中的车道线参数。

    本文研究在小波图像边缘检测得到车道线后,利用Hough变换对噪声不敏感并能较好地处理直线的优点,采用Hough变换的方法在图像序列的各帧中提取车道线的参数,然后利用Kalman 滤波来一帧帧地依次跟踪这些参数。这样,就将车道线的跟踪转化成车道线参数的跟踪,不仅提高了跟踪的速度,而且将Kalman跟踪的方法引入,提高了跟踪的准确度。

    1 基于Hough变换的车道线参数提取

    Hough变换具体步骤如下:
    (1)在ρ和θ 合适的最小值、最大值之间建立一个离散的参数空间,以及一个累加器A(ρθ) ,并把每个元素置0。
    (2)利用先验知识,限定参数的ρ和θ 的取值范围,对二值图像上满足条件的像素点做Hough 变换,即算出该点在每个ρ - θ 网格上的对应曲线,并在相应的累加器上加1,即:
    A(ρθ) = A(ρθ) + 1
    (3)找出对应图像平面共线点的累加器上的最大值,这个值提供了图像平面上共线点所在直线的参数。由此算法可知,可以把在x-y 平面上寻找共线的点(即寻找直线)的问题转化成在参数空间(即Hough 变换的空间)中寻找峰值的问题。为此,编写函数houghtrans 来实现直线型车道线参数的提取,得到Hough 变换域的直线参数rodetect 和tetadetect,即ρ 和θ 的值。

    2基于Kalman的车道线参数跟踪

    由上节的Hough变换得到基于直线模型的车道线的参数 ρ和θ后, 就可以用Kalman滤波对其进行跟踪了。
    Kalman跟踪的算法描述如下: 
    (1)编写函数initialk():其主要功能是由序列图像中的前5幅求取待跟踪参数的维数的平均值Mr,以此作为与其他帧的参数维数相比较的基础。 
    (2)设定Hough变换相关的参数。
    (3)设定Kalman跟踪的相关参数。 
    (4)依次载入序列帧图片,此处的图片为240×320的RGB序列图像。
    (5)对载入的图像进行小波边缘检测,得到二值化的边缘图像。
    (6)对得到的边缘图像进行Hough变换的直线参数提取,得到ρ-θ变换域的直线参数ρ和θ。
    (7)矩阵维数匹配判断:由于每个序列帧车道线的不同,所检测的直线参数ρ和θ的维数也不同,为利用Kalman进行跟踪,参数的维数必须统一。为此,需利用矩阵维数匹配判断,当前帧的参数维数Xr大于平均值Mr时,舍弃后边的Xr-Mr维;当当前帧参数的维数Xr小于平均值Mr时,后边的Mr-Xr维补0。这样,任何一帧的待跟踪参数的维数都是Mr,这样就可以利用Kalman来实现跟踪了。
    (8)Kalman跟踪计算:Kalman跟踪的核心是它的5个公式,实现此功能。参数初值和协方差P的初值设为单位阵,本状态的预测值是上一状态的跟踪结果,本状态的真实值是当前读入的序列帧,由此可得到本状态的跟踪值(即最优估计结果)。此值又作为下一状态的预测值,实现车道参数的循环估计,即跟踪。


    展开全文
  • 车道线检测+车道线跟踪+车道线识别

    万次阅读 多人点赞 2017-06-28 16:09:59
    为什么要做跟踪,直接从上图中可以看出在车道检测(绿色)算法没有很好的检测出正确的车道线的时候,车道线跟踪(红色)能够很好的规避这种错误,达到理想效果。 咱这里用的kalman,我的代码太乱了,不好意思贴了...

    原本打算用深度学习的,但是....各种原因。于是想着随便先实现以一下,发现效果还不错,还节约成本。美滋滋

     

    现成代码美滋滋,先上个链接

    http://blog.csdn.net/chongshangyunxiao321/article/details/50999212

    再上图

     

    用上面博客的代码,再改改参数,美滋滋。

    但是会出现丢帧的情况。这对追求完美的我。。。。。。。。。的老板来说不行啊。

     

    于是想用深度学习做一做。

    怎么做?表急,一步一步来。。。。。

    先看一下逆透视变换。这里是用的opencv的四点变换。

    先上个链接,链接关了。直接上代码吧。

    #include <cv.h>
    #include <highgui.h>
    using namespace std;
    int main()
    {
    CvPoint2D32f srcQuad[4], dstQuad[4];
    CvMat *warp_matrix = cvCreateMat(3, 3, CV_32FC1);
    IplImage *src, *dst;
    if (((src = cvLoadImage("D:\\路径\\3.png", 1)) != 0))
    {
    dst = cvCloneImage(src);
    dst->origin = src->origin;//确定起点位置为座顶角
    cvZero(dst);


    srcQuad[0].x = 0;
    srcQuad[0].y = 0;
    srcQuad[1].x = src->width - 1.;
    srcQuad[1].y = 0;
    srcQuad[2].x = 0;
    srcQuad[2].y = src->height - 1;
    srcQuad[3].x = src->width - 1;
    srcQuad[3].y = src->height - 1;


    //dstQuad[0].x = src->width*0.05;
    //dstQuad[0].y = src->height*0.33;
    dstQuad[0].x = srcQuad[0].x;
    dstQuad[0].y = srcQuad[0].y;
    dstQuad[1].x = src->width;
    dstQuad[1].y = 0;
    dstQuad[2].x = src->width*0.45;
    dstQuad[2].y = src->height;
    dstQuad[3].x = src->width*0.55;
    dstQuad[3].y = src->height;


    //计算透视映射矩阵
    cvGetPerspectiveTransform(srcQuad, dstQuad, warp_matrix);
    //密集透视变换
    cvWarpPerspective(src, dst, warp_matrix);
    cvNamedWindow("Perspective_Warp", 1);
    cvShowImage("Perspective_Warp", dst);
    cvSaveImage("result3.png", dst);
    cvWaitKey();
    }
    cvReleaseImage(&dst);
    cvReleaseMat(&warp_matrix);
    return 0;
    }

    //华丽丽的分割线,上面是车道线检测,下面是车道线跟踪

    为什么要做跟踪,直接从上图中可以看出在车道检测(绿色)算法没有很好的检测出正确的车道线的时候,车道线跟踪(红色)能够很好的规避这种错误,达到理想效果。

    咱这里用的kalman,我的代码太乱了,不好意思贴了。哇咔咔。这里贴一个kalman的鼠标跟踪代码。

     

    #include <opencv/cv.h>  
    #include <opencv/highgui.h>  
      
    #include <iostream>  
      
    using namespace cv;  
    using namespace std;  
      
    const int winWidth = 800;  
    const int winHeight = 600;  
      
    Point mousePosition = Point(winWidth>>1, winHeight>>1);  
      
    //mouse call back  
    void mouseEvent(int event, int x, int y, int flags, void *param)  
    {  
        if(event==CV_EVENT_MOUSEMOVE)  
        {  
            mousePosition=Point(x,y);  
        }  
    }  
      
    int main()  
    {  
        //1.kalman filter setup     
        const int stateNum=4;    
        const int measureNum=2;    
      
        KalmanFilter KF(stateNum, measureNum, 0);  
        Mat state (stateNum, 1, CV_32FC1); //state(x,y,detaX,detaY)  
        Mat processNoise(stateNum, 1, CV_32F);  
        Mat measurement = Mat::zeros(measureNum, 1, CV_32F);    //measurement(x,y)  
      
      
            randn( state, Scalar::all(0), Scalar::all(0.1) ); //随机生成一个矩阵,期望是0,标准差为0.1;  
            KF.transitionMatrix = *(Mat_<float>(4, 4) <<   
                1,0,1,0,   
                0,1,0,1,   
                0,0,1,0,   
                0,0,0,1 );//元素导入矩阵,按行;  
      
            //setIdentity: 缩放的单位对角矩阵;  
            //!< measurement matrix (H) 观测模型  
            setIdentity(KF.measurementMatrix);  
      
            //!< process noise covariance matrix (Q)  
            // wk 是过程噪声,并假定其符合均值为零,协方差矩阵为Qk(Q)的多元正态分布;  
            setIdentity(KF.processNoiseCov, Scalar::all(1e-5));  
              
            //!< measurement noise covariance matrix (R)  
            //vk 是观测噪声,其均值为零,协方差矩阵为Rk,且服从正态分布;  
            setIdentity(KF.measurementNoiseCov, Scalar::all(1e-1));  
              
            //!< priori error estimate covariance matrix (P'(k)): P'(k)=A*P(k-1)*At + Q)*/  A代表F: transitionMatrix  
            //预测估计协方差矩阵;  
            setIdentity(KF.errorCovPost, Scalar::all(1));  
              
      
            //!< corrected state (x(k)): x(k)=x'(k)+K(k)*(z(k)-H*x'(k))  
            //initialize post state of kalman filter at random   
            randn(KF.statePost, Scalar::all(0), Scalar::all(0.1));  
            Mat showImg(winWidth, winHeight,CV_8UC3);  
      
            for(;;)  
            {  
                setMouseCallback("Kalman", mouseEvent);  
                showImg.setTo(0);  
      
                Point statePt = Point( (int)KF.statePost.at<float>(0), (int)KF.statePost.at<float>(1));  
      
                //2.kalman prediction     
                Mat prediction = KF.predict();  
                Point predictPt = Point( (int)prediction.at<float>(0), (int)prediction.at<float>(1));  
      
                //3.update measurement  
                measurement.at<float>(0)= (float)mousePosition.x;  
                measurement.at<float>(1) = (float)mousePosition.y;  
      
                //4.update  
                KF.correct(measurement);  
      
                //randn( processNoise, Scalar(0), Scalar::all(sqrt(KF.processNoiseCov.at<float>(0, 0))));  
                //state = KF.transitionMatrix*state + processNoise;  
                //draw  
                circle(showImg, statePt, 5, CV_RGB(255,0,0),1);//former point  
                circle(showImg, predictPt, 5, CV_RGB(0,255,0),1);//predict point  
                circle(showImg, mousePosition, 5, CV_RGB(0,0,255),1);//ture point  
                  
      
    //          CvFont font;//字体  
    //          cvInitFont(&font, CV_FONT_HERSHEY_SCRIPT_COMPLEX, 0.5f, 0.5f, 0, 1, 8);  
                putText(showImg, "Red: Former Point", cvPoint(10,30), FONT_HERSHEY_SIMPLEX, 1 ,Scalar :: all(255));  
                putText(showImg, "Green: Predict Point", cvPoint(10,60), FONT_HERSHEY_SIMPLEX, 1 ,Scalar :: all(255));  
                putText(showImg, "Blue: Ture Point", cvPoint(10,90), FONT_HERSHEY_SIMPLEX, 1 ,Scalar :: all(255));  
      
                imshow( "Kalman", showImg );  
                int key = waitKey(3);  
                if (key == 27)  
                {  
                    break;  
                }  
            }  
    }  

     

     

     

     

    第三部分 车道线的识别。

     

    随便弄个分类器做做分类,等有闲暇时间上文字描述。

    超级简单,HOG+SVM。对候选框进行识别,速度快效果也还不错。

    另外,附一个粗略扫了一下感觉还不错的链接。车道线检测的,还有代码。但是我没亲自去弄过这份代码。

    https://blog.csdn.net/weixin_38746685/article/details/81613065

    展开全文
  • 提出了一种新颖的适用于自主驾驶系统的车道线检测与跟踪算法。该算法采用了广义曲线的车道线参数模型,能同时适应弯道和直道的检测。该检测算法最突出的贡献在于,没有仅仅使用单一方法求解各个参数,而是根据各参数的...
  • 内容: 旨在对车载摄像头采集的车辆行驶视频中的车道线进行识别,实现过程为:首先对图像进行去畸变、透视变换等,随后进行梯度和颜色融合,利用曲线多项式拟合提取车道线信息,最后跟踪了一段 50 S左右的行车视频...
  • 第二步:因为关注的是车道线本身,所以对图片进行逆透视变换,得到去除额外信息的车道线图片,而且使车道线恢复成平行的车道。 第三步:进行图像二值化处理,将车道线和背景,进行简单的划分。 第四五:采用滑动...
  • 关于道路安全系统的文章 , 车道线识别与跟踪算法的研究 当车偏离车道边线是车辆控制系统就会为驾驶员提醒 报警。
  • 这是毕设的程序,包括大津阈值分割,SCHARR滤波器边缘检测,ROI设置,车道检测中用HOUGH进行直线检测,多段折线模拟弯道,以及偏离点检测,及这三部分的跟踪,车辆检测为基于特征检测,采用KALMAN进行跟踪
  • MATLAB车道线检测与跟踪 读了车道检测这个论文,我理解了利用matlab对车道识别算法进行仿真研究,从仿真的结果中提出具有一定实时性鲁棒性的识别方法。车道检测是智能车辆发展的智能因素。近年来对这项目的研究都是...
  • 日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不...一个是基于视频的车辆跟踪及流量统计,是一个可跟踪路面实时车辆通行状况,并逐帧记录不同行车道车流量数目的深度学习项目,在
  • 整个系统划分为图像预处理、车道线检测、车道线跟踪以及偏离预警等四个功能模 块。为了削减干扰信息,缩小检测范围,从而提高系统计算的准确性和实时性,图像预处理模块将视频图像逐帧灰度化、选取感兴趣区域、二值...
  • 车辆和车道线检测与跟踪 固态硬盘 Yolo3 神经网络 概述 将车道发现和车辆检测项目结合在一起。 添加汽车类别以跟踪检测到的车辆的位置(边界框)和历史记录。 沿摄像机方向覆盖车道的鸟瞰图的透视变换用于测量摄像...
  • 提出了一种高速公路车道线检测与跟踪算法:初始检测时,首先估计消失点位置;再将图像特征点向消失点投影,通过检测投影直方图波峰来识别车道线;然后利用车道宽度和车道线强度特征滤除与车道线平行的伪车道线跟踪...
  • 车道线的有效检测与跟踪是智能车正确识别道路的前提。针对现有车道线检测与跟踪算法效率不高的难题,提出了一种基于视觉传感器与车道级高精度地图相融合的车道线检测与跟踪方法。该方法首先用改进的Hough变换提取...
  • 【ADAS】车道线检测与跟踪

    千次阅读 2018-05-04 10:31:55
    车辆在车道中的位置,包括横向偏移量,车辆与道路的夹角(偏航角)车道检测与跟踪一般分为以下几个部分:1. 车辆、道路、相机模型2. 道路特征提取3. 道路参数计算,如曲率,4. 车道跟踪车辆、道路、...
  • 基于python的道路视频车道线检测:直接读取mp4文件,并识别车道线,标注。资料内容齐全
  • 模型IO 输入为相机采集的图像,输出分为2部分,第一部分为h_cam和camera pitch,第二部分为道路坐标系Croad下的车道线,每条车道线由Croad下的K个点表示。 模型结构 输入图像由two parallel steams or path-ways...
  • SDC-车道和车辆检测-跟踪 Python中的OpenCV,用于自动驾驶汽车的车道线和车辆检测/跟踪 阅读我关于这个项目的 Medium。
  • 基于OpenCV 的车道线检测方法

    千次阅读 2019-10-25 18:36:11
    车道线检测是图像处理运用到无人驾驶的一项技术,目前也过渡到了部分汽车上,高速公路的自动车道保持就是一个应用。 最近研究了两个基于车道检测的opencv的代码,先放链接: A.Udacity车道线检测代码 B.基于霍夫变换...
  • 道路视频车道线检测

    2019-04-18 09:45:42
    内含两个车道线检测例子:一个是python语言编写,一个是MATLAB语言编写 包含了MATLAB车道线识别的m程序,用于从视频流识别车道线,可调整相关参数。同时包含了四个车道线识别的视频,可用于车道线识别的测试。 基于...
  • 车道线识别经典算法,很好的学习资料,算法内有中文备注,可运行。
  • PCL:激光点云车道线检测及最小二乘法拟合
  • matlab——车道线识别跟踪

    千次阅读 2020-11-23 23:09:00
    跟踪状态下未检测到车道线,以上一帧的位置打印 clc;close all; clear all pic_name='Tsd76.gif'; VideoFile = VideoReader('E:\MATLAB\遍历图片保存为mat\shangqi\lane_detection\test.avi'); nFrames =VideoFile...
  • 自动驾驶中的车道线检测算法汇总

    千次阅读 2020-11-14 23:06:11
    对近两年来车道线检测算法进行汇总,后期将会保持不断更新~ 1、Efficient Road Lane Marking Detection with Deep Learning 2、VPGNet: Vanishing Point Guided Network for Lane and Road Marking Detection and ...
  • opencv 车道线检测(一)

    万次阅读 2016-10-15 20:31:08
    1.前言  车道线检测无论是在车道偏移预警系统(LDWS)还是辅助或者自动驾驶中都显得尤为重要,并且是很基础的模块,自动驾驶中对于行车预测等...这里使用霍夫变换求取直线,卡尔曼滤波进行车道线跟踪。 2.模块介绍 1.
  • 端到端车道线检测Ultralytics recently launched YOLOv5 amid controversy surrounding its name. For context, the first three versions of YOLO (You Only Look Once) were created by Joseph Redmon. Following ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,678
精华内容 1,871
关键字:

车道线跟踪