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 工业场景选型决策树
说了这么多,到底怎么选?我画了张图,你照着走就行:
4.7 我的最终建议
如果你现在让我给一个刚入行的工程师建议,我会说:
- 第一选择:YOLOv5。80%的工业场景它都能搞定。速度快、部署简单、社区活跃。遇到小目标问题,先试试切图或者P6模型。
- 第二选择:SSD。当YOLOv5精度不够,但硬件资源又跑不动Faster R-CNN时,SSD是个不错的折中。记得花时间调锚点。
- 最后选择:Faster R-CNN。只有当你试了所有单阶段模型,精度还是不达标,而且硬件预算充足时,才考虑它。
一个小技巧:我每次做项目选型,都会先用YOLOv5跑一个baseline。如果mAP低于85%,再考虑换模型。别一上来就搞复杂的,先看看简单模型能不能解决问题。很多时候,数据质量和数据增强比模型选型重要得多。