目标检测认识 02 - 样本匹配发展过程
目标检测中样本匹配发展过程
为什么要进行样本匹配 ?
目标检测由于目标数量不定,想想 two-satge 首先通过选择性搜索生成大量候选框,one-stage 通过大量的 anchor 生成候选框,所以通常输出远超过目标数量的结果,然后在结果上依靠置信度、IOU 找出正确目标,那么带来的问题是如何计算损失?即假设模型输出数量 M > 真实数量 N,N 的每个目标和 M 的哪些预测计算损失?这就需要样本匹配
计算损失时,一般模型输出的样本有 3 大类:正样本、负样本、忽略样本,其中正样本用于预测目标,负样本用于协助模型训练,样本匹配的目的是区分出模型输出的这 3 类样本
区分模型输出的 3 类样本的方法,从训练前和训练时区分,分为静态、动态的,从分配的数量来说,有 one-to-one, one-to-many
静态分配
所谓静态分配,就是训练前根据预测框与 GT 框的位置确定正样本、负样本、忽略样本
模型 | 指标 | Anchor | 描述 | 预测框数量 |
---|---|---|---|---|
FasterRCNN | 双 IOU | Anchor-base | 正样本: IOU>0.7 负样本: IOU<0.3 | 随机选择 128 个正样本 + 128 个负样本参加训练 |
[[YOLOv1]] | MaxIOU | Anchor-base | 正样本:目标对应 cell 处预测的最大 IOU 框 负样本:该位置其他预测 | 1->1 |
[[YOLOv2]] | MaxIOU | Anchor-base | 正样本:站在 gt 的角度,与 gt 对应的有最大 IOU 的 anchor 负样本:该位置其他预测 | 1->1 |
[[M01 - 视觉模型 / 1 - 基础视觉任务 CNN/B - 目标检测 / RetinaNet]] | IOU | Anchor-base | 正样本:站在 anchor 的角度,其存在 gt,他们之间 IOU>0.5 即可; 负样本:站在 anchor 角度,其与任意 gt 的 IOU<0.4; 如果存在 gt 框匹配不到正样本,忽略前面 2 条规则,按 MaxIOU 判断正样本 | 1->n |
[[YOLOv3]] | MaxIOU | Anchor-base | 正样本:站在 gt 的角度,有最大 max 的 anchor 为正样本; 负样本:站在 anchor 的角度,除正样本外,与所有 gt 的 IOU 小于阈值的 anchor ; 忽略样本:正例除外,与任意 gt 大于阈值但没被 MaxIOU 选中的 Anchor | 1->1 |
[[YOLOv4]] | IOU | Anchor-base | 正样本:站在 gt 的角度,哪些与其的 IOU 大于阈值即可; 负样本:其余预测框 | 1->n |
[[YOLOv5]] | Shape | Anchor-base | 正样本:站在 gt 的角度,不管在那个 head 的 anchor (跨 head),只要其宽高比在一定范围内就是(跨 anchor)+ 该 anchor 附近的 anchor(跨 cell) 负样本:其余预测框 | 1->n |
[[CornerNet]] | 位置 | - | 正样本:一个 cell 只预测一个框 | 1->1 |
[[CenterNet]] | 位置 | - | 正样本:一个 cell 只预测一个框 | 1->1 |
FCOS | 位置 | - | 正样本:对于每个 level,如果某个 cell 落在 gt 上,则其负责预测该 gt,也就是说一个 gt 可以被多个检测 head 预测,但是这个过程需要考虑目标的尺寸,如果其尺寸大于特征图或者在特征图上是 1 个点,则该 level 不负责该目标的预测 | 1->n |
[[SSD]] | IOU | Anchor-base | 正样本:站在 gt 的角度,与其 IOU > 阈值的 anchor ; 负样本:所有 anchor 中,没有和 gt 匹配的 anchor;如果存在 gt 框匹配不到正样本,忽略前面 2 条规则,按 MaxIOU 判断正样本 | 1->n |
[[DSSD]] | IOU | Anchor-base | 正样本:站在 gt 的角度,与其 IOU > 阈值的 anchor ; 负样本:所有 anchor 中,没有和 gt 匹配的 anchor;如果存在 gt 框匹配不到正样本,忽略前面 2 条规则,按 MaxIOU 判断正样本 | 1->n |
[[FPN]] | 双 IOU | - | 正样本 IOU>0.7 负样本 IOU<0.3 | 随机选择 128 个正样本 + 128 个负样本参加训练 |
动态分配
所谓动态分配,根据模型实际输出,计算输出和 GT 框之间的 loss 或者 IOU,选择较小 loss 或者较大 IOU 输出框作为正样本
模型 | 指标 | Abchor | 描述 |
---|---|---|---|
[[YOLOv1]] | MaxIOU | Anchor-base | 正样本:目标对应 cell 处预测的最大 IOU 框 负样本:该位置其他预测 |
ATSS | ATSS | Anchor-base | 正样本:大于统计性 IOU 阈值的 anchor 负样本:剩余 anchor |
PAA | PAA | Anchor-base | 正样本:大于学习到的分数阈值的 anchor 负样本:剩余 anchor |
[[YOLOF]] | UniformMatcher | Anchor-base | 正样本:站在 gt 的角度,计算与所有 anchor 的 L1 距离,保留 topK 的结果,再根据 IOU>0.5 筛选 anchor; 训练时,为了保证模型稳定,不计算 IOU>0.7 的正锚框和 IOU<0.3 的负锚框; 负样本:没有 gt 与其对应的 anchor |
[[YOLOX]] | 动态样本匹配 (SimOTA) | Anchor-free | 正样本:计算模型输出与 gt 之间的 IOU, 动态选取损失最小的 k 个输出 |
[[YOLOv6]] | 动态样本匹配 (SimOTA)+YOLOv5 的正样本匹配 | Anchor-free | 正样本:利用 YOLOv5 的匹配方法增加正样本数量,利用 SimOTA 动态选择样本 |
[[YOLOv7]] | 动态样本匹配 (SimOTA)+YOLOv5 的正样本匹配 | Anchor-base | 正样本:利用 YOLOv5 的匹配方法增加正样本数量,利用 SimOTA 动态选择样本 |
YOLOv8 | 任务对齐标签分配 (TAL) | Anchor-free | 根据分类与回归的分数加权的分数选择正样本 |
PP-YOLOE | 任务对齐标签分配 (TAL) | Anchor-free | 根据分类与回归的分数加权的分数选择正样本 |
RT-DETR | 匈牙利匹配 | Anchor-free | |
YOLOv10 | One-to-many+one-to-one | Anchor-free | 训练时使用双头训练,推理时只使用 one-to-one |