多标签图像分类任务的评价方法-mAP

本文介绍多标签图像分类任务中的评估指标mAP及其计算方法,包括如何获取confidence score、计算precision与recall,以及绘制Precision-Recall曲线。

多标签图像分类(Multi-label   Image  Classification)任务中图片的标签不止一个,因此评价不能用普通单标签图像分类的标准,即mean  accuracy,该任务采用的是和信息检索中类似的方法—mAP(mean  Average  Precision)。mAP虽然字面意思和mean  accuracy看起来差不多,但是计算方法要繁琐得多,以下是mAP的计算方法:

首先用训练好的模型得到所有测试样本的confidence  score,每一类(如car)的confidence   score保存到一个文件中(如comp1_cls_test_car.txt)。假设共有20个测试样本,每个的id,confidence  score和ground  truth  label如下:​​

 

接下来对confidence  score排序,得到:

这张表很重要,接下来的precision和recall都是依照这个表计算的

然后计算precision和recall,这两个标准的定义如下:

上图比较直观,圆圈内(true   positives + false  positives)是我们选出的元素,它对应于分类任务中我们取出的结果,比如对测试样本在训练好的car模型上分类,我们想得到top-5的结果,即:

在这个例子中,true   positives就是指第4和第2张图片,false   positives就是指第13,19,6张图片。方框内圆圈外的元素(false   negatives和true  negatives)是相对于方框内的元素而言,在这个例子中,是指confidence   score排在top-5之外的元素,即:

 

其中,false   negatives是指第9,16,7,20张图片,true   negatives是指第1,18,5,15,10,17,12,14,8,11,3张图片。

那么,这个例子中Precision=2/5=40%,意思是对于car这一类别,我们选定了5个样本,其中正确的有2个,即准确率为40%;Recall=2/6=30%,意思是在所有测试样本中,共有6个car,但是因为我们只召回了2个,所以召回率为30%。

实际多类别分类任务中,我们通常不满足只通过top-5来衡量一个模型的好坏,而是需要知道从top-1到top-N(N是所有测试样本个数,本文中为20)对应的precision和recall。显然随着我们选定的样本越来也多,recall一定会越来越高,而precision整体上会呈下降趋势。把recall当成横坐标,precision当成纵坐标,即可得到常用的precision-recall曲线。这个例子的precision-recall曲线如下:

接下来说说AP的计算,此处参考的是PASCAL  VOC  CHALLENGE的计算方法。首先设定一组阈值,[0, 0.1, 0.2, …, 1]。然后对于recall大于每一个阈值(比如recall>0.3),我们都会得到一个对应的最大precision。这样,我们就计算出了11个precision。AP即为这11个precision的平均值。这种方法英文叫做11-point interpolated average precision。​

当然PASCAL VOC CHALLENGE自2010年后就换了另一种计算方法。新的计算方法假设这N个样本中有M个正例,那么我们会得到M个recall值(1/M, 2/M, …, M/M),对于每个recall值r,我们可以计算出对应(r’ > r)的最大precision,然后对这M个precision值取平均即得到最后的AP值。计算方法如下:​

 

 

相应的Precision-Recall曲线(这条曲线是单调递减的)如下:​

 

AP衡量的是学出来的模型在每个类别上的好坏,mAP衡量的是学出的模型在所有类别上的好坏,得到AP后mAP的计算就变得很简单了,就是取所有AP的平均值。


多标签图像分类与单标签图像分类的主要区别在于每个图像可能关联的类别数量不同。在单标签分类中,每个图像被分配到一个且仅有一个类别[^1];而在多标签分类中,一个图像可以同时属于多个类别[^2]。 ### 技术实现上的差异 - **损失函数**:对于单标签分类问题,通常使用交叉熵损失(Cross Entropy Loss),它适用于预测单一正确类别的场景。而多标签分类问题则倾向于使用二元交叉熵损失(Binary Cross Entropy Loss, BCEWithLogitsLoss),因为这种情况下每个类别都需要独立地进行存在与否的判断[^4]。 - **模型输出**:单标签分类模型的输出层一般采用softmax激活函数,以确保输出的概率分布之和为1,表示各个类别的相对概率。相反,多标签分类模型的输出层更常用sigmoid激活函数,这样可以让每个输出节点独立地表示对应类别的存在概率,而不受其他节点的影响[^4]。 - **评估指标**:两者之间的评价标准也有所不同。单标签分类常用的评估指标包括准确率、精确率、召回率以及F1分数等。然而,在处理多标签分类任务时,除了上述指标外,还可以使用Hamming Loss、Jaccard Index或基于排名的度量如平均精度均值(mAP)来衡量模型性能[^2]。 ### 应用场景的不同 -标签图像分类适合于那些每张图片只能明确归属于一个特定类别的应用场合,例如手写数字识别或者动物种类识别。 - 多标签图像分类更适合现实世界中的复杂情况,比如一张包含天空、山脉和湖泊的照片能够同时归入“自然”、“风景”等多个标签下。这种分类方式更加贴近实际需求,因为它允许图像具有多重身份。 ### 提升多标签分类效果的方法 为了提高多标签图像分类的效果,研究者们提出了多种方法来捕捉标签间的关系及标签与图像特征间的联系。这些方法包括利用注意力机制(Attention Mechanism)来增强模型对关键区域的关注度,从而更好地理解图像内容及其相关的标签信息[^3]。 ```python # 示例代码 - 使用PyTorch定义一个多标签分类模型的最后一层 import torch.nn as nn class MultiLabelClassifier(nn.Module): def __init__(self, num_classes): super(MultiLabelClassifier, self).__init__() # 假设前面已经定义好了特征提取网络 self.classifier = nn.Linear(512, num_classes) # 根据实际情况调整输入维度 def forward(self, x): # 特征传递过程... logits = self.classifier(x) return logits # 初始化模型 model = MultiLabelClassifier(num_classes=10) # 定义损失函数 criterion = nn.BCEWithLogitsLoss() # 假设有随机生成的数据和目标 input_data = torch.randn(64, 512) # batch_size=64, 输入特征维度=512 targets = torch.randint(0, 2, (64, 10)).float() # batch_size=64, 类别数=10 # 计算损失 outputs = model(input_data) loss = criterion(outputs, targets) ``` 通过上述技术手段的应用,可以在一定程度上提升多标签图像分类任务的表现力和准确性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值