4、经典检测模型选型:YOLOv5、Faster R-CNN、SSD的工业场景对比

做工业缺陷检测,选模型就像选工具。你不可能拿把扳手去拧螺丝刀该干的活。我这些年踩过的坑,有一半都跟模型选型有关。今天咱们就掰开揉碎,聊聊YOLOv5、Faster R-CNN和SSD这三兄弟,在工业现场到底该怎么挑。

4.1 为什么工业场景这么挑模型?

工业缺陷检测跟学术比赛不一样。学术比赛比的是mAP,差0.1个点都能发篇。但工厂里,老板只关心三件事:能不能跑实时?误检率多少?部署方不方便?

我去年帮一家电子厂做PCB板缺陷检测,产线节拍是每秒2.5个板子。你算算,留给模型推理的时间只有400毫秒。Faster R-CNN精度再高,跑一次要800毫秒,直接就被PASS了。这就是工业的残酷现实——精度和速度必须同时满足。

工业部署的核心矛盾:

  • 产线要求实时性(通常 < 50ms/帧)
  • 缺陷样本极其稀少(正负样本比可达1:10000)
  • 硬件资源受限(边缘设备GPU显存通常4-8GB)
  • 模型需要频繁迭代(换产品就得重新训练)

4.2 三款模型的核心差异

先看一张对比表,心里有个底:

维度 YOLOv5 Faster R-CNN SSD
核心思想 单阶段,端到端回归 两阶段,先提候选框再分类 单阶段,多尺度特征图预测
推理速度 ★★★★★(极快) ★★☆☆☆(慢) ★★★★☆(快)
小目标检测 ★★★☆☆(中等) ★★★★★(优秀) ★★☆☆☆(较差)
训练难度 低(开箱即用) 高(调参复杂) 中(锚点设计关键)
ONNX转换 ★★★★★(原生支持) ★★★☆☆(需处理ROI) ★★★★☆(较顺畅)
显存占用 低(~2GB) 高(~6GB) 中(~3GB)

4.3 YOLOv5:工业场景的万金油

说实话,我现在80%的工业项目都首选YOLOv5。为什么?因为它太懂工业了。

优势一:速度就是正义

YOLOv5s在TensorRT上能跑到2ms一帧。我做过一个轴承表面划痕检测项目,产线要求每分钟检测600个零件。用YOLOv5s,单张图片推理只要1.8ms,加上前后处理,稳稳控制在10ms以内。换成Faster R-CNN?同样的硬件,直接飙到45ms,差点被客户骂死。

优势二:ONNX转换零痛苦

YOLOv5官方就提供了export.py脚本,一行命令导出ONNX。我遇到过最复杂的情况,也就是改一下opset版本。不像某些模型,转个ONNX要改三天的代码。

# YOLOv5 ONNX导出(实测可用)
python export.py --weights best.pt --include onnx --opset 12

# 导出后验证
import onnxruntime as ort
session = ort.InferenceSession("best.onnx")
# 直接跑推理,不需要改任何网络结构

劣势:小目标检测是短板

但YOLOv5不是万能的。我做过一个手机屏幕划痕检测,划痕宽度只有2-3个像素。YOLOv5直接漏检了40%。后来我换成了YOLOv5的P6模型(输入640x640),加上数据增强,才勉强把漏检率压到15%。

我的经验:如果缺陷面积占整图比例小于0.5%,别硬上YOLOv5。要么切图,要么换模型。

4.4 Faster R-CNN:精度至上,但代价不菲

Faster R-CNN就像实验室里的精密仪器——精度确实高,但搬到工厂里,处处是坑。

优势:小目标检测的王者

它的RPN(区域提议网络)天生就适合找小东西。我做过一个芯片引脚缺陷检测项目,引脚间距只有0.3mm,缺陷尺寸在10x10像素左右。YOLOv5和SSD都试过,漏检率30%以上。换成Faster R-CNN,漏检率直接降到5%。

劣势:部署成本太高

但代价也很明显。首先,显存占用大。我用Faster R-CNN跑1024x1024的图片,batch size只能设1,显存就吃了5.8GB。其次,ONNX转换是个噩梦——ROI Pooling层在ONNX里没有原生支持,得自己写Custom Op。

避坑指南:我曾经花了两周时间,想把Faster R-CNN的Mask分支也转成ONNX。结果发现,ONNX Runtime对Mask R-CNN的支持极其有限。最后只能放弃Mask分支,只用检测头。如果你需要实例分割,建议直接考虑YOLACT或者SOLO。

4.5 SSD:被低估的工业老兵

SSD现在讨论的人少了,但说实话,在某些场景下它比YOLOv5还稳。

优势:多尺度特征图设计

SSD从多个特征层做预测,这个设计对工业场景很友好。比如检测一个金属零件,既有大的表面划痕(需要高层语义),又有小的边缘毛刺(需要底层细节)。SSD天然就能兼顾。

劣势:锚点设计太敏感

但SSD的锚点(anchor)设计是个玄学。我做过一个项目,缺陷的宽高比是1:8(细长划痕)。SSD默认的锚点比例是{1, 2, 3, 1/2, 1/3},完全覆盖不到。后来我手动加了1:8和1:10的比例,mAP才从62%涨到78%。

# SSD锚点调整示例(基于PyTorch)
from torchvision.models.detection import ssd300_vgg16

model = ssd300_vgg16(pretrained=False, num_classes=2)
# 默认锚点比例
# model.anchor_generator.sizes = ((30,), (60,), (111,), (162,), (213,), (264,))
# model.anchor_generator.aspect_ratios = ((0.5, 1.0, 2.0),) * 6

# 针对细长缺陷调整
model.anchor_generator.aspect_ratios = (
    (0.125, 0.25, 0.5, 1.0, 2.0, 4.0, 8.0),  # 增加1:8和8:1
) * 6

4.6 工业场景选型决策树

说了这么多,到底怎么选?我画了张图,你照着走就行:

工业缺陷检测模型选型决策树 工业缺陷检测需求 产线实时性要求 < 50ms/帧? 是 否 小目标缺陷? 是 否 YOLOv5-P6 YOLOv5s/m 小目标缺陷? 是 否 Faster R-CNN SSD 选型补充说明 • 缺陷面积 < 0.5% 整图 → 优先考虑Faster R-CNN或YOLOv5-P6 • 缺陷宽高比极端(如1:10)→ SSD需手动调整锚点,YOLOv5更省心 • 边缘设备部署(Jetson等)→ 无脑选YOLOv5,ONNX+TensorRT最成熟 • 多类别+小目标混合 → 试试YOLOv5l或YOLOv5x,别一上来就上Faster R-CNN

4.7 我的最终建议

如果你现在让我给一个刚入行的工程师建议,我会说:

  • 第一选择:YOLOv5。80%的工业场景它都能搞定。速度快、部署简单、社区活跃。遇到小目标问题,先试试切图或者P6模型。
  • 第二选择:SSD。当YOLOv5精度不够,但硬件资源又跑不动Faster R-CNN时,SSD是个不错的折中。记得花时间调锚点。
  • 最后选择:Faster R-CNN。只有当你试了所有单阶段模型,精度还是不达标,而且硬件预算充足时,才考虑它。

一个小技巧:我每次做项目选型,都会先用YOLOv5跑一个baseline。如果mAP低于85%,再考虑换模型。别一上来就搞复杂的,先看看简单模型能不能解决问题。很多时候,数据质量和数据增强比模型选型重要得多。