YOLOv5-不同map值计算

该博客介绍了如何在YOLOv5版本6.2中添加mAP75的显示和计算。通过修改val.py文件的特定行数,包括更新打印格式、计算平均精度、输出信息格式以及回调函数参数,实现了在运行验证时展示mAP75的值。修改后的代码使得用户能够更全面地评估模型在不同IoU阈值下的性能。

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

0. 源码链接:

Github项目链接

1. 显示效果

yolov5运行val.py 时,显示如下(图1)所示,只有map50map50-95, 如果想显示map75,如下(图2)所示,应该修改部分代码内容。
图1
图2

2. 解决思路

  1. 任务背景:yolov5版本:6.2, 解决问题为12个类别的检测问题

  2. 解决关键代码在276行,如下加粗部分
    在这里插入图片描述
    打印ap的值:结果如下图所示:输出结果12行,代表12个类别;每一行有10个数,分别代表ap[50, 55, 60, 65, 70, 75, 80, 85, 90, 95], 所以ap75=ap[5], map75=ap.mean[:,5]
    在这里插入图片描述

3. 修改部分

  • 190-191行

    # 修改前
    s = ('%22s' + '%11s' * 6) % ('Class', 'Images', 'Instances', 'P', 'R', 'mAP50', 'mAP50-95')
    tp, fp, p, r, f1, mp, mr, map50, ap50, map = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
    
    # 修改后
    s = ('%22s' + '%11s' * 7) % ('Class', 'Images', 'Instances', 'P', 'R', 'mAP50', 'mAP75', 'mAP50-95')
    tp, fp, p, r, f1, mp, mr, map50, map75, ap50, map = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
    
  • 276-277行

    # 修改前
    ap50, ap = ap[:, 0], ap.mean(1)  # AP@0.5, AP@0.5:0.95
    mp, mr, map50, map = p.mean(), r.mean(), ap50.mean(), ap.mean()
    
    # 修改后
    ap50, ap75, ap = ap[:, 0], ap[:, 5], ap.mean(1)  # AP@0.5, AP@0.75, AP@0.5:0.95
    mp, mr, map50, map75, map = p.mean(), r.mean(), ap50.mean(), ap75.mean(), ap.mean()
    
  • 281-282行

    # 修改前
    pf = '%22s' + '%11i' * 2 + '%11.3g' * 4  # print format
    LOGGER.info(pf % ('all', seen, nt.sum(), mp, mr, map50, map))
    
    # 修改后
    pf = '%22s' + '%11i' * 2 + '%11.3g' * 5  # print format
    LOGGER.info(pf % ('all', seen, nt.sum(), mp, mr, map50, map75, map))
    
  • 289行

    # 修改前
    LOGGER.info(pf % (names[c], seen, nt[c], p[i], r[i], ap50[i], ap[i]))
    
    # 修改后
    LOGGER.info(pf % (names[c], seen, nt[c], p[i], r[i], ap50[i], ap75[i], ap[i]))
    
  • 300行

    # 修改前
    callbacks.run('on_val_end', nt, tp, fp, p, r, f1, ap, ap50, ap_class, confusion_matrix)
    
    # 修改后
    callbacks.run('on_val_end', nt, tp, fp, p, r, f1, ap, ap50, ap75, ap_class, confusion_matrix)
    
  • 324行

    # 修改前
    map, map50 = eval.stats[:2]  # update results (mAP@0.5:0.95, mAP@0.5)
    
    # 修改后
    map, map50, map75 = eval.stats[:3]  # update results (mAP@0.5:0.95, mAP@0.75,mAP@0.5)
    
  • 336行

    # 修改前
    return (mp, mr, map50, map, *(loss.cpu() / len(dataloader)).tolist()), maps, t
    
    # 修改后
    return (mp, mr, map50, map75, map, *(loss.cpu() / len(dataloader)).tolist()), maps, t
    

    修改之后再运行val.py就可以了!!!

### mAP (Mean Average Precision) 的计算方法 #### 定义与基本原理 mAP目标检测中用于评估模型性能的重要指标之一。它表示所有类别 AP(Average Precision)的平均[^2]。具体来说,mAP 反映了模型在不同类别上的综合表现。 #### 计算步骤说明 为了更好地理解 mAP计算方式,可以将其分解为以下几个部分: 1. **Precision 和 Recall 的定义** - Precision 表示预测为正类别的样本中有多少是真正的正样本。 \[ \text{Precision} = \frac{\text{True Positives}}{\text{True Positives} + \text{False Positives}} \] - Recall 表示实际为正类别的样本中有多少被正确识别出来。 \[ \text{Recall} = \frac{\text{True Positives}}{\text{True Positives} + \text{False Negatives}} \] 2. **计算单个类别的 AP ** - 首先,在每个类别上按置信度得分对预测框进行排序。 - 接着,逐步增加阈并记录对应的 Precision 和 Recall - 使用插法获取每一步的最大 Precision ,并通过积分或加权平均的方式得出该类别的 AP [^4]。 3. **计算整体的 mAP** - 将所有类别的 AP 相加后除以总类别数即可得到最终的 mAP 。 \[ \text{mAP} = \frac{\sum_{i=1}^{C} \text{AP}_i}{C} \] 其中 \( C \) 代表总的类别数量,\(\text{AP}_i\) 表示第 i 类别的 AP 。 #### Python 实现代码示例 以下是基于上述逻辑的一个简单实现例子: ```python def compute_ap(recalls, precisions): """Compute the average precision from recall and precision curves.""" recalls = np.concatenate(([0.], recalls, [1.])) precisions = np.concatenate(([0.], precisions, [0.])) for i in range(precisions.size - 1, 0, -1): precisions[i - 1] = max(precisions[i - 1], precisions[i]) indices = np.where(recalls[1:] != recalls[:-1])[0] ap = np.sum((recalls[indices + 1] - recalls[indices]) * precisions[indices + 1]) return ap def compute_map(ap_per_class): """Calculate mean average precision given per-class APs.""" map_value = np.mean(ap_per_class) return map_value ``` #### 总结 综上所述,mAP 的核心在于逐类别计算 AP 并取其均得到总体评价标准。这一过程不仅考虑到了各个类别的检测准确性,还兼顾了数据分布不平衡的情况,因此成为广泛采用的目标检测评测手段[^1]。 ---
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值