YOLOv5-计算不同的地图值
YOLOv5-不同map值计算
0. 源码链接:
1. 显示效果
yolov5运行val.py
时,显示如下(图1)所示,只有map50
和map50-95
, 如果想显示map75,如下(图2)所示,应该修改部分代码内容。
2. 解决思路
-
任务背景:yolov5版本:
6.2
, 解决问题为12
个类别的检测问题 -
解决关键代码在
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
就可以了!!!