如何让训练好的CNN模型识别不属于训练集的未知类别样本?
你遇到的是典型的*开放集识别(Open Set Recognition, OSR)*问题,常规CNN训练默认是闭集场景,只会把输入归到训练见过的类别中,要实现未知类别判定可以用以下几种可行方案:
Softmax输出阈值化
这是改造成本最低的方案,无需调整原有模型结构和训练逻辑。常规CNN最后一层Softmax会输出每个已知类别的置信度,未知类别输入时,模型输出的最高置信度通常会低于已知类样本的最高置信度。你可以准备一批验证用的已知类样本,以及一批不属于5个训练类别的开放样本,分别跑通模型得到两类样本的最大Softmax得分分布,选定一个合适的阈值T。推理时如果模型输出的最高置信度低于T,直接返回「未检测到对应类别」即可。如果存在模型对未知类过度自信的问题,可以先通过*温度缩放(Temperature Scaling)*等置信度校准方法校准模型输出,再做阈值判断效果会更好。新增未知类重新训练
收集大量不属于原有5个类别的通用图像,统一标注为第6类「未知类」,加入训练集重新训练CNN模型。训练时模型会自主学习已知类和未知类的特征差异,推理时如果模型判定为第6类,就返回未知类别提示。要注意未知类的训练样本需要尽可能覆盖多样的图像分布,避免样本太单一导致漏判未见过的未知类型,样本不足时也可以用生成模型合成的样本做补充。替换为开放集识别专用结构
如果你不方便大规模收集未知类样本,可以微调原有模型适配开放集场景,常用的方案包括:- 使用
OpenMax层替换原有Softmax层,它会计算输入特征和已知类特征中心的距离,额外输出未知类的概率,推理时如果未知类概率最高或超过阈值就判定为未知 - 基于能量的OOD(Out-of-Distribution)检测方法,计算输入对应的模型能量值,能量超过预设阈值就判定为分布外的未知样本
这类方案的识别精度通常比单纯阈值化Softmax更高,且对未知训练样本的依赖度更低。
- 使用
特征距离匹配判断
适合已经完成模型训练、不方便重训的场景。首先把训练集所有样本输入CNN,提取全连接层前的特征向量,为每个已知类别计算平均特征中心。推理时先提取输入图像的对应特征,计算它和5个已知类特征中心的最小余弦距离/欧氏距离,如果最小距离超过预设阈值,就判定为未知类别。
内容的提问来源于stack exchange,提问作者Mohammad Mahdi Deramgozin

