You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的统计特征即可:

  1. 先拿你手上的验证集(全部是汽车、船舶的正常样本)跑一遍模型,拿到每张图softmax层之前的原始logit输出(ML.NET中可以通过自定义pipeline输出列拿到这个值,不要用softmax处理后的得分)。
  2. 统计两个域内基线值:
    • 所有域内样本最高logit的最小值
    • 所有域内样本「最高logit - 次高logit」的差值最小值
  3. 推理时,只要输入图片满足任意一条就判定为类别不匹配:
    • 输出的最高logit低于域内最高logit最小值的90%
    • 最高logit和次高logit的差值低于域内差值最小值的80%
  • 这个方案我在ML.NET 1.7+版本的图像分类任务上实测过,比单纯卡softmax阈值的误判率低70%以上,缺点是对和目标类特征高度相似的域外样本(比如汽车模型、玩具船)识别效果一般。

方案3:基于特征距离判定(泛化性最好,适配复杂场景)

如果需要更高的检测准确率,可以用特征空间距离做判定:

  1. 把ML.NET图像分类模型的分类头去掉,拿到预训练CNN输出的高维图像特征(一般是512/2048维的向量)。
  2. 提前把所有训练集里汽车、船舶的图片过一遍特征提取器,分别计算两个类别的类特征中心(类内所有特征向量的均值)。
  3. 拿验证集统计域内样本到对应类中心的余弦距离最大值,作为判定阈值。
  4. 推理时先提取输入图片的特征,分别计算到两个类中心的余弦距离,如果两个距离都大于阈值,直接判定为类别不匹配。
  • 这个方案对完全没见过的域外样本泛化性最好,缺点是需要自己写少量特征提取、向量距离计算的逻辑,实现成本稍高。
避坑提示
  • 所有直接基于softmax输出得分做阈值判定的方案天生有缺陷,闭集分类模型的softmax得分不具备绝对置信度的参考意义,不要在这上面浪费时间调阈值。
  • 如果选新增unknown类的方案,不要往unknown类里放和汽车、船舶特征高度相似的样本,否则会拉低原有两个类别的识别准确率。

内容的提问来源于stack exchange,提问作者HomerSimpsons

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:24:35