《------往期经典推荐------》
二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】,持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~
《------正文------》
引言
上一篇文章《YOLOv8-v12的评估指标转为COCO指标详细过程【附源码】》详细介绍了如何将YOLO在验证集上的评估结果转为COCO评估格式评估结果。但是细心的小伙伴会发现YOLO评估指标mAP50在转换成COCO评估指标后,COCO评估结果比YOLO评估结果低了1个多点。
这主要是由于YOLO默认的评估指标(如mAP@0.5、mAP@0.5:0.95)与COCO官方指标(如AP、AP@[0.5:0.95])的计算逻辑存在差异
。这种差异源于两者在PR曲线采样策略、交并比(IoU)阈值设定及多任务评价维度上的不同设计。例如:YOLO默认采用线性插值法生成PR曲线,而COCO评估工具(pycocotools)则优先匹配真实数据点,导致同一模型在不同框架下指标波动。
本文将对YOLO的PR曲线采样策略中的插值方法
改为COCO使用的最接近采样点的真值点
,使其原始评估指标与转换成COCO评估指标后的结果更加接近
。但是由于还有其他计算差异,评估指标也不能完全一致。
一、AP差异的原因
-
PR曲线采样策略不同
- YOLOv8-v12:在计算AP时,若某个召回率(Recall)采样点没有对应的精确率(Precision)真值,YOLO会通过线性插值左右两个临近的真值点生成估算值。
- pycocotools:遇到同样情况时,直接选择最接近采样点的真值点的精确率值,避免插值引入误差。
- 影响:当PR曲线波动较大时(尤其是小目标检测场景),插值法会平滑曲线,导致AP偏高或偏低,而pycocotools的“真值优先”策略更符合实际数据分布。
-
适用范围差异
pycocotools是COCO官方评估工具,其方法被广泛认可为标准化指标计算方式,而YOLO的默认实现可能因插值导致横向对比偏差。
二、修改方法:使YOLOv8-v12的AP计算接近pycocotools
通过调整YOLOv8-v12的AP计算逻辑,将采样策略从线性插值改为“搜索最近真值”模式。以下是关键代码修改步骤:
- 修改AP计算函数
在YOLOv8-v12的验证代码中,找到AP计算部分(位于ultralytics/utils/metrics.py
)的compute_ap
函数中,原始代码如下:
将插值方法"interp"替换为搜索最近真值方法searchsorted
,修改代码如下:
添加的代码内容:elif method == "searchsorted": q = np.zeros((101,)) x = np.linspace(0, 1, 101) # 101-point interp (COCO) inds = np.searchsorted(recall, x, side='left') try: for ri, pi in enumerate(inds): q[ri] = precision[pi] except: pass q_array = np.array(q) ap = np.mean(q_array[q_array > -1])
注意:确保在调用AP计算时,设置
method='searchsorted'
,禁用插值逻辑。
三、修改前后结果对比
YOLO修改前评估结果
YOLO修改AP计算逻辑前评估结果如下,mAP50为0.817。
YOLO修改后评估结果
YOLO修改AP计算逻辑后评估结果如下,mAP50为0.81。
YOLO转COCO评估结果
可以看到,YOLO在修改AP计算逻辑中的采样方法之前mAP@0.5为0.817,与COCO结果0.805相差了0.012
。但是修改了AP计算逻辑中的采样方法之后mAP@0.5为0.81,与COCO结果0.805相差了0.005
。修改后YOLO评估结果与COCO评估结果更加接近,但是由于还有一些其他计算方式的差异,导致结果还是有些许差异。
总结
通过调整采样策略和参数,可以略微修正YOLOv8-v12的AP计算结果可与pycocotools的评估结果。建议在模型对比时统一使用pycocotools作为评估工具,并关注小目标检测场景下的模型结构优化。
好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!