mAP计算方法概述

本文解析了FPN模型的测试流程,通过示例图片详细介绍了如何使用test_net.py调用test.py下的deftest_net函数进行模型评估,包括置信度排序、计算IOU、确定真阳性与假阳性等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Git开源项目(比如unsky的FPN)中test_net.py调用test.py下的def test_net(net, imdb, max_per_image=1000, thresh=0.05, vis=False)函数。


代码之后会顺一遍,先介绍下思路:


假设一张测试图片有3个标定好的Ground Truth (黑色) 模型预测结果pred为6个框 (5红 + 1蓝)。 首先将所有pred按照置信度(score)反序排列,之后从score最大的pred开始遍历每个Ground Truth并计算IOU. 如果IOU大于阈值,查看g+表(最右)对应的GT的det是否为1:不为1则det置1并将此pred的TP至1;det为1则说明之前有更大score的框对应上了这个GT,则此pred的FP置1; 最终根据TP FP计算每个类的AP, 具体过程需要看代码

 

### 计算基于类别mAP的图像权重 为了提高目标检测或图像分类的效果,可以根据各类别的平均精度均值(mean Average Precision, mAP)来调整图像样本的权重。这样做有助于解决数据集中不同类别的样本数量不平衡问题以及某些类别难易程度差异较大的情况。 #### 方法概述 1. **计算每张图片中每个类别的贡献** 对于给定的数据集,首先统计每一张图片内属于各个类别的对象数目。设某张图片\(i\)含有\(n_i\)个标注框,其中第\(j\)个标注框所属类别为\(c_j\)[^1]。 2. **获取每个类别的mAP** 使用验证集评估模型性能得到每一类别的mAP得分\[ \text{mAP}_k \],这里\( k \in K \),表示共有K种类别。 3. **定义加权机制** 基于上述两个因素——即某个特定类别在该幅图中的存在频率及其对应的mAP表现——可以构建一个合理的权重函数w(i,c_k) 来衡量一幅图的重要性: \[ w(i, c_k)=f(\sum_{j=1}^{n_i}\delta(c_j==c_k), \text{mAP}_{c_k}) \] 其中δ是一个指示函数,当条件成立时返回1,否则返回0;而f()则取决于具体应用场景下的需求设定,比如简单的乘法组合或者其他形式的映射关系。 4. **归一化处理** 为了让这些权重能够更好地应用于后续的学习过程中,通常还需要对其进行标准化操作,使其总和等于整个批次大小N: \[ W=\frac{\left[w(1)+...+w(N)\right]}{\sum _{{i}=1}^N w({i})} \] 5. **应用到损失函数** 最终,在反向传播更新参数之前,将此权重矩阵W作用于交叉熵或其他类型的损失项之上,从而实现对困难样例的重点关注并改善整体泛化能力。 ```python import numpy as np def calculate_image_weights(dataset_mAPs, image_class_counts): """ Calculate the weights of images based on class-wise mAP and their presence in each image. :param dataset_mAPs: Dictionary mapping classes to their respective mAP scores. :param image_class_counts: List where each element is a dictionary counting occurrences per class within an image. :return: Normalized list of floats representing weight assigned to each training sample/image. """ # Initialize empty array for storing unnormalized weights raw_weights = [] # Iterate over all images' class counts for img_classes in image_class_counts: total_weight_for_img = sum([dataset_mAPs[class_id]*count for class_id, count in img_classes.items()]) raw_weights.append(total_weight_for_img) # Normalize so that they add up to one (or another constant value depending upon batch size considerations) normalized_weights = [float(i)/sum(raw_weights) for i in raw_weights] return normalized_weights ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值