逃离mAP陷阱:我在工业质检项目里对比YOLOv8和RT-DETR的实战记录

🔑 关键词:YOLOv8,RT-DETR,工业缺陷检测,模型对比,部署优化

📖 摘要:基于真实PCB质检项目,对比YOLOv8和RT-DETR的实战记录,重点分析mAP与产线误检率脱节的原因,以及TensorRT部署踩坑经验。

上个月我差点被一个项目搞到失眠。客户是一条小批量PCB产线,之前用YOLOv5s做缺陷检测,离线测试mAP50有0.87,上了产线之后误检率高达12%,工人天天骂。后来我把模型换成了YOLOv8s和百度开源的RT-DETR-l,做了两周的对比实验,想搞清楚到底是模型的问题还是我自己的问题。现在把结果和踩过的坑记录一下,希望能给做工业视觉的同行省点时间。

先说硬件和数据集。一台工控机,RTX 3060 12G,TensorRT 8.6,FP16。数据是我自己标了12000张PCB图像,分辨率2448x2048,缺陷类别有5种:短路、开路、划痕、异物、缺件。按8:1:1切训练/验证/测试。训练用batch=16,SGD跟AdamW都试过,最后YOLO系列用MomentumSGD,RT-DETR用AdamW,都跑了300ep。在相同的测试集上,YOLOv8s的mAP50是0.892,mAP50-95是0.617,TensorRT FP16下推理延迟19ms,单帧耗时约48FPS;RT-DETR-l的mAP50是0.905,mAP50-95到了0.648,纯精度确实更高,但延迟38ms,只有26FPS,显存占用还多了1.8G。让我意外的是,YOLOv8n虽然mAP50只有0.861,但延迟只有9ms,关键是小目标召回率反而比v8s低了7个百分点。所以光看mAP,你根本不知道产线上会怎么翻车。

其实最让我难受的不是这些数字,而是怎么调都压不下去的误检。有一阵子我试过改输入分辨率,从640改到1280,mAP50涨了1.5%,但误检率基本没动;又试了Mosaic+MixUp,过拟合是好了点,误检依然高。后来我把错误样本按类别聚类,发现误检几乎全部集中在白油漆喷码反光区域和连接器底部的阴影边缘。这时候我才意识到,问题不在模型结构,而在我标注数据时的一个很蠢的习惯——为了加快标注速度,我让标注员把“不太确定的模糊目标”统一标成缺陷,因为这样召回率好看。后果是模型学到的是“边缘模糊=缺陷”这种假特征,而不是真正的几何异常。所以我强烈建议,做工业检测的人在建数据集之前,先写一份标注边界文档,还要挑20张图让两个标注员独立标,算一下IoU一致性,低于0.75就得重来。这个方法救了我,重新清洗后误检率从12%降到4.2%,mAP50甚至没变。

部署阶段又是另一层地狱。YOLOv8s导出ONNX的时候,我图省事用了动态batch和动态shape,结果在TensorRT引擎构建时卡了3小时,最后报“Unsupported dynamic dimensions”。后来固定成1920x1920输入,batch=1,一切安静了。但fp16带来的精度损失比我想象中大,漏检率从fp32的0.3%升到0.9%,尤其是小划痕,几乎丢掉一半。解决方案不是换模型,而是对漏检高发的类别单独加了一个置信度惩罚系数,让NMS时保留更多候选框,代价是推理延迟增加2ms。RT-DETR倒是省心,DETR结构不需要NMS,导TensorRT没那么多坑,但速度实在撑不住节拍,只能当备胎。说真的,如果产线要求30FPS,YOLOv8s用TensorRT是够的,但你要留出检测之外的PLC通信和机械臂动作时间,建议实际算力打七折来算。

最后说说我的观点,可能有点反主流。很多论文喜欢鼓吹mAP越高越好,或者DETR终将取代YOLO,但在工业现场,真正要盯住的是误检率和漏检率在生产节拍下的联合分布,以及延迟的p99值。我后来建了一个“坏例评估集”,专门放那些反光、遮挡、低对比度的图片,每次模型迭代都先跑这个集,不过关就不上线。这个集合只有200张图,但比那份12000张的测试集更能预判产线表现。如果你想做迁移学习,也别只盯着Imagenet预训练权重,试试用同一个产线上一年的正常样本做自监督预训练,效果往往比COCO权重稳定。以上都是个人经验,不一定对,但希望你们少走点弯路。

🏷️ 标签: