098、异常检测与开集识别:YOLO 不认识的东西怎么让模型说“我不知道”
098、异常检测与开集识别:YOLO 不认识的东西怎么让模型说我不知道上周在产线部署YOLOv8做零件缺陷检测,遇到一个让人头疼的问题。模型把一颗掉落的螺丝钉当成了“合格品”,还把工人手上的创可贴识别成了“垫片”。甲方质检组长当场就炸了:“你们这模型连不认识的东西都敢瞎猜?”说实话,这问题太真实了。YOLO这类闭集检测模型,训练时只见过那几类目标,推理时遇到没见过的东西,它不会说“我不知道”,而是强行把特征往已知类别上靠。这就是开集识别(Open Set Recognition)和异常检测(Anomaly Detection)要解决的核心矛盾。为什么YOLO不会说“我不知道”先看YOLO的推理逻辑。模型输出的是边界框坐标和类别概率,最后通过Softmax或者Sigmoid做分类决策。Softmax有个致命缺陷——它强制所有类别概率之和为1。哪怕输入一张纯噪声图,模型也会挑一个概率最大的类别输出。我做过一个实验:用YOLOv8训练了5类工业零件,然后扔进去一张猫的图片。模型以87%的置信度输出“螺栓”。这不是模型笨,是Softmax的数学性质决定了它必须选一个。另一个坑是特征空间的封闭性。YOLO的Backbone提取特征后,分类头只在已知类别的特征空间内做决策。未知类别的特征可能落在已知类别的特征分布边缘,甚至完全重叠。这时候模型根本分不清“没见过”和“见过但不确定”。给YOLO装上“拒识”模块解决思路分两条线:一是改造模型结构,让模型能输出