跳到主要内容

检测实战

本节定位

真正做检测项目时,困难往往不只是模型本身。
更常见的问题是:

  • 标注怎么做
  • 正负样本怎么定义
  • 小目标怎么评估
  • 检测框到底算不算对

所以这一节的重点,是把一个最小检测项目从问题定义走到评估闭环。

学习目标

  • 学会定义一个最小目标检测项目
  • 理解检测项目里的标注、框匹配和评估逻辑
  • 通过可运行示例建立 IoU 驱动的评估直觉
  • 建立检测项目的展示骨架

先建立一张地图

如果你刚学完检测概述、经典检测器和 YOLO,这一节最自然的续接就是:

  • 前面你已经知道检测任务在解决什么
  • 这一节开始问“如果把它做成一个真的项目,第一步到底该怎么下手”

所以这节真正重要的不是新模型,而是:

  • 类别定义
  • 标注规范
  • 评估口径
  • 错例复盘

检测实战这节最适合新人的理解顺序不是“先训模型”,而是先看清项目闭环:

所以这节真正想解决的是:

  • 检测项目到底该怎么推进
  • 哪些地方比模型结构更容易先出问题

一、一个检测项目最先要定什么?

1.1 类别边界

例如安防场景里你可能只先做:

  • person
  • helmet

而不是一开始就把所有目标都做进来。

1.2 标注规范

必须先说清:

  • 框紧不紧
  • 遮挡怎么标
  • 小目标怎么算

1.3 评估标准

至少要明确:

  • IoU 阈值
  • 召回 / 精确率

1.4 新人第一次做检测项目,题目怎么选更稳?

更稳的题目通常有这几个特点:

  • 类别数不要太多
  • 目标定义清楚
  • 误检和漏检能肉眼看懂

所以第一次做项目时,
“少类别、强定义、易解释”通常比“任务更炫”更重要。

1.5 这一步为什么比“先选模型”更重要?

因为如果你最开始这些东西没定稳:

  • 类别边界
  • 标注规则
  • 框口径
  • IoU 阈值

后面你做再多模型比较,也可能是在混乱标准上空转。


二、先跑一个最小匹配评估示例

ground_truth = [
{"label": "person", "box": (10, 10, 30, 50)},
{"label": "helmet", "box": (14, 8, 24, 18)},
]

predictions = [
{"label": "person", "box": (11, 12, 31, 48), "score": 0.92},
{"label": "helmet", "box": (15, 9, 23, 17), "score": 0.81},
{"label": "helmet", "box": (40, 40, 50, 50), "score": 0.30},
]


def iou(box_a, box_b):
ax1, ay1, ax2, ay2 = box_a
bx1, by1, bx2, by2 = box_b

inter_x1 = max(ax1, bx1)
inter_y1 = max(ay1, by1)
inter_x2 = min(ax2, bx2)
inter_y2 = min(ay2, by2)

inter_w = max(0, inter_x2 - inter_x1)
inter_h = max(0, inter_y2 - inter_y1)
inter_area = inter_w * inter_h

area_a = (ax2 - ax1) * (ay2 - ay1)
area_b = (bx2 - bx1) * (by2 - by1)
union = area_a + area_b - inter_area
return inter_area / union if union else 0.0


matches = []
for pred in predictions:
best_iou = 0.0
best_gt = None
for gt in ground_truth:
if gt["label"] != pred["label"]:
continue
cur_iou = iou(pred["box"], gt["box"])
if cur_iou > best_iou:
best_iou = cur_iou
best_gt = gt
matches.append(
{
"label": pred["label"],
"score": pred["score"],
"best_iou": round(best_iou, 4),
"matched": best_iou >= 0.5,
}
)

print(matches)

2.1 这段代码最重要的地方是什么?

它让你看到检测评估不是:

  • 分类对了就行

而是:

  • 类别对
  • 框也要足够准

2.2 为什么这就是很多检测项目的核心判断?

因为真实检测结果好不好,
最终常常就体现在:

  • 匹配阈值
  • 框质量

2.3 为什么检测项目特别需要“误检 / 漏检”视角?

因为检测系统很少只有“对或错”两种结果。
更常见的是:

  • 框偏了
  • 目标漏了
  • 多报了一个框

这也是为什么检测项目展示时,最好不要只放几张成功样例。

2.4 第一次做检测项目时,最值得先分哪几类错?

一个很实用的错误分类方式是:

  1. 漏检
    明明有目标,系统没报出来。

  2. 误检
    没目标也报了。

  3. 定位不准
    类别对了,但框偏差太大。

这三类一分开,你后面很多迭代方向就会立刻更清楚。


三、检测项目最容易踩的坑

3.1 标注标准不一致

这会直接把训练和评估一起拖乱。

3.2 小目标和遮挡没单独分析

很多系统在这些场景下会明显掉表现。

3.3 只展示一两张漂亮图

真实项目更该展示:

  • 哪些情况容易漏检
  • 哪些情况容易误检

四、一个新人可直接照抄的推进顺序

更建议这样做:

  1. 先定类别和标注规则
  2. 再抽样检查标注质量
  3. 先做一个最小 baseline
  4. 再统一 IoU / mAP 评估口径
  5. 最后挑典型漏检 / 误检做分析

4.1 如果把它做成作品集,最值得展示什么?

比起只展示一张“预测效果图”,更值得展示的是:

  • 类别定义和标注规则
  • baseline 的 IoU / mAP
  • 一组典型误检和漏检案例
  • 你如何解释这些失败
  • 下一步你会优先改数据、阈值还是模型

小结

这节最重要的是建立一个项目意识:

检测项目的关键,不只是模型名,而是类别定义、标注规范和框级评估方法是否清楚。

这节最该带走什么

  • 检测项目首先是标注和评估项目,其次才是模型项目
  • IoU 阈值和标注口径会直接影响你怎么判断“检测对没对”
  • 误检 / 漏检分析是检测项目最值得展示的部分之一

如果再压成一句话,那就是:

检测项目真正的难点,往往不是把模型跑起来,而是把“什么算检对了”这件事定义清楚。


练习

  1. 调整 IoU 阈值到 0.7,看看匹配结果会怎么变。
  2. 想一想:为什么检测项目比分类项目更依赖清晰标注规范?
  3. 如果项目里总漏小目标,你会优先检查数据、输入分辨率还是模型结构?
  4. 你会如何把这个检测项目包装成作品集?