085、安防监控行人属性检测:YOLO + 多属性分类 Head 的联合设计
一、从一次线上事故说起
去年秋天,某智慧园区项目上线第三天,凌晨两点报警系统疯狂触发——系统把穿红色雨衣的保洁阿姨识别成了“持械歹徒”。排查后发现,行人属性检测模块把“红色上衣”和“手持长条物体”两个属性同时误判了。更离谱的是,属性分类头输出的置信度居然都在0.85以上,模型对自己的错误判断非常“自信”。
这个bug让我意识到:在安防场景下,单纯把YOLO检测框和属性分类做成两个独立模型,或者简单地在检测头后面接一个全连接层做多标签分类,都会出大问题。前者延迟高、特征不共享,后者容易属性间相互干扰——比如“背包”和“挎包”同时激活,“男性”和“长发”打架。
二、多属性分类头的设计陷阱
先说说最直观的做法:在YOLOv8的检测头后面,接一个并行的分类分支,每个属性一个二分类输出。比如性别(男/女)、上衣颜色(红/蓝/黑/白…)、是否背包、是否戴帽、是否持物等。看起来简单,但实际调试时踩了三个坑。
坑一:属性间的不平衡。安防场景下,“男性”样本可能是“女性”的5倍,“不背包”样本是“背包”的10倍。如果直接对每个属性用BCE Loss,模型会倾向于预测多数类。我试过给每个属性单独设置正负样本权重,但调参调到头秃——因为不同属性之间的权重比例是动态变化的,比如白天女性多,晚上男性多。
坑二:属性间的相关性被忽略。“长发”和“女性”高度