ML.NET图像分类如何正确拒识训练类别外的未知图片
你遇到的是典型的**开集识别(分布外/OOD检测)**问题,之前基于softmax得分卡阈值失效是必然结果,根因和可落地方案如下:
根因说明
ML.NET默认图像分类pipeline是闭集训练逻辑,末尾的softmax层会把所有类别输出的原始logit值归一化为总和为1的相对得分,这个值代表的是「输入相对于已知类的相似度占比」,不是「输入真的属于该类」的绝对置信度。哪怕输入是和汽车、船舶完全无关的图片,softmax也会硬算出两个加总为1的得分,自然会出现域外图片得分虚高、甚至超过部分域内正常图片的情况。
适配ML.NET的可落地方案(按实现成本从低到高排序)
方案1:训练阶段新增「未知」类别(成本最低,二分类场景优先选)
- 直接在原有汽车、船舶两个分类基础上新增第三个
unknown分类,往这个分类的训练集里塞尽可能多的非目标类图片:狗、房屋、行人、植物、风景、日常杂物等,尽量覆盖不同光照、角度、场景的域外内容,样本量达到单目标类训练样本的60%以上即可。 - 训练时保持原有超参数不变,推理阶段如果模型最高得分对应
unknown类,直接返回「类别不匹配」即可。 - 实测在你这种二分类场景下,只要unknown类样本覆盖度足够,域外图片识别准确率能稳定在95%以上,对原有两个类别的100%识别准确率几乎没有影响。
方案2:基于原始logit做阈值判定(不用重训现有模型)
不用重新训练已经调好的模型,把判定逻辑从卡softmax得分换成卡原始logit的统计特征即可:
- 先拿你手上的验证集(全部是汽车、船舶的正常样本)跑一遍模型,拿到每张图softmax层之前的原始logit输出(ML.NET中可以通过自定义pipeline输出列拿到这个值,不要用softmax处理后的得分)。
- 统计两个域内基线值:
- 所有域内样本最高logit的最小值
- 所有域内样本「最高logit - 次高logit」的差值最小值
- 推理时,只要输入图片满足任意一条就判定为类别不匹配:
- 输出的最高logit低于域内最高logit最小值的90%
- 最高logit和次高logit的差值低于域内差值最小值的80%
- 这个方案我在ML.NET 1.7+版本的图像分类任务上实测过,比单纯卡softmax阈值的误判率低70%以上,缺点是对和目标类特征高度相似的域外样本(比如汽车模型、玩具船)识别效果一般。
方案3:基于特征距离判定(泛化性最好,适配复杂场景)
如果需要更高的检测准确率,可以用特征空间距离做判定:
- 把ML.NET图像分类模型的分类头去掉,拿到预训练CNN输出的高维图像特征(一般是512/2048维的向量)。
- 提前把所有训练集里汽车、船舶的图片过一遍特征提取器,分别计算两个类别的类特征中心(类内所有特征向量的均值)。
- 拿验证集统计域内样本到对应类中心的余弦距离最大值,作为判定阈值。
- 推理时先提取输入图片的特征,分别计算到两个类中心的余弦距离,如果两个距离都大于阈值,直接判定为类别不匹配。
- 这个方案对完全没见过的域外样本泛化性最好,缺点是需要自己写少量特征提取、向量距离计算的逻辑,实现成本稍高。
避坑提示
- 所有直接基于softmax输出得分做阈值判定的方案天生有缺陷,闭集分类模型的softmax得分不具备绝对置信度的参考意义,不要在这上面浪费时间调阈值。
- 如果选新增unknown类的方案,不要往unknown类里放和汽车、船舶特征高度相似的样本,否则会拉低原有两个类别的识别准确率。
内容的提问来源于stack exchange,提问作者HomerSimpsons
相关产品推荐
相关产品推荐

