跳到主要内容

认出路上的东西:目标检测怎么做、怎么打分

这一章讲三件事: 「认出路上的东西」其实是两件事合成的一件(框出在哪 + 说出是什么); 一个检测器一次同时做完这两件事的具体办法; 以及最要紧的一半 —— 怎么给它打分,以及为什么「准确率 99%」可能一文不值。 它在全书链条里的位置是第 12 级台阶:巡航讲完了,这是比赛的另一半任务。 这一章的主走查是一张同时含斑马线和指示牌的车前道路图,从模型吐框一路走到一个总分。 书在这一章印错了两个关键定义,我们在第 5 节当场改正。 遇到的生词都在当场解释。

1. 顶层全景

一张车前道路图

│ ① 一个卷积网从头到尾扫一遍,在**几个不同尺度**的特征图上分头找(第 8 节)

一堆候选框,每个带着「是什么类别」和「有多大把握」

│ ② 同一个东西上重复报的框,用**非极大值抑制**剔掉(第 8 节)

最终报出来的那几个框

│ ③ 拿它们和人标好的**真值框**逐个比对,靠**交并比**判是不是同一个东西

四个格子:报对了 / 报错了 / 没报也确实没有 / 漏报了 (第 5 节)

│ ④ 从四个格子算两个比值,再压成一个数

精确率、召回率 → P-R 曲线 → AP → mAP (第 6、7 节)

图说:①② 是「怎么做」,③④ 是「怎么打分」。
**这一章一半的篇幅在讲打分,不是因为凑数,是因为打分这件事本身有陷阱。**

2. 「认出路上的东西」是两件事

现象先行:第 09 章那个分类模型不够用

第 09 章那个模型能说「这张图里是汽车」。可车上要的不是这个。

车要知道的是:前面那块牌子在画面的哪个位置、离我多远、我该不该减速。 「图里有个牌子」这句话,车用不上。

书给的定义

目标检测的主要任务是判断数字图像中是否具有目标对象的区域, 并输出该区域的位置和该区域此目标对象的置信度。 因此,目标检测包含两个子任务:物体定位和物体分类1

「置信度」就地解释:模型对自己这次判断有多大把握,是一个 0 到 1 的数。 0.95 就是「我很确定」,0.40 就是「拿不太准」。它不是「正确的概率」,是模型自报的把握。 (这一句区分是我们补的。)

两个子任务在不同场景下侧重不同

书给的三个例子非常好记1:

场景侧重哪一个为什么
超市里的商品识别物体分类东西就摆在那儿,位置好找;难的是「这瓶到底是哪个牌子」
工厂里的消防检测物体定位火就是火,不用分类;难的是「在哪儿着的」
医疗领域的人体组织病变检测两个都要高既要说清是什么病变,又要说清在哪一块

智能车这边呢? 书给了两种典型应用: 识别可行驶道路与交通标志识别静态与动态障碍物(其他车辆、行人等)1这两种都属于「两个都要」那一格 —— 认出是「限速牌」还不够,还得知道它在左边还是右边。

第一道难关不是算法,是图像质量

书把挑战分成两类,而第一类完全和算法无关2:

图像质量的好坏根本上决定了目标检测结果准确性的上限。

书列的影响因素:

硬件这一头 ── 摄像头本身的成像能力

环境这一头 ── 光照、拍摄角度
恶劣天气:雨、雪、雾、霾、扬尘

目标这一头 ── 同一张图里,不同对象的**尺度大小**不一样
**密集程度**不一样(挤成一堆 vs 稀稀拉拉)
**遮挡程度**不一样(被挡住一半怎么办)

图说:注意「上限」这个词 —— 图糊了,再好的模型也认不出来。
这条对第 16 章那节「数据采集要分多个时间段、多种车速」是同一件事的两端。

3. 两代算法:分水岭在「特征是谁设计的」

现象先行:2018 年之前和之后不是一回事

书按「特征提取的方式」把二十年来的算法分成两大类3这个分法比按年份分好,因为它指出了真正的差别。

传统做法:人手工设计特征

书给的流程是三步4:

① 用滑动窗口、边缘检测、选择性搜索等方式,**找出可能有东西的候选区域**

② 用 **人工设计的特征** 对这些区域做表征与筛选
—— 书列的三种:Haar 特征、方向梯度直方图、SIFT 特征

③ 用线性分类器、SVM 分类器等对目标分类

图说:关键在第 ② 步的「人工设计」四个字。
「什么样的数值组合算是一张脸」,是研究者坐下来想出来、写成公式的。
**第 10 章那些卷积核是学出来的;这些是人写死的。**
(这三种特征的具体做法书只给了名字,我们也不展开 —— 它们在今天基本不用了。)

书对这一代的评价很平衡5:

模型的可解释性好 —— 每一步在算什么都写在公式里适应能力较差、模型较为复杂
随着样本数量的增加,模型的复杂程度也在增加,而准确度却没有明显提升

最后那条是致命的:给它更多数据,它不会变得更准。

深度学习做法:让网络自己学特征

书给的定义:通过大规模的数据样本进行深度神经网络训练,自动学习目标的特征并构建模型6

代价和好处也都给了5:

代价好处
要求相当规模的训练样本数量方法简单、方便增删分类数量、适应性好
模型训练对硬件算力的要求较高随着样本数量的增加,算法的准确度也逐渐提高

「方便增删分类数量」这条很实在: 比赛今年多加一种路标, 传统做法要重新设计一套特征,深度做法只要多标一批数据、把输出层改个数字。

而最后那条正好和传统做法反过来 —— 这才是这一代取代上一代的真正原因。

深度这一代内部又分两路

2018 年之前分两类,2018 年 CornerNet 提出之后多了一条新思路6:

路线怎么做代表
两阶段先选出候选区,再对候选区分类 —— 分两步走R-CNN → Faster R-CNN → Mask R-CNN
单阶段在一个阶段内同时完成定位和分类SSD 系列、YOLO 系列
Anchor Free书说它**「从严格意义上来说也是一类单阶段目标检测算法」**CornerNet(2018)

两阶段这一支怎么一路改过来的,书给了三代7:

R-CNN 首次引入并推广了两阶段做法,是「两阶段目标检测算法的鼻祖」
第一阶段用**选择性搜索**生成稀疏的感兴趣区域
第二阶段用深度模型对这些区域分类
│ 病:**训练速度慢、内存需求大** —— 因为选择性搜索是个独立的慢步骤

Faster R-CNN
**用一个全卷积网络替代选择性搜索**来生成候选区
⇒ 候选区这一步也变成了网络的一部分,可以一起训
│ 病:框给得准了,但框里那块区域被池化时对不齐

Mask R-CNN
用**感兴趣区域对齐层**替换了感兴趣区域池化层,进一步提高推理精度

图说:这条线的读法和第 11 章那条一样 —— **看箭头上的「病」。**
(「感兴趣区域」这个词第 12 章讲过:图上你关心的那一块。)

关键的取舍口径

书给的这句话决定了这本书后面的全部选择8:

两阶段目标检测算法具有更高的精度,但其检测速度难以满足实时性的要求。 单阶段目标检测算法相对于两阶段牺牲了些许精度,但其实时性的特点更受产业界青睐。

而车上要的正是实时。 所以书明说:后续将重点介绍单阶段目标检测算法和轻量化网络设计8

4. 数据格式:差别只在「文件怎么摆」

这一节很短,但省得你以后被两个名字吓到。

书给了两种主流格式9:

格式文件怎么摆
PASCAL VOC定义了数据存放的目录结构;一个 xml 文件对应一张图片,保存这张图的标注信息
COCO微软构建的大型基准数据集;整个训练集的标注信息都存放在一个 json 文件里

就这么一点差别。 一个是「一图一文件」,一个是「全部塞进一个文件」。 内容都是同一批东西:每个框的坐标、类别、图片名。

书还给了一条判断,而且很老实10:

数据集格式并没有优劣之分……随着硬件处理能力和效率的提高, 因数据集格式而带来的效率差异已经不那么重要,选择的主要依据已经转为 模型训练精度、自身的易用性、可移植性等。

⇒ 别在这上面纠结,挑你的工具链认的那个就行。

5. 四个格子,以及书在这里印错了

这是本章第一个承重点。而且是全书最需要当场改正的一处。

现象先行:「答对了没有」不是两种结果

你可能会以为模型的每次判断只有对错两种。实际上有四种,因为「有没有」这件事本身有两面。

书的设定:测试数据里包含 P 个正样本和 N 个负样本11「正样本」就是「这个东西确实在图里」,「负样本」就是「确实不在」。

┌──────────── 真相(这个东西到底在不在)───────────┐
│ 在(正样本) 不在(负样本) │
┌─────────────────┼──────────────────────────┬────────────────────┤
│ 模型 报了「在」 │ ✅ **报了,而且报对了** │ ❌ **报了,但根本没有**│
│ (判为正) │ **TP** │ **FP** │
├─────────────────┼──────────────────────────┼────────────────────┤
│ 模型 报了「不在」│ ❌ **有,却漏报了** │ ✅ **没报,也确实没有**│
│ (判为负) │ **FN** │ **TN** │
└─────────────────┴──────────────────────────┴────────────────────┘

图说:这张表叫混淆矩阵。**横着看是真相,竖着看是模型说的。**
记名字有个诀窍:**第一个字母说「模型这次对不对」(True / False),
第二个字母说「模型报的是哪一边」(Positive / Negative)。**
False Positive = 模型报了「有」,而这次报错了 ⇒ **根本没有,它硬说有**
False Negative = 模型报了「没有」,而这次报错了 ⇒ **明明有,它没看见**
(这个记法是我们补的;书只给了四个定义。)

⚠ 书这里把两个说明写反了

书的原文是这么列的11:

① 正样本识别为正样本(True Positive, TP) ✅ 对
② **正样本识别为负样本(False Positive, FP)** ❌ **错了**
③ 负样本识别为负样本(True Negative, TN) ✅ 对
④ **负样本识别为正样本(False Negative, FN)** ❌ **错了**

判断(我们的,不是书里的):书把 FP 和 FN 的中文说明互换了。 正确的是:FP = 负样本被识别为正样本;FN = 正样本被识别为负样本。

两条理由: ① 按上面那个命名规则,Positive 说的是「模型报的是哪一边」 —— False Positive 里的 Positive 指的是模型报了「正」,所以它必然是「本来是负、被报成正」; ② 更硬的一条:照书上的定义去推,书自己下一页那两个比值会全错。 书说召回率是「测试集中的正样本被正确预测为正样本的比例」12, 分母必须是「全部正样本」= TP + FN。 而按书那个错的定义,FN 是「负样本被识别为正样本」—— 那是个负样本, 加进「全部正样本」里根本说不通。

这条错误的严重程度是高的: 读者照书上的定义去算精确率和召回率, 两个数会完全反过来,而且他不会发现,因为公式本身看起来是对的。

如果错,会错在: 如果这是清洗文本的排版错位(比如两行序号被调换), 那书的印刷本可能是对的。判据是:纸质书这一段的四条序号顺序 —— 我们只有清洗文本。 但无论是印刷错还是转码错,读者拿到的那份是错的,所以必须当场改正。

6. 「准确率」是个陷阱

这是本章第二个承重点。

书给的定义和它的毛病

准确率 = 预测正确的样本数量 ÷ 样本总数。 书紧接着自己泼了盆冷水13:

准确率可以评估总体的准确程度,但片面追求准确率并不合适。 因为样本种类分布不均匀时,该指标不足以说明模型的好坏。 例如,当正样本占据 99%、负样本占据 1% 时,将所有样本都预测为正,便可以有 0.99 的准确率。 此时得到的准确率虽然很高,但并没有参考价值

把这个例子摊开算一遍:

100 个样本:99 个正、1 个负
模型策略:**不管三七二十一,全答「正」**(它连图都不用看)

TP = 99 (99 个正的全报对了)
FP = 1 (那 1 个负的也被报成了正)
FN = 0 (一个都没漏)
TN = 0

准确率 = (TP + TN) ÷ 100 = (99 + 0) ÷ 100 = **0.99**

⇒ **一个完全不看图的模型,拿到了 99 分。**

图说:这就是为什么要有下面那两个比值 ——
它们各自只盯着一半,而那一半正是这个假模型露馅的地方。

两个比值,分子相同、分母不同

书给的定义12:

指标别名定义一句话
精确率查准率正确预测的正样本数 ÷ 全部预测为正的样本数 = TP ÷ (TP + FP)它报的那些里,有几个是真的
召回率查全率、命中率正样本被正确预测为正的比例 = TP ÷ (TP + FN)该找出来的里面,找到了几个

书特意点了一句,而且这一句是记住它们的关键12:

精确率和召回率在计算时分子相同、分母不同。 前者的分母是预测结果为正的样本数量,后者的分母是测试样本中的正样本数。

┌─────────────────────────────────────────┐
│ 分子都是 TP —— **报对了的那些** │
│ │
│ 精确率的分母:**模型一共报了多少** │
│ TP + FP ← 往「它说的」那一侧数 │
│ │
│ 召回率的分母:**本来一共有多少** │
│ TP + FN ← 往「真相」那一侧数 │
└─────────────────────────────────────────┘

图说:回到第 5 节那张表 ——
**精确率沿着「模型报了在」那一行算,召回率沿着「真相是在」那一列算。**
一个横着数,一个竖着数,分子是它俩交叉的那一格。

拿上一节那个假模型再试一次:

全答「正」的那个模型:
精确率 = 99 ÷ (99 + 1) = **0.99** ← 还是很高!
召回率 = 99 ÷ (99 + 0) = **1.00** ← 满分!

⚠ **两个数都很好看。这个陷阱这两个指标也没抓住。**

⇒ 抓得住它的是另一个角度:**看那 1 个负样本。**
模型把它也报成了正 —— 也就是说,**模型在「不在」这一类上一个都没做对**。
真实的检测任务里,负样本远多于正样本(一张图上绝大多数位置什么都没有),
这时候精确率就会立刻塌下来。

图说:所以这三个指标不是「后一个比前一个强」,是**各自盯着不同的一半**。
书举那个 99% 的例子是为了否定准确率,**但它同时也说明了单看任何一个数都不够。**
(最后这一段是我们的补充,书只否定了准确率。)

7. 从两个数压成一个数

现象先行:两个数很难同时高

书给的判断14:

使用 P-R 曲线对模型进行评估的缺点是,在大多数情况下,调整参数并不能使精确率和召回率双高, 且 P-R 曲线容易受到正负样本分布的影响…… 在测试集中正负样本比例不变的情况下,想要较高的精确率就必然会牺牲一些召回率,反之亦然

为什么会这样(书没有拆开,我们补):

模型报框时有一条**置信度门槛** —— 低于这个数的框就不报。

门槛调高 ⇒ 只报最有把握的那几个
报得少但报得准 ⇒ **精确率高、召回率低**(漏掉一堆)

门槛调低 ⇒ 有点像就报
报得全但报得脏 ⇒ **召回率高、精确率低**(混进一堆假的)

图说:所以精确率和召回率不是两个独立的指标,
**它们是同一条旋钮的两端。** 这就是为什么要画曲线,而不是报两个数。

P-R 曲线

书给的定义:记录同一模型在不同参数下的精确率和召回率, 以召回率为横坐标、精确率为纵坐标,画出来的曲线就是 P-R 曲线15

书还给了「好」长什么样:一个较好的分类器应该保证, 随着召回率的提高,精确率始终处在较高水平15

精确率
1.0│●───●───●
│ ╲ ← A:好的模型,拉到很高的召回率
│ ╲ 精确率还撑得住
0.5│ ●──● ●
│ ╱ ╲ ← B:差的模型,召回率一上去精确率就塌
│ ╱ ╲
0.0└──────────────────────→ 召回率
0.0 1.0

图说:曲线越靠右上角越好。(这两条曲线是我们为演示画的。)

AP 和 mAP

书给的理由很直白16:

数字比曲线图更能体现一个模型的好坏,因此定义平均正确率 AP 为 P-R 曲线与横轴围成的面积。 通常 AP 越高,分类器的性能越好。

而 AP 只针对单一种类。多分类怎么办? 书:定义 mAP,它是对每一类别结果 AP 值的平均数,反映多分类模型的整体性能17

一条曲线 ──压成──▶ 一个数 AP (曲线下的面积,0 到 1)
每个类别一个 AP ──取平均──▶ mAP

图说:这就是你在任何一篇检测论文、任何一份模型榜单上看到的那个数。
**mAP 是这一行公认的总分。**

还有两个和精度无关的指标

书把「模型好不好」拆成两个角度:模型的复杂度、以及模型的性能18。 上面讲的全是性能这一侧,复杂度这一侧有两个数19:

指标反映什么关键性质
FLOPS大致需要多少计算资源。书给的中文是**「浮点运算数量」** —— 跑完一次要做多少次带小数的乘加只与模型本身相关 —— 换台机器也不会变
FPS每秒能处理几帧,也就是跑多快由硬件设备、运行环境、编译速度、编程语言共同决定

书由此给了一条非常硬的口径,值得整条抄下来19:

使用 FPS 指标时,必须提供模型运行时的处理器型号、处理器主频、内存容量、 操作系统、软件版本、语言选择等指标。

为什么这条口径要紧: 因为同一个模型在两块板子上的 FPS 可以差十倍。 不报环境的 FPS 等于没报。这是这一章里最实用的一条工程纪律。

判断(我们的,不是书里的):这条口径正好戳中了第 13、14 章的一个空白。 那两章都说模型「要跑在算力有限的板子上」,但从头到尾没有报过任何一个 FPS。 按这一章自己定的规矩,那两章缺的正是这个数。 如果错,会错在: 如果 FPS 数据在配套的在线项目里给了,那只是书没印上去,不算缺。 判据是:那两个在线项目里有没有推理耗时的输出 —— 我们打不开它们。

8. 单阶段检测器一次同时做完两件事,靠的是什么

这是本章第三个承重点。第 16 章那个配置文件里的「锚框尺寸」,要靠这一节才看得懂。

现象先行:「一次同时定位和分类」听起来像口号

书给的定义是:只使用一个神经网络完成目标定位和目标分类的任务, 不再把候选框生成过程单独处理20

问题是:一个网络吐出来的是一堆数,怎么就变成「框」了?

招数一:在几个不同尺度的特征图上分头找

书讲 SSD 时给的21:

SSD 采用 VGG16 作为特征提取模型,不同的是把最后 2 个全连接层替换为 4 个卷积层…… 其在 6 个不同尺度的特征图上设置候选框…… 浅层的特征图携带更多较大目标的信息,深层的特征图携带更多较小目标的信息, 如此便能提高模型对多种尺度目标的检测能力和准确性。

第 10 章讲过感受野:一层看得见输入上多大一块。

浅层(靠近输入) 分辨率高、感受野小 —— 一个格子对应原图上一小块
深层(靠近输出) 分辨率低、感受野大 —— 一个格子对应原图上一大块

图说:所以在不同深度的特征图上分头找,等于**同时用几个不同的「视野」扫一遍**。

判断(我们的,不是书里的):书这一句写反了。 正确的是:浅层的特征图管较小的目标,深层的特征图管较大的目标。

两条理由:就在上面那张图里。 浅层一个格子只对应原图上一小块,它根本"看"不见一个大目标的全貌; 深层一个格子对应一大块,才盖得住大目标。书自己在第 10 章讲过感受野, 这一句和它自己讲过的道理打架。SSD 的实际设定也是这样:候选框的尺寸按层从小到大排,最浅那一层配的是最小的一档框。 这是因为一个框只被指派给「装得下它」的那一层 —— 框有多大,决定它归哪一层管。 (补充:不在书里,依据我们自己的书架)22

这条错误的严重程度是中的: 它不影响你把模型跑起来(层数和框数是配置文件里写死的), 但只要你想按这句话去调「小目标检测不出来该改哪一层」,方向就正好反了。

如果错,会错在: 如果作者指的是某个把预测头顺序倒过来接的变体 (先在深层设小框、再在浅层设大框),那在那个变体上这句话成立。 判据是这一段的上下文 —— 它说的是 SSD 本身、也说的是「6 个不同尺度的特征图」这个原始设计。 另一种可能是作者想说的是「浅层保留了更多细节」,但那句话讲的是边界画得准不准, 不是「携带哪一类目标的信息」,和原文的措辞对不上。

招数二:事先摆好一批固定尺寸的框,只学「怎么挪」

这是单阶段检测器最关键的一手,而书是在讲 YOLOV2 时给全的。

做法: 在特征图的每个格子上事先摆好几个固定尺寸的框, 模型只学「把这个框往哪儿挪、放大缩小多少」,而不是从零画一个框出来。

这些事先摆好的框叫锚框(Anchor)。

书给的具体设定(YOLOV2)23:

13×13 的特征图,**每个格子预测 5 个候选框**
每个候选框要预测 **5 个量**:4 个坐标(x, y, 高, 宽)+ 1 个置信度

⇒ 一张图一共吐出 13 × 13 × 5 = **845 个框**,每个框 5 个数

图说:所以「一次同时定位和分类」的字面意思是 ——
网络的输出层就是一大堆数,**把它们按这个约定切开,就是一堆框。**
定位(坐标)和分类(类别)是从同一次前向计算里一起出来的。

那 5 个锚框的尺寸怎么定?书给了 YOLOV2 的改进23:

YOLOV2 借鉴了 Faster R-CNN 的 Anchor 思想,同时又做了改进: 使用聚类的方法对 Anchor 进行聚类分析,聚类的依据就是 IoU 指标,最终选择 5 个聚类中心。 通过比较发现,用这 5 个聚类得到的 Anchor 进行训练,比手动选择 Anchor 有更高的平均 IoU 值, 有利于模型的快速收敛。

说人话: 不靠人拍脑袋定「摆一个 100×50 的、摆一个 30×30 的」, 而是把训练集里所有真值框的尺寸拿出来,自动分成 5 堆,每堆取一个代表。 这样摆出来的锚框,天然贴近这个数据集里真实目标的形状。 (「聚类」第 06 章讲过:把没有标签的样本自动分成几堆。)

招数三:怎么判两个框是不是框的同一个东西 —— 交并比

这个词书用了很多次,但从来没有解释过定义。补上:

交并比(IoU)= 两个框重叠部分的面积 ÷ 它们合起来占的面积。 1 就是完全重合,0 就是完全不挨着。(补充:不在书里,来自通用知识。)

拿两个具体的框算一遍(这两个框是我们为演示编的):

预测框:横 100 到 200、竖 300 到 360 面积 = 100 × 60 = **6000**
真值框:横 110 到 220、竖 305 到 365 面积 = 110 × 60 = **6600**

重叠部分:横 110 到 200 = 90
竖 305 到 360 = 55
面积 = 90 × 55 = **4950**

合起来占的面积 = 6000 + 6600 − 4950 = **7650**
↑ 减掉重叠那块,否则算了两遍

IoU = 4950 ÷ 7650 = **0.647**

⇒ 通常拿 0.5 当门槛:**IoU ≥ 0.5 就认为这个预测框框中了那个真值框。**
0.647 > 0.5,所以这一框算 **TP**。

图说:**这就是第 5 节那张表里「报对了」到底怎么判的。**
分类任务里「对不对」是明摆着的;检测任务里,框歪一点算不算对,
**就靠这一个数和一条人定的门槛。**

招数四:同一个东西上报了好几个框,剔掉重复的

书在讲 SSD 时提到:使用 NMS(非极大值抑制)剔除重叠程度较大的框,最后得到预测结果24; 讲 YOLO 时也说最后使用 NMS 方法剔除冗余边框25

但书没有说它具体怎么做。补上:

非极大值抑制,三步(补充:不在书里,来自通用知识):

① 把所有框按置信度从高到低排队
② 取排头那个,留下它
③ 把队里所有和它 IoU 超过门槛的框全部删掉 —— 它们框的是同一个东西
④ 回到 ②,直到队空

「非极大值抑制」这个名字就是字面意思:
**不是最大的那个(非极大值),就压下去(抑制)。**

9. 主走查:一张图,从吐框到一个总分

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

(这条走查里的框数、坐标和置信度全部是我们为演示编的 —— 书没有给过任何一个具体例子。)

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

一张车前道路图。人标好的**真值框**一共 5 个:
斑马线 2 个 指示牌 3 个

━━ ① 模型吐框(招数一 + 二) ━━━━━━━━━━━━━━━━━━━━━━━━

网络在几个尺度的特征图上分头找,每个格子上的锚框各预测一组偏移量,
解出来一堆框;按置信度筛过之后剩 6 个:

框 a 斑马线 置信度 **0.95**
框 b 斑马线 置信度 **0.88**
框 c 斑马线 置信度 **0.40**
框 d 指示牌 置信度 **0.91**
框 e 指示牌 置信度 **0.66**
框 f 指示牌 置信度 **0.55**

━━ ② 非极大值抑制(招数四) ━━━━━━━━━━━━━━━━━━━━━━━

按置信度排队:a(0.95) → d(0.91) → b(0.88) → e(0.66) → f(0.55) → c(0.40)

取 a,留下 → 算 a 和其余同类框的 IoU:
IoU(a, b) = **0.71** > 0.5 ⇒ **删掉 b**(它和 a 框的是同一条斑马线)
IoU(a, c) = **0.03** < 0.5 ⇒ 留着
取 d,留下 → IoU(d, e) = 0.08、IoU(d, f) = 0.05 ⇒ 都留着

⇒ 剩下 **5 个框**:a、c、d、e、f

━━ ③ 和真值框比对(招数三:交并比) ━━━━━━━━━━━━━━━━━

框 a → 与斑马线真值 #1 的 IoU = **0.82** ≥ 0.5 ⇒ **TP**
框 c → 与斑马线真值 #2 的 IoU = **0.61** ≥ 0.5 ⇒ **TP**
框 d → 与指示牌真值 #1 的 IoU = **0.78** ≥ 0.5 ⇒ **TP**
框 f → 与指示牌真值 #2 的 IoU = **0.69** ≥ 0.5 ⇒ **TP**
框 e → 与最近的真值框 IoU = **0.12** < 0.5 ⇒ **FP**(报了,但那儿没东西)
指示牌真值 #3 → **没有任何框覆盖它** ⇒ **FN**(有,却漏报了)

━━ ④ 数进四个格子(第 5 节) ━━━━━━━━━━━━━━━━━━━━━━━

斑马线这一类: TP = **2** FP = **0** FN = **0**
指示牌这一类: TP = **2** FP = **1** FN = **1**

━━ ⑤ 算两个比值(第 6 节) ━━━━━━━━━━━━━━━━━━━━━━━━

斑马线: 精确率 = 2 ÷ (2+0) = **1.00** 召回率 = 2 ÷ (2+0) = **1.00**
指示牌: 精确率 = 2 ÷ (2+1) = **0.67** 召回率 = 2 ÷ (2+1) = **0.67**

━━ ⑥ 画 P-R 曲线(第 7 节) ━━━━━━━━━━━━━━━━━━━━━━━━

拿指示牌这一类,把置信度门槛从高往低拖:

门槛 0.90:只报 d → TP=1 FP=0 精确率 **1.00** 召回率 1÷3 = **0.33**
门槛 0.60:报 d、e → TP=1 FP=1 精确率 **0.50** 召回率 **0.33**
门槛 0.50:报 d、e、f → TP=2 FP=1 精确率 **0.67** 召回率 2÷3 = **0.67**

⇒ 三个点:(0.33, 1.00)、(0.33, 0.50)、(0.67, 0.67)
**看得很清楚:门槛一松,召回率上去了,精确率掉下来了。**

━━ ⑦ 压成 AP,再取平均得 mAP(第 7 节) ━━━━━━━━━━━━━━

指示牌这条曲线下的面积:
召回率 0 到 0.33 这一段,能拿到的最高精确率是 1.00 → 0.33 × 1.00 = 0.33
召回率 0.33 到 0.67 这一段,最高精确率是 0.67 → 0.34 × 0.67 = 0.23
AP(指示牌) ≈ **0.56**

斑马线全对,曲线一路贴着顶:AP(斑马线) = **1.00**

mAP = (1.00 + 0.56) ÷ 2 = **0.78**

━━ 一句话读完这条走查 ━━━━━━━━━━━━━━━━━━━━━━━━━━━

**6 个框 → 剔掉 1 个重复的 → 5 个框里 4 个框对了、1 个报了空、1 个目标被漏 →
两个类别各自一组精确率与召回率 → 各压成一个 AP → 取平均,总分 0.78。**

10. YOLO 一路改过来的账

这一节是这一章的历史部分,读法和第 11 章那条演进线一样:看每一代治的是什么。

先补三个词,下面那张表里到处都是它们:

意思
骨干网络检测器打头那一段专门用来提特征的卷积网络。第 11 章那五个模型基本都能拿来当骨干
批归一化(BN)书给的说法:对数据的分布进行改善,改变方差的大小和均值,使数据更符合真实数据的分布,防止过拟合、增强非线性表达能力26这是全书唯一一处解释它的地方(第 11 章讲 ResNet 时只提了名字)
端到端从输入直接训到输出,中间没有需要单独训练或单独调的环节
做了什么治的什么 / 关键数
SSD(2016)用 VGG16 打底,把最后 2 个全连接层换成 4 个卷积层;在 6 个尺度的特征图上设候选框;损失 = 类别损失(Softmax)+ 位置损失(Smooth L1);用 NMS 剔重21多尺度 ⇒ 大小目标都照顾到
DSSD骨干换成 ResNet101;引入反卷积网络把深层那几张特征图和浅层那几张融合起来(书的原话是「高维信息与低维信息」—— 深层的图小而抽象,浅层的图大而具体);每个预测层后加预测模块27提高对整体含义的整合能力,以及大图上的精度
YOLO「单阶段目标检测算法的开山之作」;首次把检测任务当作回归问题来处理;24 个卷积层 + 2 个全连接层;输入 448×448,划成 7×7 个网格,每格预测 2 个框25首次实现端到端训练 —— 不再像 R-CNN 系列那样分阶段训练和测试
YOLOV2先在 224×224 上预训练(拿一个大数据集把参数先训到一个好起点),再用 448×448 微调 10 轮(在这个起点上小幅改一改);每个卷积层后加 BN 层、去掉 Dropout;用聚类选 5 个锚框尺寸;转移层融合高低分辨率特征图;多尺度输入训练(每 10 轮换一次尺寸,必须是 32 的倍数:320、352、…、608)23治 YOLO「速度快但精度不够高」
YOLOV3骨干换成 Darknet53(一个带残差的网络):1 个经典卷积正则层 + 5 个残差连接模块;每个卷积正则层 = L2 正则卷积 + 批归一化 + leaky-ReLU 三层28更深、更稳;这就是第 16 章那个项目用的那个
YOLOV8(2023-01)Ultralytics 公司基于 YOLOV5 改进后开源,「使用了全新的骨干网络和损失函数」29书提到的最新一件事

YOLOV2 那条「每 10 轮换一次输入尺寸」值得单独说一句: 书给了它成立的前提 —— YOLO 因为有全连接层,输入只能固定 448×448; YOLOV2 只有卷积层和池化层,对输入尺寸没有限制23这正是第 11 章讲 LeNet 的 C5 时那条判据的应用:卷积层换个尺寸的输入照样成立,全连接层不行。

⚠ 这一节末尾书有一段编者的话:「YOLO 系列不断地完善、改进、提高…… 我们每个人也是如此,唯有坚持不懈地学习提高,才能成就自我辉煌人生」30这是教材的规定动作,不是技术论证,和上面那张表要分开读。

11. 作者的判断与证据

说法是哪一类
两个子任务;三个场景的侧重有证据,而且那三个例子选得很好
「图像质量根本上决定了准确性的上限」有证据(工程共识),书列的影响因素完整
两代算法按「特征是谁设计的」划分有证据,而且这个划分法比按年份好
传统方法「样本增加而准确度没有明显提升」 vs 深度方法「样本越多越准」有证据,这一对反差是两代交替的真正原因
两阶段精度高但慢、单阶段牺牲些许精度换实时有证据(领域共识),书的表述准确
四个格子的定义书内错误 —— FP 与 FN 的中文说明互换了。 我们在第 5 节当场改正,严重程度高
「正样本占 99% 时全答正也有 0.99 准确率」有证据,而且这是全章最有冲击力的一个例子
精确率与召回率「分子相同、分母不同」有证据,而且这句话是记住它们的关键
「数字比曲线图更能体现一个模型的好坏」作者的判断,给出了 AP 存在的理由。 合理,但压成一个数必然丢信息
报 FPS 必须同时报处理器型号、主频、内存、系统、软件版本、语言有证据,而且是全章最实用的一条工程纪律
「浅层特征图携带较大目标的信息,深层携带较小目标」表述含糊。 按感受野的道理应该反过来;我们如实标出(第 8 节),没有代书判定
锚框、多尺度、聚类选锚框、转移层、多尺度训练有证据,YOLOV2 那几条改进书写得最细
交并比的定义、非极大值抑制的具体做法不在书里。 书用了这两个词很多次,从来没有给过定义,是我们补的
「99% 那个陷阱,精确率和召回率也没抓住」不在书里,是我们补的。 书只用它否定了准确率

12. 边界与局限

  • 这一章对应原书 §11.1 与 §11.2.1—11.2.4。 §11.2.5(神经网络轻量化)我们放进第 16 章 —— 它讲的是「怎么让模型塞进板子」, 和部署是同一件事,放在这里会把这一章撑到读者找不着北。
  • 书从来没有给交并比的定义,也没有讲非极大值抑制怎么做。 两个词都被反复使用,读者只能靠猜。第 8 节那两段是我们补的。
  • 书没有给任何一个具体的检测例子。 没有一张图配上框和分数, 所以第 9 节那条走查的全部数字都是我们编的。
  • 书没有讲损失函数怎么把「框歪了」变成一个数。 YOLO 那五项损失只列了名字(坐标损失、宽高损失、含目标置信度损失、 不含目标置信度损失、分类损失),权重怎么设、为什么这么设,一个字没有31
  • 书没有讲 Anchor Free 那一路。 只提了一句 CornerNet 的名字。
  • 那处 FP/FN 的互换是硬伤。 我们已当场改正,但引用这本书的定义时务必留心。
  • 书讲 SSD 时把「浅层管大目标、深层管小目标」写反了。 我们已在第 8 节当场改正 (正确的是浅层管小目标),判据是书自己第 10 章讲的感受野,以及 SSD 的候选框尺寸设定。
  • 书停在 2023 年初。 那之后的检测模型不在范围内。(补充:不在书里,来自通用知识。)

13. 可带走的

全章主走查一行写完:

一张图,真值框 5 个(斑马线 2、指示牌 3)→ 模型吐出 6 个框 → 非极大值抑制:IoU(a,b) = 0.71 > 0.5,删掉 b → 剩 5 个 → 逐个和真值比 IoU(0.82 / 0.61 / 0.78 / 0.69 都 ≥ 0.5 ⇒ 4 个 TP; 0.12 < 0.5 ⇒ 1 个 FP;还有一个目标没人报 ⇒ 1 个 FN)→ 斑马线 精确率 1.00 召回率 1.00;指示牌 精确率 0.67 召回率 0.67 → 拖门槛画 P-R 曲线(0.90 → (0.33, 1.00);0.60 → (0.33, 0.50);0.50 → (0.67, 0.67))→ AP 1.000.56mAP = 0.78

  1. 「认出路上的东西」是两件事合成的:框出在哪(定位)+ 说出是什么(分类);
  2. 不同场景侧重不同: 超市商品重分类、工厂消防重定位、医疗病变两个都要高;
  3. 第一道难关不是算法,是图像质量 —— 它决定了准确性的上限;
  4. 两代算法的分水岭在「特征是谁设计的」: 传统方法人手工设计,深度方法网络自己学。 反差最狠的一条:传统方法样本越多模型越复杂而精度不涨,深度方法样本越多越准;
  5. 两阶段精度高但慢,单阶段牺牲些许精度换实时 —— 车上要的正是实时;
  6. 数据格式(VOC / COCO)的差别只在「文件怎么摆」,书自己说没有优劣之分;
  7. 四个格子记名字有诀窍:第一个字母说模型这次对不对,第二个字母说模型报的是哪一边。 ⚠ 书这里把 FP 和 FN 的中文说明写反了,照它推后面两个比值会全错;
  8. 准确率是个陷阱:正样本占 99% 时,不看图全答「正」也有 0.99 的准确率;
  9. 精确率 = 它报的那些里有几个真的;召回率 = 该找出来的里找到了几个。 分子相同,分母不同 —— 一个横着数,一个竖着数;
  10. 两个数很难同时高,因为它们是同一条旋钮的两端 —— 门槛调高则准而少,调低则全而脏;
  11. P-R 曲线 → 压成 AP(曲线下的面积)→ 各类取平均得 mAP。 mAP 是这一行公认的总分;
  12. FLOPS 只跟模型有关,FPS 跟环境有关。 报 FPS 必须同时报处理器型号、主频、内存、操作系统、软件版本和语言 —— 不报环境的 FPS 等于没报;
  13. 单阶段检测器一次做完两件事,靠四招: 在几个尺度的特征图上分头找 → 每个格子上事先摆好几个锚框、只学「怎么挪」 → 用交并比判两个框是不是同一个东西 → 用非极大值抑制剔掉重复的框;
  14. 锚框尺寸不用人拍脑袋定 —— 把训练集里真值框的尺寸聚成几堆,每堆取一个代表;
  15. YOLOV2 能做多尺度训练,是因为它只有卷积层和池化层 —— 有全连接层的 YOLO 输入尺寸被锁死。这正是第 11 章那条判据的应用。

14. 原文地图

主题原书章原文位置
目标检测的定义;两个子任务;三个场景的侧重;智能车的两种应用第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:15(搜「物体定位和物体分类」)
图像质量决定准确性的上限;影响因素清单第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:19(搜「根本上决定了目标检测结果准确性的上限」)
传统方法的三步;三种人工设计的特征第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:35(搜「人工设计的特征对候选区域进行表征与筛选」)
两代方法的优劣对比(样本增加时的反差)第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:21(搜「准确度却并没有明显的提升」) · text/12-ch11-11-cnn.txt:23(搜「方便增删分类数量」)
深度方法的定义;两阶段 / 单阶段 / Anchor Free第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:39(搜「Anchor Free目标检测算法」)
R-CNN → Faster R-CNN → Mask R-CNN 三代第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:43(搜「两阶段目标检测算法的鼻祖」) · text/12-ch11-11-cnn.txt:45(搜「全卷积网络替代选择性搜索」) · text/12-ch11-11-cnn.txt:47(搜「RoIAlign」)
两阶段 vs 单阶段的取舍口径第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:51(搜「更受产业界青睐」)
两种数据格式;格式没有优劣之分第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:59(搜「一个xml文件对应一张图片」) · text/12-ch11-11-cnn.txt:61(搜「数据集格式并没有优劣之分」)
评估的两个角度;FLOPS 与 FPS 的分工;报 FPS 的硬口径第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:65(搜「一是模型的复杂度」) · text/12-ch11-11-cnn.txt:67(搜「必须提供模型运行时的处理器型号」)
四个格子的定义(FP 与 FN 的说明互换了)第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:71(搜「正样本识别为负样本」)
准确率的陷阱:99% 那个例子第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:75(搜「便可以有0.99的准确率」)
精确率与召回率的定义;分子相同分母不同第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:77(搜「有多少把握可以预测正确」) · text/12-ch11-11-cnn.txt:79(搜「分子相同、分母不同」)
P-R 曲线的定义与它的缺点第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:81(搜「以召回率为横坐标」) · text/12-ch11-11-cnn.txt:83(搜「调整参数并不能使精确率和召回率双高」)
AP 是曲线与横轴围成的面积;mAP 是各类 AP 的平均第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:87(搜「数字比曲线图更能体现一个模型的好坏」) · text/12-ch11-11-cnn.txt:89(搜「均值平均精度mAP」)
单阶段的定义第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:95(搜「只使用一个神经网络完成目标定位和目标分类」)
SSD:VGG16 打底、6 个尺度、浅深层各管什么第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:99(搜「6个不同尺度的特征图上设置候选框」)
SSD 的两部分损失;用 NMS 剔重叠框;DSSD 的改进第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:101(搜「非极大抑制」) · text/12-ch11-11-cnn.txt:103(搜「DSSD将基础网络从VGG16改为ResNet101」)
YOLO:开山之作、把检测当回归、7×7 网格每格 2 框第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:109(搜「单阶段目标检测算法的开山之作」) · text/12-ch11-11-cnn.txt:111(搜「7×7个网格」)
YOLO 损失的五项;端到端训练第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:115(搜「边框的横纵坐标预测损失」) · text/12-ch11-11-cnn.txt:117(搜「首次实现了端到端的训练方式」)
YOLOV2:BN 层的作用第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:125(搜「对数据的分布进行改善」)
YOLOV2:聚类选 5 个锚框、13×13 每格 5 框 5 个量第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:127(搜「最终选择5个聚类中心」) · text/12-ch11-11-cnn.txt:129(搜「每个网格预测5个候选框」)
YOLOV2:转移层;多尺度输入训练的前提第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:133(搜「转移层」) · text/12-ch11-11-cnn.txt:135(搜「对输入图像的尺寸没有限制」)
YOLOV3:Darknet53 与它的构成第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:145(搜「Darknet53」)
YOLOV8(2023 年 1 月)第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:147(搜「2023年1月」)
编者的话(要与技术分开读)第11章 智能车竞赛目标检测任务的CNN模型设计与部署text/12-ch11-11-cnn.txt:149(搜「成就自我辉煌人生」)

Footnotes

  1. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 15 段(text/12-ch11-11-cnn.txt:15,搜「物体定位和物体分类」)。原文给了三个场景的侧重(超市商品识别、工厂消防检测、医疗病变检测)以及智能车领域的两种典型应用。「置信度不是正确的概率、是模型自报的把握」这一句区分是我们补的。 2 3

  2. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 19 段(text/12-ch11-11-cnn.txt:19,搜「根本上决定了目标检测结果准确性的上限」)。原文列的因素:摄像头硬件成像能力;光照、拍摄角度、恶劣天气;同一图像中不同对象的尺度、密集程度、遮挡程度。

  3. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 27 段(text/12-ch11-11-cnn.txt:27,搜「根据特征提取的方式」)。

  4. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 35 段(text/12-ch11-11-cnn.txt:35,搜「人工设计的特征对候选区域进行表征与筛选」)。原文列的经典算法:VJ 检测算法、基于 HOG 特征的算法、基于可变部件模型的算法。

  5. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 21 段(text/12-ch11-11-cnn.txt:21,搜「准确度却并没有明显的提升」)与第 23 段(text/12-ch11-11-cnn.txt:23,搜「方便增删分类数量」)。 2

  6. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 39 段(text/12-ch11-11-cnn.txt:39,搜「Anchor Free目标检测算法」)。原文:2018 年 CornerNet 的提出提供了新思路;严格意义上说 Anchor Free 也是一类单阶段算法。 2

  7. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 43—47 段(text/12-ch11-11-cnn.txt:43,搜「两阶段目标检测算法的鼻祖」;text/12-ch11-11-cnn.txt:45,搜「全卷积网络替代选择性搜索」;text/12-ch11-11-cnn.txt:47,搜「RoIAlign」)。

  8. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 51 段(text/12-ch11-11-cnn.txt:51,搜「更受产业界青睐」)。同段说明本书后续重点介绍单阶段算法和轻量化网络设计。 2

  9. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 59 段(text/12-ch11-11-cnn.txt:59,搜「一个xml文件对应一张图片」)。

  10. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 61 段(text/12-ch11-11-cnn.txt:61,搜「数据集格式并没有优劣之分」)。

  11. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 71 段(text/12-ch11-11-cnn.txt:71,搜「正样本识别为负样本」)。原文四条的括号标注里,FP 与 FN 的中文说明互换了,见第 5 节的判断块。清洗文本里那一行的四个计数符号被写成「N、N、N、N」(下标丢失),这是转码问题不是数据错。 2

  12. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 77 段(text/12-ch11-11-cnn.txt:77,搜「有多少把握可以预测正确」)与第 79 段(text/12-ch11-11-cnn.txt:79,搜「分子相同、分母不同」)。公式本体在书里是图片,文字定义在正文里。 2 3

  13. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 75 段(text/12-ch11-11-cnn.txt:75,搜「便可以有0.99的准确率」)。第 6 节末尾那段「精确率和召回率也没抓住这个陷阱」是我们的补充,书只用这个例子否定了准确率。

  14. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 83 段(text/12-ch11-11-cnn.txt:83,搜「调整参数并不能使精确率和召回率双高」)。「为什么会这样」那段置信度门槛的解释是我们补的。

  15. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 81 段(text/12-ch11-11-cnn.txt:81,搜「以召回率为横坐标」)。 2

  16. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 87 段(text/12-ch11-11-cnn.txt:87,搜「数字比曲线图更能体现一个模型的好坏」)。

  17. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 89 段(text/12-ch11-11-cnn.txt:89,搜「均值平均精度mAP」)。

  18. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 65 段(text/12-ch11-11-cnn.txt:65,搜「一是模型的复杂度」)。

  19. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 67 段(text/12-ch11-11-cnn.txt:67,搜「必须提供模型运行时的处理器型号」)。原文:FLOPS 与模型本身相关,FPS 由硬件设备、运行环境、编译速度、编程语言等因素共同决定。 2

  20. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 95 段(text/12-ch11-11-cnn.txt:95,搜「只使用一个神经网络完成目标定位和目标分类」)。

  21. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 99 段(text/12-ch11-11-cnn.txt:99,搜「6个不同尺度的特征图上设置候选框」)。原文那句「浅层的特征图携带更多较大目标的信息,深层的特征图携带更多较小目标的信息」按感受野的道理应当反过来,我们在第 8 节如实标出,没有代书判定。 2

  22. 补充(不在书里,依据我们自己的书架):候选框按尺寸被指派给「装得下它」的那一层,所以浅层(分辨率高、感受野小)配的是最小的一档框。依据: shelf=ai-book-reference/little-book-of-deep-learning#10-prediction.md 事实=该章写明卷积检测器在每个尺度 s 的每个格子上预测若干候选框,框的尺寸取「能塞进这个格子的感受野」,训练时每个真值框按「尺寸归哪层、中心归哪格」被指派给一个 (s,h,w)。

  23. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 127 段(text/12-ch11-11-cnn.txt:127,搜「最终选择5个聚类中心」)、第 129 段(text/12-ch11-11-cnn.txt:129,搜「每个网格预测5个候选框」)、第 133 段(text/12-ch11-11-cnn.txt:133,搜「转移层」)与第 135 段(text/12-ch11-11-cnn.txt:135,搜「对输入图像的尺寸没有限制」)。「锚框」这个词的白话解释(事先摆好、只学怎么挪)是我们补的。 2 3 4

  24. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 101 段(text/12-ch11-11-cnn.txt:101,搜「非极大抑制」)。补充(不在书里,来自通用知识):第 8 节那三步做法与交并比的定义,书从头到尾没有给过。

  25. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 109 段(text/12-ch11-11-cnn.txt:109,搜「单阶段目标检测算法的开山之作」)、第 111 段(text/12-ch11-11-cnn.txt:111,搜「7×7个网格」)与第 117 段(text/12-ch11-11-cnn.txt:117,搜「首次实现了端到端的训练方式」)。 2

  26. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 125 段(text/12-ch11-11-cnn.txt:125,搜「对数据的分布进行改善」)。这是全书唯一一处解释批归一化的地方;第 9 章讲 ResNet 时只提了名字。

  27. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 103 段(text/12-ch11-11-cnn.txt:103,搜「DSSD将基础网络从VGG16改为ResNet101」)。

  28. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 145 段(text/12-ch11-11-cnn.txt:145,搜「Darknet53」)。原文:Darknet53 由一个经典卷积正则层和五个残差连接网络模块组成;每层卷积正则层经过 L2 正则卷积、batchnorm 标准化以及 leaky-relu 激活三层计算。

  29. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 147 段(text/12-ch11-11-cnn.txt:147,搜「2023年1月」)。这是全书提到的时间最晚的一件事。

  30. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 149 段(text/12-ch11-11-cnn.txt:149,搜「成就自我辉煌人生」)。这是教材的思政插入段,属于编者的话,不是技术论证。

  31. 出处:「第11章 智能车竞赛目标检测任务的CNN模型设计与部署」第 115 段(text/12-ch11-11-cnn.txt:115,搜「边框的横纵坐标预测损失」)。原文只列了五项损失的名字,并说通过设置权重值来调整占比;权重具体怎么设、为什么这么设,书没有讲。