从零开始的无人驾驶

ROI

一个比较简单的做法是利用computer vision技术从摄像头视角获取道路信息。然后是选取ROI(Region of Interest), 基本上就是选颜色 + 选区域。
选颜色比较接近直觉, 路上的线也就两种颜色,要么白线,要么黄线。 白线其实比较好找

color selection

但是黄线的话就不能直接用原图了。要先把原图分成RGB三层

yellow line

而黄色的线在蓝色那层是看不到的

RGB

(因为是互补色)

光的三原色

除了选颜色,选区域也是可以直接利用CV解决的问题。
从车头视角向前看,大部分像素都是没有用的。尤其是天空的部分。对于自动驾驶来说差不多等价于干扰信号,基本上可以直接过滤掉

车头视角
区域选择

Canny Edge Detection

下一步是使用边缘检测算法寻找边线。如果我们把视图当成一张灰度图来看待,那么每一条边其实都在明暗块交替的位置

通过计算亮度的变化,可以把原图转化成一张梯度图

然后再将结果锐化,得到亮度数值变化最大的像素点

实际上,在做Canny算法之前,要对图像做高斯平滑(Gaussian smoothing / Gaussian Blur) ,消除噪声和伪梯度点

直线检测

Hough Transform 是图像变化中的经典算法,主要用来寻找图像中符合某种特征的集合,说白了就是检测直线、圆、椭圆。

Hough变化要将笛卡尔坐标下的点变化到霍夫极坐标系,原来的点共线问题会由此转化计算成曲面在极坐标下的共点,效果上就是该算法对边缘间断不敏感。大致上是这个意思,实际操作的时候是统计累加空间里的局部最大值(峰值),以该峰值作为结果(所以说抗噪能力还是很强的)。

总结一下就是:
原图 -> 灰度图 -> 边缘检测 -> 直线检测 -> 过滤掉斜率过低的直线 -> 将最后结果叠加回原图

原图
灰度图&边缘检测
最后结果叠加回原图

Undistort and Transform

Distorition图像失真

理论上,只要不是针孔摄像机,基本都会存在图像失真的问题(透镜成像更快点,针孔相机这点上比不了)

图像失真会影响到道路检测(将直线判断成曲线),车辆检测(用CNN检测的时候,识别出来的车比实际更大或者更小)

由透镜引起的失真主要是两个:

  • 径向畸变(Radial Distortion)
    原因是光线穿过透镜的边缘时发生的偏转大于穿过中心发生的偏转

  • 切线畸变(Tangential Distortion)
    原因是光线穿过透镜之后并没有垂直打在成像平面上

Calibration校正

首先要对失真的程度进行测量,然后根据measurement的结果进行undistort

这个东西叫做chessboard pattern, 用的时候从不同的角度拍这个chessboard,利用的是每个方块的corner去校正 (图像要记得转成灰度图)

得到的结果其实只跟拍照的相机有关。对于每个的镜头,要单独做一遍这种校正。

Lane Curvature

解决道路弯曲(Lane Curvature)问题,实际上比较复杂。先要依次校正原图

lc

选取ROI

然后要进行视角转换(Perspective Transform)

最后根据俯视图(Top-down view) 用二次函数拟合行道线

Perspective Transform

由于Perspective的存在,2D图像存在近大远小的现象

这样会导致原本平行的行道线,出现汇聚的趋势

因此需要把视角转换成俯视

将行道线还原到平行


Self-Driving

Behavior Cloning

使用神经网络进行无人驾驶的理论基础来源于Imitation Learning (模仿学习)。行为克隆算是Imitation Learning的一种。思路倒是很简单,将人类驾驶作为基础数据全部收集下来,然后让神经网络去拟合数据。
这类端到端的解决方案基本上是一个路子,优点:简单且有效,缺点:受限于收集的数据。因为训练集总是有限的,如果出现了神经网络之前没见过的数据,那么效果就会很差。
一个比较经典的条件是天气,下雨天的路面跟晴天的路面不一样,有雾的天气下道路能见度也会对摄像头收集的数据有很大影响。

发表评论

电子邮件地址不会被公开。 必填项已用*标注