YOLOv5-计算不同的地图值

YOLOv5-不同map值计算

  • 0. 源码链接:
  • 1. 显示效果
  • 2. 解决思路
  • 3. 修改部分
  • 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就可以了!!!

  • 物联沃分享整理
    物联沃-IOTWORD物联网 » YOLOv5-计算不同的地图值

    发表评论