这篇文章是关于自动驾驶汽车车道检测的深度学习解决方案
即使在各种各样的条件下,人们也可以很容易地在道路上找到车道线。但是计算机并不容易。阴影,眩光,道路颜色的细微变化,线条的轻微障碍物……人们通常仍可以处理的所有事物,但计算机可能会遇到很大困难。
识别道路上的车道是所有人类驾驶员执行的一项常见任务,从而确保交通畅通并最大程度地减少与附近车道其他汽车相撞的机会。同样,自动驾驶汽车的执行也是至关重要的任务。事实证明,使用众所周知的计算机视觉技术可以识别道路上的车道标记。我们将介绍如何使用各种技术来识别和绘制车道内部,计算车道曲率,甚至估计车辆相对于车道中心的位置。
为了检测并绘制一个具有汽车当前所在车道形状的多边形,我们构建了一个由以下步骤组成的管道:
- 从一组图像中计算摄像机校准矩阵和失真系数
- 图像失真消除
- 聚焦于车道线的颜色和渐变阈值
- 通过透视变换产生鸟瞰图像
- 使用滑动窗口来查找车道线像素
- 拟合二阶多项式以识别组成车道的左右线
- 车道曲率和偏离车道中心的计算
- 图像上车道边界的变形和绘制以及车道曲率信息
相机校准和图像失真消除
当摄像机注视现实世界中的3D物体并将其转换为2D图像时,图像就会失真。这种转换并不总是完美的,变形会导致物体的外观尺寸,形状或位置发生变化。因此,我们需要纠正这种失真,以使摄像机能够准确看到图像。通过拍摄照相机的几张棋盘图像并使用cv2.calibrateCamera()函数来计算照相机校准矩阵,即可完成此操作。
为了计算摄像机的变换矩阵和失真系数,我们使用同一台摄像机在平面上的棋盘多张图片。OpenCV有一个称为findChessboardCorners的便捷方法,它将识别黑白方块相交的点,并以此方式对变形矩阵进行逆向工程。下图显示了在示例图像上找到的确定的棋盘角:
对原始图像进行失真校正
在步骤1中收集的摄像机校准数据可以应用于原始图像,以应用失真校正。图3显示了一个示例图像。可能难以看到应用失真校正的影响在原始图像与一个棋盘图像相比,但是如果你仔细看右边的图像进行比较,这种效应就更明显当你看白色的车已经稍微裁剪以及树木失真校正时应用。
对示例图像进行不失真处理之前和之后的结果
使用颜色变换,渐变等来创建带阈值的二进制图像。
该步骤背后的想法是创建一个图像处理管道,其中算法可以清楚地识别车道线。通过使用不同的渐变,阈值和色彩空间,有多种不同的解决方案。我在几幅不同的图像上尝试了许多这些技术,并使用了阈值,色彩空间和渐变的组合。我选择了以下组合来创建图像处理管道:HLS颜色空间中的S通道阈值和HSV颜色空间中的V通道阈值,以及用于检测车道线的渐变。最终的二进制阈值图像的示例如图4所示,其中车道线清晰可见。
应用渐变和阈值生成二进制阈值图像之前和之后的结果
应用透视变换以生成图像的“鸟瞰图”。
图像具有透视图,即使它们彼此平行,也可以使图像中的车道线看起来像是在一定距离处会聚。移除此透视图后,更容易检测车道线的曲率。这可以通过将图像转换为2D鸟瞰图来实现,其中车道线始终彼此平行。由于我们只对车道线感兴趣,因此我在原始未失真图像上选择了四个点,并将透视图转换为鸟瞰图,如下图5所示。
兴趣区域视角扭曲生成鸟瞰图
检测车道像素并拟合找到车道边界。
要检测车道线,有许多不同的方法。我使用的卷积是两个单独的信号的乘积:窗口模板和像素图像的垂直切片。我使用滑动窗口的方法来应用卷积,这将使每个窗口的热点像素的数量最大化。窗口模板从左到右滑过图像,任何重叠的值求和,创建卷积信号。卷积信号的峰值是像素重叠最高的位置,是车道标记器最可能的位置。方法已被用于识别车道线像素在矫正二值图像。已识别出左右线,并与曲线多项式函数拟合。用滑动窗口方法和多项式拟合重叠识别的线像素的示例图像如图6所示。
滑动窗口拟合结果
确定车道的曲率和车辆相对于汽车中心的位置。
我对车道线的位置进行了测量,并估计了道路弯曲的程度,以及车辆相对于车道中心的位置。我假设相机安装在汽车的中心。
将检测到的车道边界扭曲到原始图像上,并显示车道曲率和车辆位置的数值估计。
从校正图像的拟合已经被扭曲回到原始图像,并绘制识别车道边界。图7显示了正确识别的车道边界,并扭曲回到原始图像。图8显示了带有车道、曲率和从中心开始的位置的示例图像。
检测到的车道线与原图像以及曲率半径和汽车的位置重叠
最终结果
作者:Aniketkhosa
原文地址:https://aniketkhosa78.medium.com/lane-detection-for-self-driving-cars-4504f7b796b6
deephub翻译组