EECS498 · Deep Learning Revisited · 06

Detection: From Classification to Structured Prediction

分类输出一个 class;检测必须同时回答“有几个、是什么、在哪里”。你完成的一阶段 detector 把一个 feature map 变成密集的 objectness、box offsets 与 class scores。

55–70 分钟 A5 Dense prediction

30-second recall

30 秒回忆

你实现了 anchors、proposal transform、IoU、prediction head、loss、inference 与 NMS,并保存了 YOLO checkpoint。

  1. 为什么输出不再是 [N,C]?
  2. anchor 与 proposal 有何差别?
  3. NMS 在删除什么冗余?

Why Did We Need This?

Image classifier 把整图压成一个 label,无法表示多对象与位置。Detector 保留 backbone 的空间 grid,让每个位置/anchor 都能提出一个结构化假设。

image [B,3,H₀,W₀]
features [B,1280,H,W]
anchors [B,A,H,W,4]
predictions conf + offsets + class
detections variable count × 6

What You Actually Implemented

Implemented in repository: A5/single_stage_detector.py 的 GenerateAnchor、GenerateProposal、IoU、PredictionNetwork、SingleStageDetector.forward/inference 与 nms。Notebook 保存到 epoch 49,末尾 epoch loss 0.1430,并有 yolo_detector.pt。

Mental model

Detection 把“一个输入对应一个答案”改成“空间中每个候选位置都提出一个带置信度的结构化答案,再去重”。

Mechanism · anchor → offset → proposal

Anchor 是预定义 reference box;网络不从零预测绝对坐标,而是预测相对中心/尺度的 offset。IoU 把 proposal 与 ground truth 配对,正负 anchor 决定哪些输出接受监督。

Your code · 2022

A5/single_stage_detector.py · PredictionNetwork.forward()

View source →
preds = self.pred_layer(features)
conf_scores = torch.sigmoid(preds[:, :A*5:5])
offsets = preds[:, :5*A].view(B, A, 5, H, W)[:, :, 1:]
class_scores = preds[:, 5*A:]

One stage vs two stage

One-stage

直接在 dense grid 上同时做 objectness、box regression 与 class prediction;你完成的主线在这里。

Two-stage

先用 RPN 提 proposals,再对较少候选做 ROI classification/regression,分开“哪里可能有物体”与“是什么”。

Repository completion boundary: A5/two_stage_detector.py 只有 proposal layer 初始化出现差分,多个 forward/inference TODO 仍为 pass;win22/A4 两份 detector 与 zip skeleton 无实质差分。本课用它们解释两阶段结构,但不声称是已完成实现。

Why NMS?

相邻 anchors 常对同一物体产生高分重叠框。NMS 按 score 取最高框,再删除 IoU 超阈值的候选;它不是训练出的 reasoning,而是把冗余 dense hypotheses 变成最终集合的后处理规则。

Common misconception:class score 高不等于 box 准。Detection loss 必须分别监督 objectness、localization 与 class;最终排序还可能组合这些信号。

Then vs Now

DETR 用 set prediction 与 bipartite matching 减少 anchors/NMS 依赖,但 structured output 的核心问题没变:模型必须把 dense representation 转成数量可变、带位置的对象集合。

Concept Checks

B=2,A=9,H=W=7,每个 anchor 预测 1 conf + 4 offsets,共多少 anchor hypotheses?

2×9×7×7=882;每张图 441 个,之后还要结合 class scores 与 NMS。

为什么用 offsets 而非直接预测全图绝对坐标更容易?

每个 anchor 提供局部 reference 与尺度,目标变成相对的小修正,分布更稳定且可在各 grid location 共享预测头。

两框 IoU 很大但类别不同,class-agnostic NMS 可能有什么问题?

它可能错误删除另一个真实类别;class-aware NMS 会分开类别处理。这说明后处理规则也是模型行为的一部分。

Depth Lab · 一个 grid cell 为什么输出不止一个 class?

Classification 回答“图中是什么”;detection 还要回答“有几个、各在哪里”。因此每个 anchor/candidate 同时需要 objectness、class logits 与 box geometry。

feature map                 [N,C,H,W]
A anchors per location
objectness logits           [N,H,W,A]
class logits                [N,H,W,A,K]
box offsets (tx,ty,tw,th)   [N,H,W,A,4]

若 H=W=7、A=3,就有 147 个 dense candidates;这不是 147 个 objects,而是 147 个待筛选 hypotheses。

  1. Anchor 提供参考 center/size。
  2. Network 预测相对 offsets,而非从零输出绝对 box。
  3. IoU 将 predicted/target overlap 变成 matching/evaluation signal。
  4. Objectness 排除大多数 background candidates。
  5. NMS 在高重叠 predictions 中保留高分代表,减少重复 boxes。
如果没有 NMS?

同一 object 附近多个 anchors 往往都给高分,输出会包含大量重叠重复 detections;分类正确也不等于结构化输出可用。

Historical completion boundary

Repository 的 one-stage detector 路径有完成实现;two-stage/Faster R-CNN 部分保留未完成区域。课程用它解释 proposal 思想,但不把 skeleton 误标为用户完成代码。

为什么 output 不再只是 [N,K]?

每张图有可变数量 objects,需要在 spatial candidates 上同时预测存在性、类别与位置。

两个 box 类别相同但 IoU 很低,NMS 应互相抑制吗?

通常不应;低 overlap 暗示可能是两个不同 objects。

Transfer Question

若 feature grid 加倍到 14×14、A 不变,candidate 数量和小物体 localization granularity 如何变化?

闭卷解释

  1. 从 classification 推出 detection 的三个 output heads。
  2. 解释 anchor 是 reference,不是最终 box。
  3. 为什么 proposal/two-stage 是不同计算分配策略?

Connection

Detection 将静态 image output 结构化;下一转折把输入本身改成有时间依赖的 sequence。

Based on your implementation