yolo值的计算

YOLOv5-不同map值计算

解决思路

1,解决关键代码在276行,如下加粗部分

2,打印ap的值:结果如下图所示:输出结果12行,代表12个类别;每一行有10个数,分别代表ap[50, 55, 60, 65, 70, 75, 80, 85, 90, 95], 所以ap75=ap[5], map75=ap.mean[:,5]

修改部分

​ 190-191行

1
2
3
4
5
6
7
8
# 修改前
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行

1
2
3
4
5
6
7
8
# 修改前
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行

1
2
3
4
5
6
7
8
# 修改前
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行

1
2
3
4
5
6
# 修改前
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行

1
2
3
4
5
6
# 修改前
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行

1
2
3
4
5
6
# 修改前
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行

1
2
3
4
5
6
# 修改前
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