先把当时的情况摆出来。ultralytics 8.3 训练完的 YOLOv8s 在验证集 mAP50 是 0.86,自己写推理脚本做部署,同一批图 mAP 只有 0.74,直接调 model.val() 又回到 0.86。
这类报错背后常见的原因有几处,逐个排除就行。自己实现的前处理没有等比缩放,直接 resize 变形。另一种情况是letterbox 填充色用了 0 而训练时是 114。
另外,坐标反算时减了 padding 却没除以缩放比例。少数情况下是验证脚本没有把输出框裁剪到图像边界,越界框算成错误。
先比对官方 val 与自研脚本的同一张图输入张量
python -c "import numpy as np;a=np.load('a.npy');b=np.load('b.npy');print(a.shape,float(np.abs(a-b).mean()))"
再往下用官方 letterbox 函数替换自研实现
python -c "from ultralytics.data.augment import LetterBox;lb=LetterBox((640,640),auto=False,stride=32);print(lb)"
然后按缩放比与 padding 反算回原图坐标
python -c "print((x-pad_x)/scale, (y-pad_y)/scale)"
末了重新跑一遍验证并输出每类 AP
yolo val model=best.pt data=data.yaml imgsz=640 conf=0.001
怎么算真的好了,看的是同一批现象。自研脚本在同一验证集上 mAP50 回到 0.86 附近,每类 AP 与官方 val 的差值都在 0.01 以内。
检测精度掉点九成出在前处理,先固定一张图对齐输入张量,比盲目调阈值和 NMS 有效得多。这类问题最好一次改到位,反复小改反而容易把原因搅混。
