图像分类回答整张图里有什么,目标检测还要给每个实例定位。一条预测通常包含类别、框和分数。先把框画对,再看模型指标,能省掉很多无效调参。

前置是分类项目与分类评估。

同一只框可以有三种写法

格式 含义 示例
xyxy 左上角、右下角 (20,10,60,30)
左上角 xywh 左上角、宽高 (20,10,40,20)
中心 xywh 中心、宽高 (40,20,40,20)

COCO 常用左上角加宽高,YOLO 文本标签常用归一化中心与宽高。宽 100、高 50 的图中,上例归一化中心格式为 (0.4,0.4,0.4,0.4)。

标签还要说明坐标属于原图还是处理后的图。使用 letterbox 时,还原预测需要撤销缩放和补边。建议同时画出原图与变换后的标签,肉眼检查几个批次。

IoU 怎样算

IoU 是交集面积除以并集面积。这篇使用连续坐标,面积为 (x2-x1)*(y2-y1)。遇到含端点的整数像素约定时,先统一格式。

import math

def iou_xyxy(a, b):
    for box in (a, b):
        if len(box) != 4 or not all(math.isfinite(v) for v in box):
            raise ValueError("four finite coordinates required")
        if not (box[0] < box[2] and box[1] < box[3]):
            raise ValueError("positive width and height required")
    iw = max(0., min(a[2], b[2]) - max(a[0], b[0]))
    ih = max(0., min(a[3], b[3]) - max(a[1], b[1]))
    intersection = iw * ih
    area_a = (a[2] - a[0]) * (a[3] - a[1])
    area_b = (b[2] - b[0]) * (b[3] - b[1])
    return intersection / (area_a + area_b - intersection)

truth = (0., 0., 10., 10.)
assert iou_xyxy(truth, truth) == 1
assert iou_xyxy(truth, (10., 0., 20., 10.)) == 0
assert math.isclose(iou_xyxy(truth, (5., 0., 15., 10.)), 1 / 3)

predictions = [(0.90, (0., 0., 9., 10.)), (0.80, truth)]
used = False
labels = []
for score, box in sorted(predictions, key=lambda item: item[0], reverse=True):
    matched = not used and iou_xyxy(box, truth) >= 0.5
    labels.append("TP" if matched else "FP")
    used = used or matched
assert labels == ["TP", "FP"]
print("IoU and score-ordered duplicate checks passed")

这里高分预测先匹配,占用了唯一真实框,后面的重复预测计为 FP。正式 COCO 评估还处理 crowd、忽略区域和最大检测数,应该调用官方评估器。上面的练习只解释一个普通单框情况。

三个阈值分开记录

分数阈值决定保留哪些候选;NMS 的 IoU 阈值决定抑制哪些高重叠候选;评估 IoU 阈值决定定位是否合格。

NMS 通常按分数保留候选,逐步去掉与已选框重叠太高的预测。检查按类别还是类别无关处理,避免不同类别互相抑制。并列分数在不同实现上可能保留不同框。Torchvision NMS

有些检测器使用其他去重设计,是否需要 NMS 要看具体实现。

AP 的数值要带上条件

AP50 与 COCO 常见主指标不同,后者对 0.50 到 0.95 的十个 IoU 阈值取平均。还应记录类别、面积范围、每图检测数、划分和评估器版本。

先在验证集选择模型、分数阈值和后处理参数,测试集留到最后。漏检多时,回头看小目标、遮挡、标签缺失和缩放还原;误报多时,看重复框、背景与类别混淆。

练习:手画一个真实框与两个预测框,改变预测分数,观察上例 TP/FP 会怎样变化;再给图像增加补边,推导坐标还原公式。

资料:疏锦行计算机视觉专题《目标检测任务》第 5–13 页。几何例子已运行,检测模型尚未训练。