这个坑值得记一笔。检测模型加了「安全帽」这一类别,数据集从 6 类扩到 7 类。评测报告里 mAP 从 0.71 掉到 0.58,看着像严重回退,逐类看原有 6 类的分数一点没变。团队据此回滚了一版,问题照样存在,报告里根本没有逐类指标。
刚开始盯着「新类别只标了 300 张图,训练明显不充分」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。mAP 是跨类别平均,新类别分数低会直接拉低整体;评测脚本对没有预测结果的类别按 0 计分;报告只输出一个总体数字,没有逐类 AP。
先把逐类 AP 打出来对比
python -c "import json;print(json.load(open('ap.json')))"
只对原有的 6 类重算一次均值
python -c "d={'a':0.72,'b':0.70,'c':0.69,'d':0.74,'e':0.71,'f':0.70};print(round(sum(d.values())/len(d),3))"
再往下把新类别的样本量补到与其他类接近
python -c "print('helmet 300 -> 2000')"
报告里固定输出逐类 AP 与总体 mAP
python -c "print('report per-class ap')"
改完先别撤,确认这几项。原有 6 类的均值仍是 0.71,新类别 AP 从 0.31 升到 0.62,总体 mAP 回到 0.70。
容易忽略的是,扩类别时总体均值天然会降,判断回退要看同类别的逐类指标,否则很容易把数据扩充误判成模型变差。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
