跳到主要内容

让车跑起来(一):不训练模型的那条路

这一章讲三件事: 从这里开始有三条并列的路,而这本书三条全走了、还全都装到了实车上; 第一条路一个模型都不训,靠颜色把车道线挑出来; 以及这条路真正的代价 —— 换个光照就得重调一遍,参数是人拿滑块试出来的。 它在全书链条里的位置是第 11 级台阶的第一段:前十章都在铺路,从这一章起才是「让车真的跑」。 这一章的主走查是一张 640×480 的车前道路图,从进来一路走到两个前轮的转速差。 遇到的生词都在当场解释。

1. 顶层全景

同一个任务:让小车沿着车道线自己跑一圈

┌─ 路线一(本章) 一个模型都不训。车道线周围铺了绿色,
│ 那就按颜色把它挑出来 → 算偏差 → 转成角速度

├─ 路线二(13 章) 训一个卷积网,吃一张图,直接吐出那个 −1 到 1 的数

└─ 路线三(14 章) 训一个卷积网,给图上每一个像素判一个类别,
再从中间抠出中心线

⇒ **三条路在这本书里全部走完了,而且都真的装到了实车上。**
这是它在整个书架上不可替代的地方。

图说:三条路的输入完全一样(一张车前道路图),输出的形状完全不同。
三条路怎么选,第 14 章有一张我们做的对比表。

本章这一条路的全程:

一张 640×480 的车前道路图

│ ① 转成灰度图 —— 第 04 章讲过

问题来了:图里除了车道线,还有标识物、障碍物、背景 (第 3 节)

│ ② 挖一个梯形的**蒙版**,把不关心的地方挡掉 (第 4 节)

剩下的那一块叫**感兴趣区域**

│ ③ 在 HSV 上定一组**阈值**,把车道线挑出来 (第 5 节)

一张只有 0 和 255 的二值图,里面只剩车道线

│ ④ 由它算出「车偏了多少」,乘上一个比例 (第 7、8 节)

一个角速度 →(折成 −1 到 1 的转角)→ 两个前轮的转速差 → 车拐了
↑ 这层换算书没给 ↑ 第 02 章讲过

图说:这条链上**没有任何一个数是学出来的**。
② 的梯形顶点、③ 的六个阈值、④ 的那个比例,全部是人坐在那儿一点点调的。

2. 为什么这么朴素的办法居然够用

先说这条路的前提:赛场是特意布置过的

这是全章最要紧的一句话,漏了它,后面每一步都会显得像巧合:

2023 年那一届的地图场景,是用绿色把车道线与图像背景分隔开的1

换句话说:赛场自己帮了大忙。 车道线周围铺了一层和它颜色差别很大的绿, 于是「把跟周围颜色不一样的那几条挑出来」就够用了。

书还给了这条路成立的第二个条件:比赛规则允许—— 规则允许用传统图像处理的方法、训练深度学习模型的方法、或者图像分割技术 来完成车道巡航任务1三条路都是合规的,不是走捷径。

这场比赛在模拟什么

书把这件事放到了一个更大的坐标里2:

自动驾驶车辆常使用纯视觉方案来检测车道线,例如特斯拉和 Mobileye 的纯视觉自动驾驶方案。 这场比赛用摄像头感知周围环境,可以将其理解为对现实世界纯视觉感知方案的模拟

「纯视觉方案」就地解释: 车上只装摄像头,不装激光雷达、不装毫米波雷达, 所有关于「周围有什么、路在哪儿」的判断都从图片里得出来。 它的对立面是「多传感器融合」 —— 摄像头 + 雷达一起用,互相印证。 (这两条路线各自的取舍,书没有展开,我们也不在这里展开。)

书还提了一句这条路上别的办法: 除了本节要讲的颜色阈值分割, 还有边缘检测、大津法、霍夫变换、最小二乘法拟合等等3书选了最简单的那一种,并且明说「本节只介绍最基本的原理」4

3. 第一步之后就卡住:灰度图里不止车道线

这是本章的承重点,而且它是这条路上第一个真问题。

现象先行:转成灰度,然后呢

第 04 章讲过怎么把彩色图转成灰度图 —— 三个通道压成一个 0—255 的亮度值。

书拍了一张车前的实景图,转完灰度之后指出: 除了车道线之外,场景中还有很多别的对象 —— 车道两旁的标识物、障碍物、地图场景的背景元素5

这些东西在灰度图上是什么样?和车道线一样,就是一堆 0—255 的数。 灰度值不认识「这是车道线、那是路牌」。

拿具体的数看这个问题有多硬

(下面这组像素值是我们为演示编的 —— 书的图片本体不在清洗文本里。)

同一张图上取三个点,先看它们的彩色值(按第 04 章讲的 OpenCV 顺序:蓝、绿、红):

A 黄色车道线上一点 (B= 40, G=200, R=230)
B 旁边的绿色地面 (B= 70, G=180, R= 60)
C 路边一块白色标识物 (B=238, G=240, R=242)

转成灰度(用通用的加权公式 0.299×红 + 0.587×绿 + 0.114×蓝):

A → 0.299×230 + 0.587×200 + 0.114×40 = 68.8 + 117.4 + 4.6 = **191**
B → 0.299× 60 + 0.587×180 + 0.114×70 = 17.9 + 105.7 + 8.0 = **132**
C → 0.299×242 + 0.587×240 + 0.114×238 = 72.4 + 140.9 + 27.1 = **240**

现在试着定一条灰度阈值,想只留下车道线:

阈值取 160 ⇒ A(191)过,B(132)不过 ✓ 但 C(240)也过了 ✗
阈值取 200 ⇒ C(240)过,而 A(191)自己反倒不过 ✗✗

⇒ **无论阈值定在哪儿,那块白色标识物都比车道线还亮,挡不掉。**

图说:这就是书说的「有必要找到一种方法来忽略图像中的无关物体」。
**注意问题不在阈值定得不好,在于灰度这个维度上,白牌子和黄线本来就分不开。**

两条出路,书两条都用了:

出路做什么在哪一节
在空间上排除白牌子在画面上方,车道线在下方 —— 把上方整块挡掉第 4 节(蒙版)
在颜色上排除白牌子几乎没有颜色,黄线颜色很纯 —— 换一套坐标来判第 5 节(HSV 阈值)

4. 蒙版:把不关心的地方直接挡掉

书给的定义,朴素得让人放心

蒙版是一个 numpy 数组。 当需要对图像中的一部分进行遮盖时, 只需将图像中对应区域的像素值改为 0 或 255,或任何数字5

第 04 章埋的那个账在这里还了:「蒙版就是一个 numpy 数组」—— 不是什么新东西,就是第 04 章那种「一堆同类型的数,可以整块一起算」。

蒙版长这样(和原图一样大,640×480):

关心的位置 → 写 255
不关心的位置 → 写 0

用法也朴素:**两张图对应位置相乘,再除以 255**
原图那个点 191 × 255 ÷ 255 = 191 (留住了)
原图那个点 240 × 0 ÷ 255 = 0 (抹掉了)

图说:所以蒙版不是什么图形学操作,就是一次逐像素的乘法。
(乘完除以 255 这个写法是我们补的;书只说了「把对应区域的像素值改为 0 或 255」。)

蒙版为什么挖成梯形

书给的理由是一句物理事实:

由于摄像头角度的影响,车道线所在区域通常为近大远小的梯形区域5

摄像头架在车头,斜着往前看 ——

画面上方 = 远处 车道在这里挤成窄窄一条
画面下方 = 近处 车道在这里铺得很宽

┌──────────────────────┐ y=0 (远)
│ │
│ ╱────╲ │ y=260 ← 梯形的上底,窄
│ ╱ ╲ │
│ ╱ ╲ │
│ ╱ ╲ │
└────╱────────────╲────┘ y=480 ← 梯形的下底,宽(近)
0 640

我们给它四个顶点(这组坐标是为演示编的,书没给具体数):
(0, 480) (640, 480) (420, 260) (220, 260)

图说:**梯形不是为了好看,是为了配合透视。**
挖成矩形的话,上半部分会把远处的天空、路牌、观众全框进来;
挖成梯形,那些东西自动在框外。

套上蒙版之后剩下的那一块,书叫感兴趣区域(常写作 ROI,Region of Interest)6这个缩写你出门会撞见 —— 任何一份图像处理的文档、任何一个检测模型的说明里都有它。

上一节那个白色标识物,到这里已经被挡掉了 —— 它在画面上方 y=180 的位置,在梯形之外。

5. 阈值:为什么调的是 HSV,不是 RGB

现象先行:光一变,数就全变了

假设你在灰度上或者在 RGB 上定阈值。 赛场的灯亮一点,同一条黄线的三个通道 会一起往上抬 —— 红绿蓝三个数全变了,你定的三条线全部失效。

书给的做法:在 HSV 上调,而且是拖着滑块试出来的

书没有讲原理,它讲的是现场怎么操作 —— 而这恰恰是这条路的真面目7:

① 启动校准程序,屏幕上出现**两个窗口**:
左边:摄像头原图
右边:处理后的二值图(只有黑和白)

② 再开一个终端,启动**参数调节器** —— 一排可以拖的滑块

③ **拖 HSV 那几个数,一边拖一边看右边那张二值图**,
直到车道线干干净净地留下、别的全变黑

④ 把调好的那组数字**手抄下来**,填进 follow.py 里对应的位置

图说:注意第 ③ 步的判据是「看着顺眼」。
**没有损失函数,没有梯度,没有训练 —— 判据是人的眼睛。**
这就是「不训练模型」这条路的字面意思。

为什么是 HSV(第 04 章埋的账在这里还)

第 04 章讲过三套色彩坐标各为谁而设: RGB 是为硬件设计的(屏幕上三种灯管各出多少力), HSV 是 1978 年为视觉感知设计的 —— 三个数分别是:

字母中文管什么
H色调是什么颜色 —— 红、黄、绿、蓝,排成一个圈
S饱和度颜色有多纯 —— 0 是灰的,越大越鲜艳
V亮度有多亮

关键就在于它把「是什么颜色」和「有多亮」拆成了两个数。

拿第 3 节那三个点换算成 HSV(这组数是我们为演示编的):

A 黄色车道线 H= 28 S=200 V=230
B 绿色地面 H= 60 S=150 V=180
C 白色标识物 H= 0 S= 10 V=240

定一组阈值:H 在 20—35 之间、S ≥ 100、V ≥ 120

A:H=28 ✓ S=200 ✓ V=230 ✓ → **过,留下**
B:H=60 ✗ → 挡掉(色调不对,它是绿的)
C: S= 10 ✗ → 挡掉(**几乎没有颜色,是灰白的**)

⇒ 三个点里只剩车道线。**而在灰度上,这三个点怎么都分不开。**

现在把赛场的灯调暗一点看看:
A 变成 H= 28 S=195 V=160 ← **H 几乎没变,只有 V 掉了**
同一组阈值:H=28 ✓ S=195 ✓ V=160 ✓ → **还是过**

图说:这就是 HSV 的全部价值 ——
**光照变化主要压在 V 上,而「是什么颜色」由 H 管,基本不受影响。**
你在 RGB 上定阈值,三个数会一起塌;在 HSV 上定,塌的主要是一个。

⚠ 但要老实说:这只是「不那么容易塌」,不是「不会塌」。 光照变化大到一定程度,S 和 H 也会漂。这就引出第 6 节那条代价。

6. 这条路的代价

先看书给的四条对策

书承认这套办法在图像上方检测不够准确,并给了四条对策8:

对策具体做什么代价
缩小感兴趣区域梯形挖小一点,只看更靠近车身的那一段看得更近,弯道来不及提前反应
调整阈值把那六个数再拖一遍人工,而且只对这个光照有效
使用滤波函数先做一次模糊,把零星的噪点抹掉细节也一起被抹掉
使用自适应阈值不用全图一个阈值,按每一小块各自的明暗定各自的阈值计算量上去了,而且参数更多

(第三、四条那两句「代价」是我们补的;书只列了对策名,没有讲每条的取舍。)

真正的代价书没有明说,但它就摆在流程里

判断(我们的,不是书里的):这条路真正的成本,是那组阈值不是模型的一部分, 而是「现场那一天那个光照下的一组常数」。

依据就是第 5 节那套操作流程本身:阈值是人拖着滑块调出来、手抄进代码里的。 所以只要下面任何一件事发生,就得回到第 5 节从头拖一遍: 换个场馆、换个时段(窗外的自然光变了)、开了另一组灯、 换一块新印的地图布(印刷色差)、甚至只是有人站在旁边挡了一片影子。

这不是这条路做得不好,这是这条路的定义。 它把「适应环境」这件事整个外包给了人。

如果错,会错在: 如果场地和光照完全固定(比如封闭实验室里跑一个固定演示), 那这条代价根本不会发生 —— 那种场合下这条路是最优解,又快又不用数据。 判据是:这个场地的光照条件,一年里会不会变。

这条判断在第 13、14 章会各被对照一次: 那两条路把成本换到了别处 —— 一条压在「得有人真的开车跑出几千张带转角的图」上, 一条压在「得有人一个像素一个像素地描边」上。第 14 章有一张三条路的完整对比表。

7. 实车上还要做三件事

这一节是全书唯一一段真实的调试现场,书写得非常实。

书的口径很明确:感兴趣区域和阈值是检测车道线的基础, 所以在启动巡线程序之前,首先要进行摄像头位置校准和颜色阈值校准9

校准一:摄像头位置

判据具体到可以照着做10:

① 把小车摆到**后轮刚好抵住起始框**的位置
② 调摄像头角度,直到画面里:
· **刚好能看到白色启动区域内的白色部分**
· **左右两条车道线的位置大致对称**

图说:为什么这两条判据是对的 ——
「刚好看到启动区」定的是**俯仰角**(镜头抬多高),它决定第 4 节那个梯形往哪儿挖;
「左右对称」定的是**偏航角**(镜头有没有歪),它决定第 8 节算出来的偏差有没有系统性的偏。
(这两句解释是我们补的;书只给了判据,没说它们各自管什么。)

校准二:颜色阈值

就是第 5 节那一套 —— 两个窗口、一个参数调节器、拖、抄、填。

校准三:巡线参数

书给了四个可调的数,而且交代了封装很好、只要改这几个地方11:

参数管什么
max_speed小车正常巡线时的速度
min_speed小车识别到地标之后的速度(要减速)
scale_1直行时,输出角速度的放大比例
scale_2转弯时,输出角速度的放大比例

为什么直行和转弯要用两个不同的比例(书没解释,我们补): 直行时只需要小幅修正,比例大了车会左右画龙; 转弯时需要打得狠一点,比例小了会冲出车道。一个数伺候不了两种工况。

实测:书说都过了

书的结论是:通过实车验证,小车在简单的直道、小幅度弯道、 路况复杂的十字路口、大幅度弯道等各种路况下都能完成对路径的良好跟踪12

注意这是一句定性的话 —— 书没有给成功率、没有给圈速、没有给失败案例。 (第 13 章那条路书给了具体的失败情形,这一条路没有。)

8. 主走查:一张图从进来到两个轮子转起来

这是本章的主走查。上面每个机制在它上面各占一步。

(除了「640×480」和最后那一步的机制,这条走查里的具体数字都是我们为演示编的 —— 书的图片本体不在清洗文本里,配套代码也不在书里。)

━━ 输入:一张 640×480 的车前道路图 ━━━━━━━━━━━━━━━━━━━━━━━

取三个点看它们的彩色值(蓝、绿、红):
A 黄色车道线 (40, 200, 230) 在画面下方,坐标约 (180, 440)
B 绿色地面 (70, 180, 60) 坐标约 (320, 440)
C 白色标识物 (238, 240, 242) 在画面上方,坐标约 (500, 180)

━━ ① 转灰度 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

A → **191** B → **132** C → **240**

⇒ 卡住了:C 比 A 还亮,**灰度阈值定在哪儿都挡不掉它**

━━ ② 挖梯形蒙版 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

四个顶点:(0,480) (640,480) (420,260) (220,260)
梯形内写 255,梯形外写 0

A 在梯形内 ✓ B 在梯形内 ✓ C 在梯形外 ✗

━━ ③ 套上去,得到感兴趣区域 ━━━━━━━━━━━━━━━━━━━━━━━━━━

逐像素相乘再除以 255:
A:191 × 255 ÷ 255 = **191** 留下
B:132 × 255 ÷ 255 = **132** 留下
C:240 × 0 ÷ 255 = **0** **抹掉了**

━━ ④ 在 HSV 上做阈值 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

换算成 HSV: A (28, 200, 230) B (60, 150, 180)
阈值:H 在 20—35、S ≥ 100、V ≥ 120

A 三项全过 → 写 **255**
B 色调 60 不在 20—35 → 写 **0**

━━ ⑤ 得到一张只有 0 和 255 的二值图 ━━━━━━━━━━━━━━━━━━━━

整张图上只剩两条车道线是白的,其余全黑

━━ ⑥ 由二值图算出偏差 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

在 y = 440 那一行横着扫过去,找白色像素:
左边那段白的中心 x = **180**
右边那段白的中心 x = **500**
⇒ 车道中心 = (180 + 500) ÷ 2 = **340**

画面中心 = 640 ÷ 2 = **320**

⇒ 偏差 = 340 − 320 = **+20 像素**
**车道中心在画面偏右 ⇒ 车本身偏左了 ⇒ 该往右打**

━━ ⑦ 偏差 × 比例 = 角速度 ━━━━━━━━━━━━━━━━━━━━━━━━━━━

这一段是直道,用 scale_1(设为 0.005):
角速度 = 20 × 0.005 = **0.1**,方向朝右

━━ ⑦′ 角速度折成 −1 到 1 的那个转角 ━━━━━━━━━━━━━━━━━━━

**这一步必须单列,因为两头不是同一种量:**
⑦ 吐出来的是**角速度** —— 车身每秒转多少,是发给底盘的控制量;
第 02 章那条差速规则吃的是**转角** —— 手柄摇杆那个 −1 到 1 的数。
**书没有给这一层换算。** 它只说 scale_1 是「直行时输出角速度的增大比例」,
没说这个比例把偏差放到了哪个区间。

我们这条走查按最省事的一种假设走:**scale_1 已经把偏差放缩进了 −1 到 1**,
于是这个 0.1 可以直接当转角用。**这是我们的假设,不是书给的。**
⇒ 转角 = **+0.1**(正数 = 往右)

━━ ⑧ 转角 → 两个前轮的转速差 ━━━━━━━━━━━━━━━━━━━━━━━

**这一步第 02 章已经走过了**:转角大于 0 就右轮减速、左轮不变,
减多少按转角的绝对值成比例(这条折算也是第 02 章补的,不是书给的)
基础转速 60 → 右轮降到 60 × (1 − 0.1) = **54**,左轮仍 **60**

⇒ **车往右挪回车道中心。下一帧重来一遍。**

⚠ 第 13 章那条路送进 ⑧ 的是模型最后一层 tanh 吐出来的转角(那一章走查里是 0.558),
**本来就是 −1 到 1 的数,不需要 ⑦′ 这一步。**
两章最终汇进同一步,但只有走完 ⑦′ 之后送进去的才是同一种量。

这条走查上每个机制各占哪一步:

机制哪一步
灰度不够用(承重点)① 那三个数,C 比 A 还亮
蒙版② 和 ③,C 被抹成 0
感兴趣区域(ROI)③ 之后剩下的那块梯形
HSV 阈值④,B 因为色调不对被挡掉
巡线参数⑦ 那个 0.005
角速度和转角不是同一种量⑦′
差速转向(第 02 章)

9. 作者的判断与证据

说法是哪一类
赛场用绿色分隔车道线与背景有证据(现场事实)。 这是这条路能成立的全部前提
蒙版是一个 numpy 数组;车道线是近大远小的梯形有证据,而且理由给得很实(摄像头角度)
图像上方检测不准的四条对策有证据(实践经验),但书没有讲每条的代价
三步校准的具体判据有证据,而且是全书最实的一段现场记录
「小车在各种路况下都能完成良好跟踪」作者的定性结论,没有给成功率、圈速或失败案例。 别当成量化结果引
「可以将其理解为对现实世界纯视觉感知方案的模拟」作者的类比,不是等价关系。 赛场的绿色分隔是特意布置的,真实道路上没有这一层帮助
这条路真正的代价(参数是人调的、换环境就要重调)不在书里,是我们从它自己的操作流程推出来的(第 6 节的判断块)
那三个像素点的具体数值、梯形顶点、HSV 阈值、偏差 20、比例 0.005不在书里。 书的图片本体和配套代码都不在,这些是我们为演示编的
为什么直行和转弯要用两个比例;两个校准角各管什么不在书里,是我们补的

10. 边界与局限

  • 这一章对应原书 §10.1 后半与 §10.2。 §10.1 前半(赛场、车模、两个任务)已经在第 01 章讲过, 这里不重讲。
  • 书自己划了范围:「本节只介绍最基本的原理,不再深入介绍进阶应用」4。 边缘检测、大津法、霍夫变换、最小二乘法拟合这几种做法,书只列了名字。
  • 从二值图到「偏差」这一步,书没有讲。 书讲到「得到车道线检测结果」就转去讲实车校准了。 主走查第 ⑥ 步是我们按配套代码里那几个参数的语义(scale_1 是「输出角速度的放大比例」) 反推出来的——既然有一个比例要乘,那前面必然有一个偏差量。
  • 从「角速度」到「转角」这层换算,书也没有讲。 书在这一节说的是角速度(发给底盘的控制量), 而第 02 章那条差速规则吃的是手柄那个 −1 到 1 的转角 —— 两者不是同一种量。 主走查第 ⑦′ 步那个换算是我们假设的,已在当场标明。
  • 书没有代码。 配套代码在赛事资源包里,书里只有截图。
  • 书没有给这条路的量化表现。 没有成功率、没有圈速、没有失败情形的分析。
  • 书没有讲摄像头畸变。 广角镜头拍出来的直线会弯,近大远小的梯形也不是严格的梯形。 实际工程里通常要先做一次标定校正。(补充:不在书里,来自通用知识。)
  • 书没有讲丢线怎么办。 如果某一帧二值图上一条白线都没有(比如过路口), 程序该怎么办,书一个字没提。

11. 可带走的

全章主走查一行写完:

640×480 的车前道路图 → 转灰度(车道线 191、地面 132、白牌子 240 —— 卡住了,白牌子比车道线还亮)→ 挖梯形蒙版(顶点 (0,480)(640,480)(420,260)(220,260))→ 套上去,白牌子被抹成 0 → 在 HSV 上定阈值(H 在 20—35、S ≥ 100、V ≥ 120): 车道线 (28,200,230) ,地面 (60,150,180) 色调不对被挡 → 二值图上只剩车道线 → 在 y=440 那一行:左线 180、右线 500,车道中心 340, 画面中心 320,偏差 +20 → 乘上直行比例 0.005 = 角速度 0.1 朝右 → 折成 −1 到 1 的转角 +0.1(这层换算书没给,是我们假设的)→ 右轮 60 降到 54、左轮仍 60

「640×480」和最后那一步的机制是书给的,其余数字是我们为演示编的。

  1. 同一个任务有三条并列的路,这本书三条全走了、还都装到了实车上 —— 这是它在整个书架上不可替代的地方;
  2. 第一条路成立的前提是赛场特意用绿色把车道线和背景分开了 —— 漏了这个前提,后面每一步都像巧合;
  3. 转成灰度之后会卡住:白色标识物比黄色车道线还亮 —— 问题不在阈值定得不好,在于灰度这个维度上它们本来就分不开;
  4. 两条出路,书两条都用:在空间上排除(蒙版)、在颜色上排除(HSV 阈值);
  5. 蒙版就是一个 numpy 数组 —— 关心的位置写 255、不关心的写 0,套上去就是一次逐像素乘法;
  6. 挖成梯形是因为摄像头斜着往前看,车道线在画面里近大远小; 剩下那块叫感兴趣区域(ROI),这个缩写出门到处都会撞见;
  7. 阈值在 HSV 上调,因为它把「是什么颜色」和「有多亮」拆成了两个数 —— 光照变化主要压在亮度上,色调基本不动;
  8. 调阈值的判据是人的眼睛 —— 两个窗口并排,拖滑块,看着顺眼就抄下来填进代码;
  9. 这条路真正的代价:那组阈值不是模型的一部分,是「今天这个光照下的一组常数」。 换场馆、换时段、换一块新地图布,都得重调;
  10. 实车上还要做三件校准: 摄像头位置(后轮抵住起始框、左右车道线对称)、 颜色阈值、巡线参数(正常速度、见地标后的速度、直行与转弯两个比例);
  11. 直行和转弯用两个不同的比例 —— 一个数伺候不了两种工况;
  12. 这条路上没有任何一个数是学出来的。 这既是它最省事的地方,也是它全部的代价所在。

12. 原文地图

主题原书章原文位置
赛场用绿色分隔车道线与背景;三条路都合规第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:39(搜「使用绿色将车道线与图像背景相分隔」)
纯视觉方案;特斯拉与 Mobileye;「对纯视觉感知方案的模拟」第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:37(搜「纯视觉自动驾驶方案」)
车道线检测还有哪些做法(只列了名字)第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:43(搜「霍夫变换」)
「本节只介绍最基本的原理」第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:73(搜「只介绍最基本的原理」)
灰度图里还有标识物、障碍物、背景;蒙版是一个 numpy 数组;近大远小的梯形第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:53(搜「蒙版是一个numpy数组」) · text/11-ch10.txt:53(搜「近大远小的梯形区域」)
套上蒙版得到感兴趣区域第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:57(搜「分割出感兴趣区域」)
图像上方检测不准的四条对策第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:63(搜「缩小感兴趣区域的范围」) · text/11-ch10.txt:69(搜「使用自适应阈值」)
每一帧反复做,实现实时检测第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:75(搜「实现实时车道线检测」)
校准的前提:ROI 和阈值是基础第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:79(搜「感兴趣区域和阈值是检测车道线的基础」)
摄像头位置校准的两条判据第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:89(搜「后轮刚好抵住起始框」)
颜色阈值校准:两个窗口 + 参数调节器第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:95(搜「另一个为处理后的二值图」) · text/11-ch10.txt:103(搜「调节参数调节器中的HSV数值」)
巡线四个参数:max/min speed、scale_1、scale_2第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:115(搜「max_speed为小车正常巡线时的速度」) · text/11-ch10.txt:121(搜「分别是小车在直行、转弯时输出角速度的增大比例」)
实测结论(定性)第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:133(搜「都能完成对路径的良好跟踪」)

Footnotes

  1. 出处:「第10章 智能车自动巡航算法设计及部署」第 39 段(text/11-ch10.txt:39,搜「使用绿色将车道线与图像背景相分隔」)。同一段还说明比赛规则允许三类做法:传统图像处理、训练深度学习模型、图像分割技术。 2

  2. 出处:「第10章 智能车自动巡航算法设计及部署」第 37 段(text/11-ch10.txt:37,搜「纯视觉自动驾驶方案」)。原文点名了特斯拉和 Mobileye。「纯视觉方案」这个词的解释以及它的对立面(多传感器融合)是我们补的通用知识。

  3. 出处:「第10章 智能车自动巡航算法设计及部署」第 43 段(text/11-ch10.txt:43,搜「霍夫变换」)。原文列的是:canny 边缘检测、大津法、霍夫变换、最小二乘法拟合等;书选的是最简单的颜色阈值分割。

  4. 出处:「第10章 智能车自动巡航算法设计及部署」第 73 段(text/11-ch10.txt:73,搜「只介绍最基本的原理」)。 2

  5. 出处:「第10章 智能车自动巡航算法设计及部署」第 53 段(text/11-ch10.txt:53,搜「蒙版是一个numpy数组」;同段搜「近大远小的梯形区域」)。原文先指出灰度图里除车道线外还有标识物、障碍物、背景元素,再给出蒙版的定义与梯形的理由。第 3、4 节那些具体像素值与坐标是我们为演示编的,书的图片本体不在清洗文本里。 2 3

  6. 出处:「第10章 智能车自动巡航算法设计及部署」第 57 段(text/11-ch10.txt:57,搜「分割出感兴趣区域」)。「ROI」这个缩写的英文全称是我们补的通用知识。

  7. 出处:「第10章 智能车自动巡航算法设计及部署」第 95 段(text/11-ch10.txt:95,搜「另一个为处理后的二值图」)与第 103 段(text/11-ch10.txt:103,搜「调节参数调节器中的HSV数值」)。原文:获得一组识别效果较好的参数,记录下来添加到 follow.py 程序中对应颜色阈值参数位置。HSV 三个分量各管什么在第 04 章已经讲过(原书 §6.4);第 5 节那组换算数值是我们为演示编的。

  8. 出处:「第10章 智能车自动巡航算法设计及部署」第 61—69 段(text/11-ch10.txt:63,搜「缩小感兴趣区域的范围」;text/11-ch10.txt:69,搜「使用自适应阈值」)。四条对策各自的代价是我们补的,书只列了名字。

  9. 出处:「第10章 智能车自动巡航算法设计及部署」第 79 段(text/11-ch10.txt:79,搜「感兴趣区域和阈值是检测车道线的基础」)。

  10. 出处:「第10章 智能车自动巡航算法设计及部署」第 89 段(text/11-ch10.txt:89,搜「后轮刚好抵住起始框」)。原文的两条判据:画面中刚好能看到白色启动区域内白色部分图像,且左右两条车道线位置大致对称。这两条各自校的是哪个角,是我们补的解释。

  11. 出处:「第10章 智能车自动巡航算法设计及部署」第 115 段(text/11-ch10.txt:115,搜「max_speed为小车正常巡线时的速度」)与第 121 段(text/11-ch10.txt:121,搜「分别是小车在直行、转弯时输出角速度的增大比例」)。「为什么直行和转弯要用两个比例」是我们补的。

  12. 出处:「第10章 智能车自动巡航算法设计及部署」第 133 段(text/11-ch10.txt:133,搜「都能完成对路径的良好跟踪」)。原文列的路况:简单的直道、小幅度弯道、路况复杂的十字路口、大幅度弯道。这是一句定性结论,没有给成功率或圈速。