[自动驾驶]Advanced-Lane-Lines

前面有一个车道检测的项目,这个是高级版的。

计算机视觉
1. 摄像头:学习摄像头的物理知识,以及如何校准、反失真和转换图像角度。
2. 车道检测:研究可以应对弯道、恶劣天气和不同照明情况的先进车道检测技 术。
3. 实战项目:高级车道检测 在各种条件下检测车道线,包括不断变化的路面、弯道和变化的照明条件。使用 OpenCV、滤波器、多项式拟合和样条曲线(spline)实现摄像头校准和变换。

因为没有上课,看了这个提纲还是有点懵逼不知道具体指啥,所以先去翻了别人的博客https://chatbotslife.com/advanced-lane-line-project-7635ddca1960 写得还挺不错的。然后自己动手实现一把,如果直接看代码就没啥意思了。哎,这个项目都是些体力活。

摄像头校准

好吧,之前面试候选人的时候就听过这玩意,简单了解过。
我们常用的镜头会有畸变,所以需要校准一下,特别是对于需要从图像映射到真实尺寸的应用。校准的groundtruth就是一个方方正正的棋盘格。
[自动驾驶]Advanced-Lane-Lines_第1张图片
这么一看,校准还是挺明显的。不过换成车道其实没那么明显。所以默认这个矫正摄像头驱动不会做?
[自动驾驶]Advanced-Lane-Lines_第2张图片

顺便安利一个软件,可以方便对比两幅图。faststone
[自动驾驶]Advanced-Lane-Lines_第3张图片

具体怎么做,官方其实有个样例CarND-Camera-Calibration,不小心翻到的,没脑调一下库就可以。想了解细节具体可以看看opencv的文档。

高级车道识别

跟上次的比,高级在哪?

1.需要更鲁棒的检测,所以用了sobel边缘滤波器(搜过“opencv 边缘检测”肯定都看到过这玩意,只要x方向的,原因显而易见),可以把黄白车道抠出来后,再叠加这个sobel的结果。不过sobel会提取很多不是车道的边缘,这个难以避免。
[自动驾驶]Advanced-Lane-Lines_第4张图片
图片来自Image Gradients

2.Bird’s eye view鸟瞰图生成。其实就是一个投影变换。把车道前面的梯形区域拉伸成正方形,像头顶的小鸟看到的一样。
公司里开会后,白板上的会议纪要,可以用office lens直接把倾斜的白板矫正成方正的图。就是一个实际的应用。
教程看这里 https://www.pyimagesearch.com/2014/08/25/4-point-opencv-getperspective-transform-example/
[自动驾驶]Advanced-Lane-Lines_第5张图片

3.多项式拟合,之前项目里直接暴力用Hough line,因为离散化的缘故,本身直线也容忍一些弧度。其实车道本身是弯的。不过这就要求用鸟瞰图来做了。
多项式用numpy.polyfit 拟合,顺便看到poly1d这个函数也不错,会用上的。
当然,如果你只会用LR的库也是可以做的。
多项式拟合需要一些离散的点,而我们是非结构化的车道,这里有些恶心的活得干。

[自动驾驶]Advanced-Lane-Lines_第6张图片
我用提取车道的鸟瞰图,然后统计x轴方向按BIN_SIZE=10分桶(平滑作用),这10个像素的竖条中,车道像素的占比多少,然后再拍个阈值。定位到两条车道的起点。都是些numpy的基本操作,如果不熟悉,估计有点吃力。

然后就是分窗口,比如每100像素往上滑动,统计白色部分的点的x平均值,y平均值。用点技巧可以直接点乘矩阵,不用写for循环。

    region=img[j * HEIGHT: (j+1) * HEIGHT, offset_x: offset_x+WIDTH]
    region_active = region > 0
    active_cnt = np.sum(region_active)
    if active_cnt == 0:
        continue
    grid = np.array( [range(region_active.shape[1])] *region_active.shape[0] )
    mid_x=np.sum(grid*region_active)/active_cnt

多项式拟合好,剩下就是套公式算曲率半径curvature了,教程 https://www.intmath.com/applications-differentiation/8-radius-curvature.php

4.opencv写中文的问题。要用中文才显得本土化一点,虽然B格就降了。opencv默认支持不了,也懒得去折腾,用其他方法绕过去。
教程 http://python.lsd365.com/w/14579.html 写中文字符 记得字符串常量前面加u,比如u’中文’
msyh.ttf 顺手down一个https://github.com/chenqing/ng-mini/blob/master/font/msyh.ttf 。

5.尺寸映射。曲率半径,鸟瞰图的路径长度,车辆偏离车道检测,都依赖摄像机位置和图像实际尺度校准。都是些枯燥的体力活,但实际投产肯定得考虑的。课程项目也没有实际硬件,就不去费劲折腾了,比较随便拍脑袋拍一个就可以了。

最终成品

[自动驾驶]Advanced-Lane-Lines_第7张图片
嵌入不了视频,点图片可以跳转到视频

小结

总之这个项目都是些体力活,很多地方还是要人工定好超参数,鲁棒性一点都不好。
[自动驾驶]Advanced-Lane-Lines_第8张图片
比如这个case,sobelx把阴影也提取出来了,简直爆炸。

不想继续折腾了,这个项目当作熟悉熟悉传统cv的方法就够了。各种变态的case基本很难调到满意。所以就有另外一种思路,直接标好数据,告诉机器想要什么,让机器去学,这就是机器学习的思路了。不过标记数据确实又很费功夫。
跟做其他机器学习的项目其实有点像,你如果没有训练数据,暴力人工去撸规则是最快的,但只能解决一大部分case,corner case基本都要跪。但标记不了那么数据,又有啥办法么?

你可能感兴趣的:(机器学习)