首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >车道和障碍物检测用于驾驶期间的主动辅助

车道和障碍物检测用于驾驶期间的主动辅助

作者头像
代码医生工作室
发布2019-09-04 11:12:31
1.5K0
发布2019-09-04 11:12:31
举报
文章被收录于专栏:相约机器人相约机器人

作者 | Shuvashish Chatterjee

来源 | googleblog

编辑 | 代码医生团队

虽然已经有半自动驾驶汽车在世界各地运行。这篇文章探讨了将移动计算平台用作ADAS副驾驶的程度。

检测车道

如果必须教电脑了解道路场景,第一步是车道检测。从汽车到斑马线检测到的其他一切都存在于驾驶的车道的背景中。担心在车道上与前方车辆的保险杠距离。

可以利用一些车道的特征。车道线是平行的,它们是白色或黄色。在大多数情况下,它们在整个道路上都是连续的标准宽度。对于安装在挡风玻璃上的摄像机,它们通常会在图像框架周围均匀地间隔开始。从帧到帧,识别的曲线将是连续的。

挡风玻璃安装的摄像头采用场景的前视图。在前视图中,当我向地平线移动时,明显的车道宽度减小。这对计算距离来说不是很好。因此将卫星发送到低地球轨道并拍摄鸟瞰图像以进行地形计算。也是第一步,必须将破折号凸轮前视图转换为顶视图。

如果看下面的图像,车道线看起来与地平线相交。这被称为消失点。在俯视图中,消失点或地平线附近的点比前视图中的点更远。必须将一组点从前视图中的源图像映射到顶视图上的一组图像。可以手动选择四个这样的点(使用路面作为指导),知道它将在顶视图中形成一个矩形,但在前视图中显示为菱形。这个步骤可以使用消失点作为参考自动化,因为知道菱形的所有倾斜边缘将与它相交。自动化对于改变摄像机位置并不是非常强大(每个dashcam镜头都有不同的位置),并且可能需要对过程进行一些调整

图-2从灰度图像中获取图像

如果看一下图像内部表面的边缘(见❶ - above上面的图2),它们似乎形成一条在消失点相交的线。将canny滤镜应用于灰度图像以获得表示边缘的点云。Canny计算每个像素的强度梯度。然后它使用阈值来过滤掉一些噪音。如果将其与灰度图像中位数进行基准测试,这些阈值似乎效果最好。现在图像的上半部分可能会有标志,这可能会在后续步骤中加起来作为噪声,因此添加一个菱形蒙版来过滤感兴趣的区域。

边缘点包含嵌入噪声中的多条线。其中一些明显的界限存在差距。这些明显线条的斜坡也有噪音。需要一种强大的方法将边缘点转换为线条。用于识别图像中的线条和形状的霍夫变换使用投票算法和约束来确定给定一组点的候选线。已经将这些控件标记为图像尺寸,这似乎可以为不同帧尺寸的线条提供合理的预测。

在某些情况下,被驱动车辆(自我车辆)发动机罩甚至仪表板的部件可能都在前视图内。最好在任何处理之前在第一阶段将它们裁剪掉。

透视变换

现在已经从边缘点获得了线(参见下面的图3)。最小化与所有这些线的垂直距离之和的点是消失点。使用数学结构来缓解它。随后使用此消失点来创建一组源点(红色多边形角❷)以映射到目标点(顶视图图像的角❸)。发现将顶视图大小设置为360 X 360px似乎对于剩余的过程来说足够好,即使目标图像是720像素高。

图3创建鸟瞰图

还可以将源点的顶部边缘移向消失点。这将增加以车道线曲线为基础的路面。然而随着越来越接近消失点,随着更大的图像空间(顶视图)被挤压到正视图中的较小像素区域,噪声增加。可以在俯视图中找到两个黑色三角形尾部,因为已经在前视图图像下方获取了最终源点。这使得可以在顶视图中使用完整的车道区域(直到自我车辆),因为它使用透视变换从正面图像中展开。因此它留下了黑色的三角形伪影。

从透视图像中创建蒙版

透视图像(3通道RGB)尚不可用。必须把它变成一个掩码(蒙板矩阵),可以从中提取出车道信息。这是整个过程中最棘手的一步。必须在不同的照明条件下驾驶车辆:黎明,中午,夜晚,阴影,高速公路内的森林等等。其中一些变化是渐进的,一些作为建筑/过桥阴影是非常突然的。虽然可以在RGB颜色空间(255,255,255)中隔离白色通道,但黄色有点棘手。迁移到HL S(色调,亮度,饱和度)色彩空间更易于管理,将使用HLS 转换后的图像作为提取蒙版的起点。

图4使用阈值创建掩码

首先设置白色和黄色遮罩的低/高阈值。如果一切都是静态照明和背景,那就足够了。然而,随着背景和光照条件的变化,必须每隔几秒更新一次阈值。最敏感的因素是较低的亮度界限(HLS中的L)选择一个不正确的数字(ⓐ - ⓓ见上面的图4),其他一切都是为了折腾。在应用阈值之前,最好先进行标准化步骤。可以通过计算该区域的平均亮度(L)并使用该平均值来调节用于计算掩模的阈值来立即使用车辆前方的路面❷。检查下面的gif,当汽车经过过桥时,此步骤如何恢复阈值。

图5从阴影中恢复

检测车道起点和宽度

现在有从顶视图获得的。必须开始从中提取车道信息。作为第一步,需要确定左右车道的起点。掩盖矩阵(总和列)的直方图上的峰值就是这样。有时候车道可能会向左/向右弯曲,因此使用靠近汽车的较低部分(见下图6)来计算直方图更为谨慎。

图6检测车道启动

在大多数道路中,车道的标准宽度为3.5至3.75米。可以使用此信息将顶视图图像中的像素坐标系映射到图像所代表的真实世界坐标系。使用此比率,顶视图中的所有位置都可以转换为真实世界位置。因此可以报告车辆的速度,碰撞时间和一点处道路的曲率半径。

扫窗

已经确定了上一步中的车道开始。必须在此步骤中提取包含车道线的像素。使用下面描述的滑动窗口机制。第一步是进行水平传递并获得由左右矩形中的每一个约束的像素。随后,确定这些像素的中点,以确定下一步中窗口的水平位置。(参见下面的图7)不断重复提取下一行像素的步骤,直到覆盖整个图像为止。

必须设置寡妇身高和宽度参数。高度取决于想要在框架上滑动的窗口数量。通常,更多的窗口允许更好地适应曲线,窗口宽度也是如此。设置得太高,最终浪费计算资源。通常发现每帧25-35个窗口是最佳的。将窗口宽度增加到高将开始从路面的路面或树叶中拾取噪音。

图7使用窗户扫描查找车道热点

现在这一步将会有一些复杂情况。在窗口本身有时可能会有太少,在其他情况下可能会有太多选定的像素(回想一下我们必须使用宽窗口扫过)如何识别下一个窗口的x位置。在每种情况下,都必须拒绝窗口中的信息为不可用,并对下一个窗口x位置进行猜测。有三种选择可供选择:如果相邻行已经填充,可以通过车道宽度偏移其位置并继续。否则,如果预先有足够的行数填充后可以使用一般曲线来估计下一个位置。如果这不起作用,可以使用前一帧中获得的位置继续。如果没有什么可以作为最后的追索权,可以垂直继续。

有时,行中突出显示的像素之间可能存在较大差距。如果和它一起生活,车道可以随着噪音而弯曲。最好拒绝这样的帧并使用前一帧中的信息来纠正它。每当拒绝整个帧时,重新校准用于创建掩码的阈值是明智的。在这个阶段结束时,有一组左右像素。

最适合车道中心

已经获得了左右车道坐标,现在必须为这些坐标拟合曲线。如果没有系统提取的噪音,这应该是直截了当的。如果从底部的几个窗口中取出所有点并且任务优化器来产生对下一个点或曲线的估计,则它可能最终给予阳光照射点高的权重并产生任意曲线。缓和这种情况的一种方法是使用每个窗口中的点的质心并使用质心来估计曲线(参见下面的图8)。发现这对噪音更强。

图8确定韧皮适合车道

一旦获得了曲线,就可以将它与前一帧中获得的曲线进行比较,以检查它们是否彼此接近。足够接近接受曲线,否则继续前一帧的估计。在拒绝的情况下,设置一个计数器,一旦它超出阈值我们接受解决方案,即使它已超过最大可接受偏差。这有助于捕获系统错误并从中恢复。作为最后一步而不是直接采用曲线估计,使用移动平均线来消除一些噪声。

值得注意的是,左右车道线可用于估计两条单独的曲线。然而,使用中心线估计在两个方面更好。首先,它汇集来自两个车道的信息,这有助于产生估计,即使其中一条车道线丢失或错误。第二条车道线基本上是平行的,因为两个独立的实体会丢失这些信息。

切换通道和计算偏移量

在驾驶时将改变车道,因此系统必须监控相对于车道的位置,并在需要时触发换道。弄清楚如何做到这一点。对于每个车道,确定了车道起始位置。其中点为提供了车道的中心。顶视图中摄像机的中心给出了车辆中心的位置。可以使用之前计算的比率将其从像素坐标系转换为现实世界偏移。如果该偏移大于车道宽度的一半,准备在下一帧中切换车道(参见下面的图9)。

图9影响车道变换

对于切换车道,将所有车道偏移一个车道宽度。保留了车道线的旧坐标,这两个车道通道都是通用的,并且重置了另一个。对于大多数情况,它发生得很顺利。(见下面的图10)。

图10-从右车道切换到左车道| NH60印度

可以使用多项式系数来确定汽车当前位置的实际曲率半径(参见下面的图11)。这可以是伪造帧的另一个检查,给出了性能曲线,因为计算出的镭不会在帧与帧之间突然改变。

图11曲率半径

检测车辆

对象检测有很多种方法。YOLO是相当有效的平衡精度和计算成本。然而,即使YOLO在移动处理环境中也不可行,以便在此时从实时视频流中挤出边界框。另一方面,对象跟踪器非常简洁快速,可以使用有限的计算资源进行实时流。可以让YOLO 一次生成对象贴图,并让对象跟踪器在大多数时间跟随它。除了从一个坐标系切换到另一个坐标系之外,这是非常直接的实现。

图12定位汽车

在从跟踪器到YOLO的切换之间,应该能够在当前帧中定位先前ID的车辆(参见上面的图12)。YOLO生产粘合盒。因此必须创建一个度量标准,用于识别刚刚进入视野的新车,并将边界框分配给前一帧中标识的车辆的ID。使用IOU测量来分配具有现有ID的位置。

最后一步是计算车辆参数:位置速度,碰撞时间。如果将下边缘的中点作为车辆的位置参考(不完美,因为可能已经对角地观察了车辆,但是很好的估计)可以计算所有参数。将坐标传输到顶视图,可以获得车辆在现实世界中与相机的距离。帧到帧的距离变化给出了速度的估计。如果车辆在车道中,车辆正在被驾驶(由简单的代数不等式确定),可以根据观察到的速度确定前车相对于自我车辆减速时的碰撞时间(参见图下面的13)。

图13前视图和俯视图

所有测量均基于到边界框的距离。在大多数情况下,它准确地反映了真实的地面距离 然而,只要地平线上的点被测量为消失点在帧之间保持一致,这就起作用。然而确实在坑洼,坡道上行驶,等等。所有这些都会扰乱消失点。这将导致车辆出现比实际更远或更近的车辆。可以避免一些这些陷阱,如果只在行驶超过20公里时才能启动系统。设计的用例是巡航速度,因此这是可以接受的。

由YOLO和跟踪器编码的边界框也会对噪声产生影响。有时箱子会与车辆的轮廓紧密相连,而其他箱子则更加宽松地贴合车辆轮廓。可以通过使用移动平均来估计位置来衰减一些噪声,并使用稍大的周期来估计速度。然而在不利方面,它也降低了系统的一些响应能力。

物体检测中的最后一次打嗝是道路分隔物对其他车辆的阻碍。在测量到车辆的距离时的假设是边界框的下边缘与道路的平面相交。在大多数情况下,如果在道路中间有一个分隔线或者遮挡视线的车辆,则会将裁剪出的边界框裁剪掉。车辆将显得比实际更远。判断中的这种错误会经常发生,但它不是一个交易破坏者。为了避免碰撞,主要关注与自我车辆在同一车道上的摄像机附近的车辆。可以忽略一些在相反方向上穿过马路的车辆,并且在计算中遇到一些失误。

它足够快吗?可以更快吗?

这可以在没有GPU的台式机或笔记本电脑上实时运行。处理速度敏感的参数是:触发YOLO的时间段,输入视频的帧速率和视频的分辨率。减少这些参数中的任何一个都会提高处理速度。发现在10fps下以360px工作,每2秒触发一次yolo比笔记本电脑上的实时帧速率更好。

在移动设备可以实时运行算法之前,仍需要进行调整。幸运的是,还有空间可以弥补。对象检测YOLO每帧占用大部分处理时间。它使用的是VGG网络构建的主体,可以替代较小的mobinet架构。这将通过更快的处理来折衷一些准确性。还可以调整自定义头部,仅进行车辆+行人+交通灯检测而不是目前的80个班级。

可以重构一些代码以在对象检测和通道检测之间共享。追求的方向之一是直接使用顶视图(缩放到446 X 446)进行物体检测和跟踪。这有助于跳过零件以多次在不同坐标系之间重新缩放。

最后如果将一个仪表盘记录器用例放在一边,并专注于检测,警报和记录(可能立即用听觉音调和驱动器上的表格摘要),可以取消用于制作增强视频的部分代码。这应该使速度提高一个数量级,使移动设备能够处理实时信息。

这导致了什么?

汽车行业的监管环境正在发生变化。较低的排放标准加上较高的安全评估要求增加了车辆的合规成本。随着监管逆风投资于在便携式设备上运行的ADAS平台,该平台可以与车辆接口将间接地促进安全性,以极少的前期和运营成本改善整体客户体验。

汽车行业的最终用户角色也在发生变化。汽车的所有者,司机,通勤者传统上都是同一个人。将来,这些角色将由不同的个人执行。这是有道理的,因为每辆停放的车辆都是闲置资产。运输经济的未来将建立在微观交易的基础上,微观交易具有区分谨慎和鲁莽的内在需求。这是主动辅助算法可以贡献的地方。从驾驶时的轻微考虑行为开始到根据乘车得分历史确定保险费。

最后,汽车行业的最终产品正在发生变化。需要新技能和关系的变革。电动车辆中的部件数量比传统汽油发动机的数量级低一个数量级。该行业很可能在其供应商基础上横向整合。在这种充满活力的情况下,承担开拓成本的早期推动者可能会在以后获得有利的标准和网络奖励。ADAS为传统参与者提供了一个机会,可以在此过渡期间采取较小但渐进的投注。

并非所有当前的智能手机都能够支持主动辅助算法所需的处理能力。然而,每年有三分之一的智能手机在新兴经济体中被取代。这为建立采用基于移动的驾驶员提供动力提供了强有力的理由。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 相约机器人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像识别
腾讯云图像识别基于深度学习等人工智能技术,提供车辆,物体及场景等检测和识别服务, 已上线产品子功能包含车辆识别,商品识别,宠物识别,文件封识别等,更多功能接口敬请期待。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档