Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Lab 2 · 人脸检测系统

本实验对应第 3 讲:搭建一条检测数据管线,训练一个能在一张图里定位并识别人脸的模型,再用对抗样本检验它的鲁棒性,并讨论隐私与偏见。检测比Lab 1的分类多了「在哪儿」这一维。

1. 从分类到检测

分类回答「这张图是什么」,检测回答「图里哪里有什么」。第 3 讲的 CNN 给出一张图的整体标签;检测要给出一组框 + 类:{(x,y,w,h,score)}i{(x,y,w,h,\text{score})}_i。

两条主流路线(第 3 讲 3.6):

路线做法代表特点
两阶段先产生候选区域,再对每个区域分类 + 回归框R-CNN 系列精度高、速度较慢
单阶段直接在网格上预测框与类YOLO 类速度快、适合实时
滑动窗口(本 Lab 起点)用固定大小的窗口在图上逐位置扫经典方法直观,能看清感受野与步幅的作用

2. 用滑动窗口理解检测

最朴素的检测器:拿一个小 CNN(输入如 32×3232\times32),在图上以固定步幅滑动,每个窗口输出“有人脸 / 没人脸“。这正好把第 3 讲的感受野和步幅用上了。

滑动窗口为什么慢,又为什么值得先理解

在每个位置都跑一次 CNN,计算重复且昂贵。但这个笨办法把检测的本质摊开了:检测 = 在位置和尺度上搜索"分类器认为这里有个目标吗"。理解了它,再看 YOLO 的"一次前向在特征图上密集预测",就知道它只是把搜索共享了——卷积本身已经在所有位置滑动,何必再手动循环。

多尺度:人脸大小不一,窗口也需多尺度——图像金字塔或特征金字塔(在不同下采样层级上检测)。这正是「池化带来的一定平移不变性」(第 3 讲 3.3)在检测里的用途。

3. 数据管线

检测数据是「图 + 一组框」,比分类多两步:

  1. 读入与归一化:像素缩放到 [0,1][0,1] 或标准化。
  2. 框的坐标变换:标注常给 (x1,y1,x2,y2)(x_1,y_1,x_2,y_2),模型常预测 (cx,cy,w,h)(c_x,c_y,w,h) 加偏移——训练时需要在这两种表示间转换(这是检测最容易出 bug 的地方)。
  3. 匹配正负样本:对滑动窗口版本,窗口与某个人脸框的 IoU 超过阈值记为正,低于另一阈值记为负(背景)。
IoU:检测的"重叠度"

IoU=交集面积并集面积\mathrm{IoU}=\dfrac{\text{交集面积}}{\text{并集面积}}。它同时用作正负样本的匹配准则与评价指标。IoU 越大,预测框与真值框越重合;一般 IoU>0.5\mathrm{IoU}\gt0.5 视为命中。

4. 训练与评估

  • 损失:分类用交叉熵(第 1 讲 1.4),框回归用平滑 L1 或 IoU 类损失。
  • 评估:不要只看准确率(背景远多于人脸,全判背景也能“高准确率“)。用 Precision / Recall 与 mAP(各类别 Precision–Recall 曲线下面积的平均),NMS(非极大值抑制)去掉重叠的重复框。
思考题 74.1 · 为什么准确率会骗人

一个检测集里 99% 的窗口是背景。若模型全部判为背景,准确率是多少?为什么这个数字没有意义?

参考结论

准确率 ≈99%\approx99\%——但它一个人脸都框不出来(召回率 = 0)。类别极不平衡时准确率是坏指标,必须看 Precision / Recall 或 mAP。

∎

5. 对抗样本:人眼看不出,模型却错

在输入上加一个人眼几乎不可察的小扰动 δ\boldsymbol\delta,使模型出错:

xadv=x+δ,δ=ε⋅sign(∇xL(x,y)).\boldsymbol x_{\text{adv}}=\boldsymbol x+\boldsymbol\delta,\qquad \boldsymbol\delta=\varepsilon\cdot\mathrm{sign}\bigl(\nabla_{\boldsymbol x}\mathcal L(\boldsymbol x,y)\bigr).

这就是 FGSM(快速梯度符号法):沿让损失上升的方向推一小步。它和训练用的是同一个梯度(第 1 讲的反向传播),只是这次求的是对输入的梯度,而不是对参数。

对抗样本说明了什么

它说明模型的决策不等于人的决策:模型的"人脸"是特征空间里一个高维区域,沿某些方向挪一点点就跨过边界,而这些方向对人不敏感。这既是安全风险(攻击),也是理解模型(它的边界长什么样)的工具。第 3 讲 3.7 讨论的伦理问题在这里变成可实验的对象。

6. 隐私与偏见(讨论题)

  • 偏见:若训练数据里某种肤色/性别的样本偏少,检测器对该群体的召回率会系统性偏低。列出如何在数据集层面发现这一点。
  • 隐私:人脸是可识别身份的生物特征。讨论:这类系统在部署时应当有哪些默认约束(数据留存、用途限制、知情同意)?(参见第 7 讲三条法则。)

7. 排错清单

  1. 框坐标用错表示(像素 vs 归一化、中点+宽高 vs 两角)——检测最常见的 bug;
  2. 正负样本比例:负样本过多会让模型全判背景,需要采样/加权;
  3. NMS 阈值:太小→漏框,太大→重复框;
  4. 图像与标注不同步:增强(翻转/裁剪)时必须同等地变换框;
  5. 评估集泄漏:别用训练里见过的图评估。

8. 提交与自检

  • 一张带检测框的可视化结果;
  • 一份 Precision / Recall(或 mAP)报告;
  • 一个对抗样本演示:原图 + 扰动放大图 + 误判结果。

自检:能说清「卷积共享」如何把滑动窗口变高效;能解释 IoU、NMS、mAP 各自解决什么问题;能演示一个对抗样本并说明它为何“欺骗“了模型。

9. 代码 ↔ 讲次对照表

代码 / 步骤对应结论
用 CNN 替代逐窗口前向3.1 归纳偏置:权值共享把滑动窗口变成一次前向
输出尺寸与参数量计算3.2 卷积运算:Hout=⌊(H−K+2P)/S⌋+1H_{\text{out}}=\lfloor(H-K+2P)/S\rfloor+1
加载预训练骨干并冻结3.6 迁移学习:小数据先迁移,别从零训
正负样本采样与加权3.7 检测与分割:类别不平衡是检测的主要陷阱
IoU / NMS / mAP3.7:匹配、去重与评估口径
FGSM / PGD 对抗样本3.9 伦理与安全:微小扰动翻转预测
按人群切分评估7.4 公平与责任:平均指标会掩盖群体差异

10. 扩展任务(选做 1–2 项)

  1. 阈值扫描:把分类阈值从 0.3 扫到 0.9,画 Precision–Recall 曲线并解释「为什么检测不能只看准确率」(3.7)。
  2. 骨干消融:用 timm 里两个不同规模的预训练骨干做迁移学习,比较 mAP 与推理延迟;给出性价比结论(3.6)。
  3. 增强消融:无增强 / 翻转 / 随机裁剪 / Cutout 四组对照,报告每组 mAP——每次只改一个变量。
  4. 对抗训练:用 PGD 生成对抗样本,再做对抗训练(3.9),报告「干净精度 vs 对抗精度」的权衡曲线。
  5. 公平性审计:如果能获得子群体标签(如肤色分档),报告各子群体的错误率差,并讨论公平度量的选择理由(7.4)。