目标检测任务 每个类别做2分类交叉熵 vs softmax

在目标检测里,这俩其实对应两种不同的“类别假设”,没有绝对谁更“合理”,取决于任务是不是“互斥单标签”。

1) Softmax(单个多类交叉熵)什么时候更合理

前提:同一个框只属于一个类别(互斥),即 one-of-K

  • 典型:COCO/VO C 检测、YOLO/FCOS/Faster R-CNN 的常规设置(每个正样本框对应唯一 GT 类别)

  • 优点:

    • 天然互斥约束:把概率质量集中到一个类别上

    • 类间竞争更强,常常能让“分不清的相近类”更快拉开

    • 输出可直接当成类别分布(加背景类/或在两阶段里有 bg)

  • 代价/局限:

    • 若希望一个框能同时打上多个标签(例如“人 + 戴帽子 + 背包”),softmax 不合适(它强制只能选一个)

结论:如果数据标注是“每个目标只有一个类别”,softmax 是最“语义对齐”的选择之一。

2) 每类做二分类 BCE(sigmoid,多标签)什么时候更合理

前提:类别不互斥,允许一个框同时属于多个类(multi-label),即 K 个独立 Bernoulli

  • 典型:

    • Open-vocabulary / 多属性检测(一个框同时预测类别+属性)

    • 多标签数据集(例如一个框既是“vehicle”又是“car”这种层级/复合标签)

    • 以及很多一阶段检测器(历史上 RetinaNet 用 focal loss,本质也是 per-class sigmoid)

  • 优点:

    • 天然支持多标签,不用强行互斥

    • 对“长尾/稀有类”更友好(可配合 focal、class-balanced reweight)

  • 代价/局限(常见坑):

    • 如果真实语义其实是互斥的,用 BCE 会让模型不被强制互斥,可能出现“同一框多个类都很高”

    • 推理时需要额外策略(阈值、top-k、NMS),类间竞争弱一些

结论:如果需要多标签能力,或者做开放词表/层级标签/属性,BCE 更合理。

3) 在“常规单标签检测”里,为什么很多模型仍用 BCE?

因为检测头经常是“密集预测 + 极不平衡(正负样本)”,工程上:

  • per-class sigmoid +(focal / varifocal / quality focal)很容易处理海量负样本

  • 也更方便做“分类分数 × 质量分数(IoU/centerness)”的融合

所以:语义上 softmax 更匹配互斥单标签;工程上 BCE 系列在密集检测里非常常见且效果很好

该怎么选(快速准则)

  • 一个目标框只会有一个类别(COCO式):优先 softmax CE 或者 sigmoid +(QFL/VFL/focal) 都可;想更强互斥就 softmax。

  • 一个框可能多个标签/属性/层级:用 每类 BCE(sigmoid)

  • 部署/速度:两者计算差别不大;更多差异来自是否用 focal/QFL 这种改造和后处理策略。

Comments