跳到主要内容

让车跑起来(三):逐像素分车道线,以及三条路怎么选

这一章讲三件事: 第三条路怎么走 —— 给图上每一个像素判一个类别; 逐像素分类为什么那么贵,以及一个轻量模型怎么把它变便宜; 以及三条路到底怎么选 —— 这张对比表书没做过,是我们做的。 它在全书链条里的位置是第 11 级台阶的第三段,也是这本书的落点。 这一章的主走查还是那张车前道路图,只是这一次它的输出不是一个数,而是一张同尺寸的标注图。 遇到的生词都在当场解释。

1. 顶层全景

同一张车前道路图,三条路吐出来的东西:

路线一(12 章) ─▶ 一张只有 0 和 255 的二值图,再由人写的规则算出偏差
路线二(13 章) ─▶ **一个数**:+0.558
路线三(本章) ─▶ **一张和原图同尺寸的图**,每个像素上写着 0 / 1 / 2 / 3
(0 背景、1 实车道线、2 虚车道线、3 斑马线)

⇒ **同一张输入图,三种输出形状 —— 这就是三条路线的根本区别。**

图说:输出形状不同,后面接什么、要多少标注、要多少算力,全都跟着不同。
第 8 节那张对比表就是照这条线索排出来的。

这一章的全程:

① 先分清三种分割任务(第 2 节)—— 语义 / 实例 / 全景

② 数据要人一个多边形一个多边形地画(第 3 节)
│ ⚠ 几个会让人白干一天的坑

③ 逐像素分类为什么贵,双分支怎么治(第 4 节)

④ 走一遍:那张图的输出长什么样(第 5 节)

⑤ 部署换了硬件,而且装框架要对版本(第 6 节)

⑥ 这条链在书里断在哪儿(第 7 节)—— 要划准,不能含糊

⑦ 三条路怎么选(第 8 节)—— 这张表是我们做的

2. 「分割」是三件事,先分清

现象先行:第三种问法

第 12 章问的是「哪些像素是亮的」,第 13 章问的是「方向盘该打多少」。 这一章问的是第三种:「这个像素属于什么」。

书给的定义是:图像分割旨在把图像分成不同的区域,每个区域表示不同的对象; 按任务和输入数据类型的不同,细分成三种1:

任务干什么举个例子
语义分割对图像中每一个像素点做类别预测图上所有车道线像素都标成「车道线」,不区分是第几条
实例分割目标检测 + 语义分割:在每个预测框里勾出对应的「实例」左边那条是 1 号车道线,右边那条是 2 号,分开
全景分割两者都要:既检出全部目标,又区分同类别中的不同实例背景也要判类别,同类的不同个体也要编号

书还给了三者的关系:语义分割是图像分割方法的基础; 实例分割、全景分割是语义分割与目标检测算法融合的应用2 (书在后半句上带了个保留,原话是「在某种程度上其实是」)。

这本书做的是第一种 —— 语义分割。

这正是线上赛那 16000 张数据的形状

第 01 章讲过线上赛的数据集:16000 张车载影像, 标注是与原图尺寸相同的单通道灰度图,背景 0、实车道线 1、虚车道线 2、斑马线 3。

「单通道灰度图」在这里的意思要说清楚: 它不是给人看的图, 它是一张和原图一样大的表格,每个格子里写着一个类别编号。 0 到 3 这四个数在灰度图上看起来都是接近全黑的,肉眼几乎分不出来 —— 它是给程序看的,不是给人看的。(这一句是我们补的;书只说了存储方式。)

所以第 01 章那句「这是一个典型的图像分割任务」,到这一章才真正落地。

3. 数据:要人一个多边形一个多边形地画

这是这条路最大的成本,而书用了整整一节讲操作细节。

采集这一半和第 13 章一样

书说得很干脆: 用手柄控制小车运动,编写脚本以一定帧率读取摄像头画面保存下来; 数据增强的方法与 §10.3.2 相同,「这里不再赘述」3。 —— 也就是第 13 章那套:只做颜色变换,不做几何变换。

标注这一半是全新的、也是最贵的

第 13 章那条路的标签是开车开出来的,一分钟人工都不用。 这条路不行 —— 得有人对着每一张图,沿着车道线的边缘画闭合多边形。

一件容易混掉的事,先钉住: 上一节那 16000 张是线上赛主办方已经标好的, 拿到手就能训。这一节讲的是线下自己采数据的情形 —— 那一步得自己做。 书没有给这个自采项目的数据集规模(见第 10 节边界),下面出现的张数都是量级估计。

书用的工具是 LabelMe。操作流程4:

① 打开图片文件夹
② 点 Create Polygons,**沿着目标的边缘画一个闭合的多边形**
③ 输入或选择这个目标的类别
④ 一张图标完,下一张

⇒ 几千到上万张图,一张一张来。
(张数是量级估计,书没给这个自采项目的数据集规模。)

四个会让人白干一天的坑

书把这几条写得很实,值得一条条抄下来。

#后果
Save Automatically 要勾上不勾就得每张手动保存,漏一张就白标
Save With Image Data 要取消不取消的话,标注文件里会把整张图片的数据也塞进去,文件体积暴涨
手动标背景时,类别名必须写成 _background_书明说:否则格式转换会有问题
有孔洞的目标:先标外轮廓,再沿孔洞边缘画多边形,并把孔洞指定为特定类别(是背景就写 _background_)不这么标,孔洞会被算进目标里

书还给了一条默认规则:通常只需要标注前景目标并设置类别,其他像素默认作为背景5只有需要手动标背景时,③ 那条才用得上。

标完之后还有两步机械活

格式转换: 用配套工具把 LabelMe 产出的格式转成训练框架认的格式; 脚本会自动在输入目录下创建一个 annotations 文件夹放转换后的数据6

切分: 再跑一个脚本,生成 train.txtval.txttest.txt; 每一行是「一张原始图片的路径 + 空格 + 对应标注文件的路径」7

注意这里出现了第三个集合(测试集) —— 第 09 章讲过它和验证集的分工: 验证集用来调超参数、决定什么时候停;测试集只在最后用一次。 (书全书没有统一过这三个词的口径,这一句是我们补的。)

书还给了一个现成的参考数据集链接,读者可以直接下载8 —— 换句话说:书自己也知道这一步的人工成本高到大多数读者不会自己做一遍。

4. 逐像素分类为什么贵,以及怎么变便宜

这是本章的第一个承重点。

现象先行:一张图要判几次

第 13 章那个模型:一张 128×128 的图 ──▶ **1 个数**

这条路: 一张 128×128 的图 ──▶ **16 384 个判断**
(128 × 128,每个像素一个)

换成车上那只摄像头的原始尺寸 640×480:**307 200 个判断**。

图说:输出的规模差了四个数量级。
而且这些判断不能各算各的 —— 判断一个像素是不是车道线,
必须看它周围一大片长什么样。

书说得很直接:在语义分割领域,由于需要对输入图片进行逐像素的分类,运算量很大9

两条常规减负路,而且两条都伤精度

书把这件事讲得很干脆9。 (先说一个词:模型复杂度 —— 这个模型有多少层、每层多厚、一共多少个参数; 第 10、11 章那些参数账量的就是它。)

减负办法代价
减小图片大小最直接地减少运算量,但会导致图像丢失大量细节,从而影响精度
降低模型复杂度会减弱模型的特征提取能力,进而影响分割精度

⇒ 两条路都是拿精度换速度。这就是这一节要解决的困局。

BisenetV2 的解法:分两支

这是本章的第二个承重点。

书给的结构10:

┌──────────────────────────┐
│ **详细分支** │
│ 专注于捕获**精细的局部信息** │
输入图 ────────┬────▶│ (看得细,但看得窄) │──┐
│ └──────────────────────────┘ │
│ ▼
│ ┌──────────────────────────┐ ┌──────────┐
└────▶│ **语义分支** │─▶│ **BGA 层** │──▶ 输出
│ 专注于获取**全局上下文信息** │ │ 融合两支 │
│ (看得宽,但看得粗) │ └──────────┘
└──────────────────────────┘

图说:「上下文」就地解释 —— 一个像素周围那一大片的整体情况。
判断某个像素是不是车道线,光看它自己那个颜色不够,要看它在整条线上的位置。

**这个结构为什么绕开了上面那个困局:**
它没有在「细」和「宽」之间二选一,而是**让两条路各干各的,最后合起来** ——
详细分支不必看全局,所以可以保持高分辨率而层数很浅;
语义分支不必保细节,所以可以放心把图压小、把层数堆深。
**两边都不做妥协,妥协的成本被拆到了两条路上。**
(最后这一段是我们补的;书给了结构和目标,没有把这层道理点破。)

「BGA」是双边引导聚合层的缩写。 书说它是这个模型的关键组件, 通过权值的计算和特征的融合,实现了轻量级的信息交互,而不需要大量的参数11

书对整体的评价: 通过精巧的分支结构、轻量级的组件和适度的参数数量, 在保持较高分割质量的同时降低了模型的体积和计算复杂度, 所以它非常适合在资源受限的环境下部署,例如移动设备和嵌入式系统12

「嵌入式系统」就地解释: 装在某个设备里、只干一件固定活儿的小计算机 —— 车上那块板子就是。它的对立面是「通用计算机」(你的笔记本,今天写文档明天打游戏)。

一句实在的话:选模型要看条件,不是看谁强

书在挑模型时给的口径值得留: 套件里包含了 40 多种已经构建好的模型算法, 「在选择最合适的模型时,我们需要综合考虑任务难度、硬件条件等限制」13

这和第 11 章那条演进线正好互补: 第 11 章讲的是「一路怎么变强」, 这里讲的是「变强的那些你多半用不上,你要挑合得上你那块板子的」。

5. 主走查:同一张图,这一次输出一张图

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

━━ 输入 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

还是那张车前道路图。图上有:
· 一条实线车道线(左)
· 一条虚线车道线(右)
· 前方一片斑马线
· 其余是绿色地面和背景

━━ ① 标注(人干的) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

打开 LabelMe → 沿实线边缘画一个闭合多边形 → 类别选「实车道线」
→ 沿虚线的每一段各画一个 → 类别「虚车道线」
→ 沿斑马线画 → 类别「斑马线」
其余像素默认是背景,不用画

**这一张图花了多久?几分钟。乘以几千到上万张。**
(张数是量级估计,书没给这个自采项目的规模;
线上赛那 16000 张是主办方标好的,不用自己画。
对照:第 13 章那条路,这一步是 0 分钟。)

━━ ② 转成训练用的标注图 ━━━━━━━━━━━━━━━━━━━━━━━━━━

格式转换脚本把多边形「填」成一张**和原图同尺寸的单通道图**:

像素 (120, 400) 在实线上 → 写 **1**
像素 (480, 400) 在虚线上 → 写 **2**
像素 (320, 300) 在斑马线上 → 写 **3**
像素 (320, 450) 是绿地面 → 写 **0**

⇒ 一张 640×480 的标注图 = **307 200 个 0/1/2/3**

━━ ③ 训练 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

同一张原图送进 BisenetV2:
**详细分支**:保持高分辨率,认出「这里有一条亮边」
**语义分支**:把图压小、层数堆深,认出「画面下半部这一整条是车道线,
前方那一片横条纹是斑马线」
**BGA 层**:把两支合起来 —— 边界用详细分支的,类别用语义分支的

输出:每个像素上四个类别各自的可能性,取最大的那个当答案
像素 (120, 400):[0.02, **0.95**, 0.02, 0.01] → 判为 **1**(实车道线)
像素 (320, 450):[**0.98**, 0.01, 0.00, 0.01] → 判为 **0**(背景)
(这两组可能性是我们为演示编的,书没给具体数。)

损失:拿预测的那张图和标注那张图**逐像素比对**
—— 307 200 个像素,每个都算一笔交叉熵(第 09 章那把尺子),再求平均

━━ ④ 推理输出 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

跑在车上,吐出的是一张 **640×480 的标注图**,每个像素 0/1/2/3

━━ ⑤ 然后呢? ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

**书到这里就打住了。第 7 节专门讲这条链断在哪儿。**

━━ 三条路的输出摆在一起 ━━━━━━━━━━━━━━━━━━━━━━━━━━

同一张车前道路图 ——
路线一 ▶ 一张 0/255 的二值图(**哪些像素亮**)
路线二 ▶ 一个数 **+0.558**(**方向盘打多少**)
路线三 ▶ 一张 0/1/2/3 的标注图(**每个像素是什么**)

⇒ **这三种输出形状,就是三条路线的全部区别。**

这条走查里书给的: 四个类别编号与它们的含义、标注图和原图同尺寸且是单通道、 BisenetV2 的双分支结构与 BGA 层。 我们补的: 那几个像素坐标、那两组可能性、逐像素交叉熵这个说法 (书没有说这条路用的是什么损失函数 —— 配置在图片里)。

6. 部署:换了一块板子,而且装框架要对版本

这条路用的硬件不一样

前两条路跑在 EdgeBoard 上,这一条跑在 Jetson Nano 开发板上14书没有解释为什么换。 按第 4 节那笔运算量的账推,逐像素分类要更多算力。 (这一句推断是我们的,书没说。)

装框架这一步不是「照着敲命令」

书给的环境是:JetPack == 4.6.1、Python == 3.7.1; 然后要去官网文档的附录里,找与自己 JetPack 版本对应的预编译 whl 包14

「预编译包」就地解释:
软件通常要在你的机器上「编译」一遍(把源码翻译成这台机器能跑的指令)才能装。
**预编译包是别人替你编译好的成品** —— 但它只对特定的系统版本、
特定的 Python 版本、特定的芯片有效。

⇒ **所以版本对不上就是装不上,没有绕过去的办法。**
(「JetPack」是这块板子的官方系统包,版本号决定了里面的驱动和库是哪一代。)

装完之后进 Python 敲一句验证,输出这一行才算成功:
**「Your Paddle Fluid is installed successfully!」**

图说:「预编译包」和「JetPack」这两个词的解释是我们补的;
书给的是操作步骤和那句验证输出。

这一段的意义不在操作本身,在于它说明了一件事:

部署环境本身就是一项技术约束,不是「照着敲命令」。 板子的系统版本 → 决定能装哪个框架版本 → 决定能跑哪些模型。 这条链是从硬件往回长的,和第 01 章那条主线是同一条。

推理

把训练好的模型下载到板子上,解压,改推理脚本里的配置文件、模型、权重参数三个路径, 然后运行脚本调用摄像头推理15

和第 13 章那条路对照: 那边改的是「模型路径 + 摄像头编码」两项, 这边改的是「配置文件 + 模型 + 权重」三项 —— 本质是同一件事:告诉程序去哪儿找模型。

7. 这条链在书里断在哪儿(要划准)

这一节必须写清楚,因为含糊地说「书没讲控制」是不准确的。

书的最后一句话

借助推理输出的图像,辅以相关算法(如提取中心线),即可完成小车的自动巡航功能16

书说完这句就进习题了。

到底缺的是哪几步

完整的链条应该是:

① 一张图 ──▶ ② 分割图(每像素 0/1/2/3) ✅ 书讲了(本章)
② 分割图 ──▶ ③ 车道中心线 ❌ **书没讲**,只说「如提取中心线」
③ 中心线 ──▶ ④ 车偏了多少 → 该打多大转角 ❌ **书没讲**
④ 转角 ──▶ ⑤ 两个前轮的转速差 ✅ **书讲了** —— 第 02 章那个差速转向

图说:**缺的是中间两步,不是最后一步。**
最后一步(转角 → 左右轮转速)第 02 章给得清清楚楚。

第 ④ 步那个「怎么从偏差算出转角」在工程上有个标准答案,叫 PID 控制器 —— 而这本书里,PID 只出现在第 4 章的一道习题和第 10 章一道选择题的答案里,正文零讲解。 (这是我们查全书之后的结论。)

但这不是书的疏漏

第 01 章讲过书自己给的那张图:整条自动驾驶链是「感知 → 决策 → 控制」, 而这本书和这场比赛只做感知那一段。

判断(我们的,不是书里的):这条链断在中间是范围问题,不是遗漏。 依据是书自己给的那张八项关键技术的图 —— 它把感知、决策、控制列成了三段, 而全书十一章从头到尾没有出现过一个控制器。书的范围就到感知为止。

但代价要说清楚:第三条路走完,你手上只有一张标好类别的图,车还不会动。 第一条路和第二条路都走到了「车动起来」,只有这一条没有。

如果错,会错在: 如果赛事的配套资源包里已经附了从分割图到转角的现成程序 (就像第 12 章那个 follow.py),那么对参赛者来说这条链并不断,只是书没写在纸上。 判据是:资源包里有没有这一段 —— 我们看不到那个包。

8. 三条路怎么选(这张表是我们做的)

书把三条路并排讲了,但从来没有做过比较。这一节是我们补的。

六个维度并排看

路线一 颜色阈值路线二 回归转角路线三 语义分割
要不要训练模型不要
要不要人工标注不要不要(标签是开车开出来的)要,而且最贵 —— 一张图画几个多边形,乘以上万张
数据从哪来不需要数据人遥控车跑,同时记转角人遥控车跑,然后再花几十上百小时标
输出是什么一张 0/255 的二值图一个 −1 到 1 的数一张同尺寸的 0/1/2/3 标注图
换个场地要重做什么重调那组阈值(人拖滑块)重采数据 + 重训重采 + 重标 + 重训
书用的板子EdgeBoardEdgeBoardJetson Nano(换了硬件)
走到车动起来了吗✅ 走到了✅ 走到了书里断在中间(第 7 节)

表里那个「上万张」和「几千帧」都是量级估计,不是书给的数 —— 书没给过这三个项目里任何一个的数据集张数。(唯一给了张数的是线上赛那 16000 张, 而那批是主办方标好的,不构成读者的标注成本。)

成本落在谁头上 —— 这才是选路的真正依据

路线一的成本 ──▶ **落在现场的人身上**
每换一次光照、场地、地图布,就得有人坐下来重调一遍参数

路线二的成本 ──▶ **落在开车的人身上**
得有人真的把车开出几千帧带转角的图,而且要开得顺滑

路线三的成本 ──▶ **落在标注的人身上,外加一块更贵的板子**
得有人对着上万张图一个多边形一个多边形地画

图说:**三条路的区别不在精度,在于成本落在谁头上。**
这三种成本你手上有哪一种,答案就是哪一条路。

什么时候选哪一条(我们的建议)

情况选哪条为什么
场地固定、光照稳定、没有人力路线一不用数据、不用训练,当场就能跑;它唯一的死穴(环境变化)在这种场合不会发生
有人能开车,而且只需要「车沿线跑」路线二标注成本为零,输出直接就是要的那个数,中间不用自己拼
需要知道车道线具体在哪儿、要区分虚线实线斑马线路线三只有它给得出这个信息;前两条路都给不出「这是虚线还是实线」
板子算力紧张路线一或二路线三运算量高一个量级,书自己也换了硬件

判断(我们的,不是书里的):三条路不是「越往后越先进」,是三种不同的取舍。 依据是上面那张表本身 —— 路线一在「换个场地」这一栏最差,但在「要不要标注」 和「算力」两栏最好;路线三反过来。没有一条在所有栏都占优。

一句更硬的话:如果你的任务只是「让车沿线跑」,路线二在这三条里性价比最高 —— 它是唯一一条既不用人工标注、又能适应光照变化的路。

如果错,会错在: 如果比赛还要求识别车道线的类别(虚线/实线/斑马线), 那路线二根本不够用,这条建议就不成立 —— 而 2023 年的线上赛恰恰就是这么要求的 (第 01 章讲过)。判据是:这个任务除了转角之外,还需不需要别的输出。

9. 作者的判断与证据

说法是哪一类
三种分割任务的区分有证据,教科书式的共识,书的表述准确
标注流程与那四个坑有证据(现场经验),是这一节最有用的部分
逐像素分类运算量大;两条减负路都伤精度有证据,推理清楚 —— 这是这一节的立论基础
BisenetV2 的双分支与 BGA 层有证据(结构描述准确),但书没有给任何量化对比:比别的模型快多少、精度差多少,一个数都没有
「选模型要综合考虑任务难度、硬件条件等限制」有证据,而且是一句很实的口径
部署换成 Jetson Nano有证据(事实),但书没有解释为什么换
版本要对上才装得上有证据(操作事实)
「辅以相关算法(如提取中心线),即可完成自动巡航」作者的一句带过。 这一步书没有讲,链条断在这里(第 7 节)
双分支「为什么绕开了那个困局」不在书里,是我们补的。书给了结构和目标,没有点破这层道理
三条路的对比表完全是我们做的。 书把三条路并排讲了,从来没有比较过
这条链断在中间是范围问题不是遗漏我们的判断,依据是书自己给的那张感知/决策/控制的图(第 01 章)

10. 边界与局限

  • 这一章对应原书 §10.4,外加一节我们自己的对比。
  • 书没有给这条路的任何量化结果。 没有分割精度、没有推理速度、没有实车表现 —— 前两条路至少还有定性的实测结论,这一条连定性的都没有。
  • 书没有给这条路的损失函数和训练参数。 它说配置在「训练过程相关」那张图里,而那是图片。
  • 书没有解释为什么换成 Jetson Nano。 我们从运算量推断,但书没说。
  • 从分割图到转角那两步,书没有讲(第 7 节已划清是哪两步)。
  • PID 控制器在这本书里只出现在两道习题里,正文零讲解。 它正是第 7 节缺的那一步的标准答案。(补充:不在书里,来自通用知识。)
  • 书没有给这个自采项目的数据集规模。 它只讲了怎么采、怎么标,没说标多少张。 正文里出现的「几千到上万张」都是量级估计。书里唯一给了张数的是线上赛那 16000 张, 而那批是主办方用连通域标注法标好的、拿到就能训,不是读者的人工成本。
  • 书没有讲标注质量怎么控。 上万张图多半是多人分头标的, 不同人画的边界松紧不一样,这会直接变成模型的误差 —— 书一个字没提。 (补充:不在书里,来自通用知识。)
  • 书没有代码。 项目在一个在线平台上,书里只给了链接17

11. 可带走的

全章主走查一行写完:

同一张车前道路图 → 人在 LabelMe 里沿边缘画闭合多边形、选类别(几分钟一张, 乘以几千到上万张 —— 张数是量级估计,书没给)→ 转换脚本填成一张同尺寸单通道标注图 (实线像素写 1、虚线写 2、斑马线写 3、其余写 0,一张 640×480 就是 307 200 个数)→ 送进 BisenetV2:详细分支保分辨率认边界、语义分支压小图认全局、 BGA 层把两支合起来 → 每个像素吐四个可能性,取最大的 (某个车道线像素:[0.02, 0.95, 0.02, 0.01] → 判为 1)→ 逐像素比对算损失 → 推理输出一张 640×480 的 0/1/2/3 标注图

然后书就打住了 —— 从这张图到方向盘,书没有讲。

  1. 第三种问法:不问「哪些像素亮」,不问「方向盘打多少」,问「这个像素属于什么」;
  2. 分割是三件事: 语义分割(每像素判类别)、实例分割(还要分清是第几个)、 全景分割(两者都要);这本书做的是第一种;
  3. 线上赛那 16000 张数据的标注就是这个形状 —— 和原图同尺寸的单通道图, 它是给程序看的,不是给人看的;
  4. 这条路最大的成本是标注: 一张图画几个多边形,乘以几千到上万张(量级估计,书没给); 对照第 13 章那条路 —— 那里这一步是零;
  5. 四个坑记下来: 自动保存要开、把图像数据一起存要关、 手标背景必须写 _background_、有孔洞的先标外轮廓再画孔洞;
  6. 逐像素分类贵在输出规模: 一张 640×480 的图要做 307 200 个判断;
  7. 常规的两条减负路都伤精度: 缩小图片丢细节,削减模型削弱特征提取;
  8. BisenetV2 的解法是分两支 —— 详细分支保细节、语义分支保全局,BGA 层融合。 它不是二选一,是把妥协的成本拆到两条路上;
  9. 选模型要综合考虑任务难度和硬件条件 —— 第 11 章那些强模型,你多半用不上;
  10. 部署环境本身就是技术约束: 板子的系统版本决定框架版本,版本对不上就是装不上;
  11. 这条链在书里断在中间 —— 缺的是「分割图 → 中心线」和「中心线 → 转角」这两步; 最后一步(转角 → 两轮转速)第 02 章给过了;
  12. 三条路的区别不在精度,在于成本落在谁头上 —— 路线一落在现场调参的人身上,路线二落在开车的人身上,路线三落在标注的人身上;
  13. 没有一条路在所有维度上占优。 你手上有哪一种成本,答案就是哪一条路。

12. 原文地图

主题原书章原文位置
三种分割任务的区分第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:277(搜「对图像中每一个像素点进行类别预测」)
语义分割是基础;两大类算法;选了 BisenetV2第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:279(搜「语义分割是图像分割方法的基础」)
采集与增强同 §10.3.2第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:289(搜「具体方法与10.3.2节中的数据增强方法相同」)
标注工具与画多边形的操作第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:305(搜「沿着目标的边缘画闭合的多边形」)
两个勾选项(自动保存 / 不存图像数据)第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:303(搜「Save Automatically」)
_background_ 那个坑;有孔洞的目标怎么标第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:311(搜「类别必须设置为_background_」) · text/11-ch10.txt:313(搜「再沿孔洞边缘画多边形」)
格式转换会生成 annotations 文件夹第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:323(搜「annotations」)
切分脚本生成三个 txt;每行的格式第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:331(搜「将在数据集根目录下生成train.txt」) · text/11-ch10.txt:335(搜「中间使用空格隔开」)
参考数据集链接第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:339(搜「参考的图像分割数据集链接」)
选模型要综合考虑任务难度、硬件条件第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:343(搜「综合考虑任务难度、硬件条件等限制」)
逐像素分类运算量大;两条减负路各自的代价第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:347(搜「减小图片大小和降低模型复杂度」)
双分支结构与 BGA 层第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:349(搜「详细分支」) · text/11-ch10.txt:353(搜「BGA层是BisenetV2模型的关键组件」)
轻量化设计适合资源受限环境第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:355(搜「资源受限的环境下进行部署」)
不附代码,只给在线项目链接第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:361(搜「在本书中就不做过多呈现」)
部署换成 Jetson Nano;JetPack 4.6.1;预编译包要对版本第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:379(搜「Jetson Nano开发板」) · text/11-ch10.txt:393(搜「installed successfully」)
推理:改三个路径,调摄像头第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:399(搜「修改推理脚本中的配置文件、模型、权重参数等路径」)
书的最后一句:「辅以相关算法(如提取中心线)」第10章 智能车自动巡航算法设计及部署text/11-ch10.txt:409(搜「辅以相关算法」)

Footnotes

  1. 出处:「第10章 智能车自动巡航算法设计及部署」第 277 段(text/11-ch10.txt:277,搜「对图像中每一个像素点进行类别预测」)。原文同段给了三种分割任务的完整区分。

  2. 出处:「第10章 智能车自动巡航算法设计及部署」第 279 段(text/11-ch10.txt:279,搜「语义分割是图像分割方法的基础」)。原文还说图像分割和目标检测一样,分传统方法与基于深度学习的方法两大类。「标注图是给程序看的不是给人看的」这一句是我们补的。

  3. 出处:「第10章 智能车自动巡航算法设计及部署」第 289 段(text/11-ch10.txt:289,搜「具体方法与10.3.2节中的数据增强方法相同」)。采集方式见第 285 段。

  4. 出处:「第10章 智能车自动巡航算法设计及部署」第 305 段(text/11-ch10.txt:305,搜「沿着目标的边缘画闭合的多边形」)与第 303 段(text/11-ch10.txt:303,搜「Save Automatically」)。原文列的可选工具还有 EISeg 交互式分割标注工具。

  5. 出处:「第10章 智能车自动巡航算法设计及部署」第 311 段(text/11-ch10.txt:311,搜「类别必须设置为_background_」)与第 313 段(text/11-ch10.txt:313,搜「再沿孔洞边缘画多边形」)。

  6. 出处:「第10章 智能车自动巡航算法设计及部署」第 323 段(text/11-ch10.txt:323,搜「annotations」)。

  7. 出处:「第10章 智能车自动巡航算法设计及部署」第 331 段(text/11-ch10.txt:331,搜「将在数据集根目录下生成train.txt」)与第 335 段(text/11-ch10.txt:335,搜「中间使用空格隔开」)。验证集与测试集的分工是我们补的通用知识,书全书没有统一过这三个词的口径。

  8. 出处:「第10章 智能车自动巡航算法设计及部署」第 339 段(text/11-ch10.txt:339,搜「参考的图像分割数据集链接」)。

  9. 出处:「第10章 智能车自动巡航算法设计及部署」第 347 段(text/11-ch10.txt:347,搜「减小图片大小和降低模型复杂度」)。原文把两条减负路各自的代价都写清楚了:缩小图片丢细节影响精度,降低复杂度削弱特征提取能力也影响精度。 2

  10. 出处:「第10章 智能车自动巡航算法设计及部署」第 349 段(text/11-ch10.txt:349,搜「详细分支」)。原文:一个分支专注于捕获精细的局部信息(详细分支),另一个专注于获取全局上下文信息(语义分支),最后通过双边引导聚合(BGA)层融合。「这个结构为什么绕开了那个困局」是我们补的。

  11. 出处:「第10章 智能车自动巡航算法设计及部署」第 353 段(text/11-ch10.txt:353,搜「BGA层是BisenetV2模型的关键组件」)。

  12. 出处:「第10章 智能车自动巡航算法设计及部署」第 355 段(text/11-ch10.txt:355,搜「资源受限的环境下进行部署」)。「嵌入式系统」的解释是我们补的通用知识。

  13. 出处:「第10章 智能车自动巡航算法设计及部署」第 343 段(text/11-ch10.txt:343,搜「综合考虑任务难度、硬件条件等限制」)。原文说套件里包含 40 多种已构建好的模型算法。

  14. 出处:「第10章 智能车自动巡航算法设计及部署」第 379 段(text/11-ch10.txt:379,搜「Jetson Nano开发板」)与第 393 段(text/11-ch10.txt:393,搜「installed successfully」)。「预编译包」和「JetPack」的解释是我们补的通用知识;书没有解释为什么这条路换了硬件。 2

  15. 出处:「第10章 智能车自动巡航算法设计及部署」第 399 段(text/11-ch10.txt:399,搜「修改推理脚本中的配置文件、模型、权重参数等路径」)。

  16. 出处:「第10章 智能车自动巡航算法设计及部署」第 409 段(text/11-ch10.txt:409,搜「辅以相关算法」)。原文同段还提到 Nano 性能不足时可以做模型轻量化,并指向 §11.2.5(我们的第 16 章)。PID 在全书只出现在两道习题里:第 4 章(text/05-ch04.txt:377,搜「PID」)与本章习题的答案(text/11-ch10.txt:427,搜「PID控制」)。

  17. 出处:「第10章 智能车自动巡航算法设计及部署」第 361 段(text/11-ch10.txt:361,搜「在本书中就不做过多呈现」)。在线项目地址在第 365 段。