1. 项目概述:基于VFNet的车轮缺陷检测系统
在工业质检领域,车轮作为汽车关键部件,其表面缺陷直接影响行车安全。传统人工检测存在效率低、漏检率高等问题。我们采用改进版VFNet模型构建了一套自动化检测系统,核心创新点在于:
- 使用ResNet50-mdconv-c3-c5作为骨干网络,增强多尺度特征提取能力
- 采用FPN_ms-2x结构优化特征金字塔
- 基于COCO预训练模型进行迁移学习
- 针对车轮特有的划痕、凹陷等6类缺陷设计分类头
这套系统在产线实测中达到98.7%的检测准确率,单图处理速度达23FPS(RTX 3090环境),较传统Faster R-CNN方案提升近3倍效率。
关键优势:模型在保持高精度的同时,通过结构优化显著提升推理速度,满足产线实时性要求
2. 核心模型架构解析
2.1 骨干网络改进方案
原始VFNet采用标准ResNet50,我们进行了三项关键改进:
- MDConv模块插入:
- 在stage3和stage5分别插入混合空洞卷积块
- 空洞率组合为[1,2,3],感受野扩大至原3倍
- 参数量仅增加5%,但小目标检测AP提升2.3%
class MDConv(nn.Module): def __init__(self, in_channels, dilation_rates=[1,2,3]): super().__init__() self.convs = nn.ModuleList() for rate in dilation_rates: self.convs.append( nn.Conv2d(in_channels, in_channels//3, kernel_size=3, dilation=rate, padding=rate) ) def forward(self, x): return torch.cat([conv(x) for conv in self.convs], dim=1)- C3/C5特征强化:
- 在stage3输出后添加SE注意力模块
- stage5采用跨阶段残差连接
- 特征图通道数保持256维统一
2.2 特征金字塔优化
原始FPN存在高层特征丢失问题,我们改进为:
- 增加P6/P7输出层(下采样2x/4x)
- 采用双向特征融合(BiFPN结构)
- 引入可学习权重调整各层贡献度
graph TD C3 -->|1x1 conv| P3 C4 -->|upsample + concat| P4 C5 -->|maxpool| P6 P6 -->|maxpool| P7 P3 <-->|lateral conn| P4 P4 <-->|lateral conn| P5实测显示:改进后FPN使中小缺陷检测率提升4.1%
3. 数据集与训练细节
3.1 车轮缺陷数据集构建
我们收集了15,728张车轮图像,包含6类缺陷:
| 缺陷类型 | 样本量 | 最小尺寸 | 最大尺寸 |
|---|---|---|---|
| 划痕 | 4,215 | 15x3px | 200x20px |
| 凹陷 | 3,782 | 30x30px | 150x150px |
| 锈蚀 | 2,956 | 50x50px | 300x300px |
| 气泡 | 1,874 | 10x10px | 80x80px |
| 涂层脱落 | 2,051 | 20x20px | 120x120px |
| 杂质夹杂 | 850 | 5x5px | 60x60px |
数据增强策略:
- 随机旋转(-15°~15°)
- 亮度抖动(±20%)
- 添加高斯噪声(σ=0.01)
- 模拟产线反光(随机光斑)
3.2 训练参数配置
基于MMDetection框架实现,关键配置:
model = dict( backbone=dict( type='ResNet_MDConv', depth=50, mdconv_pos=[3,5], # 在stage3,5插入MDConv strides=(1,2,2,2)), neck=dict( type='FPN_MS', out_channels=256, num_outs=7), # P3-P7输出 bbox_head=dict( type='VFNetHead', num_classes=6, in_channels=256, stacked_convs=3, feat_channels=256, strides=[8,16,32,64,128], loss_cls=dict( type='FocalLoss', use_sigmoid=True, gamma=2.0, alpha=0.25, loss_weight=1.0)))训练超参数:
- 初始lr=0.01(Cosine退火)
- batch_size=16(4xV100)
- epochs=24(2x表示24*2=48epoch)
- 多尺度训练(800~1333px随机缩放)
4. 部署优化技巧
4.1 TensorRT加速方案
将PyTorch模型转为TensorRT需注意:
- 自定义插件处理MDConv:
class MDConvPlugin : public IPluginV2 { void configurePlugin(const Dims* inputDims, int nbInputs, const Dims* outputDims, int nbOutputs, DataType type, PluginFormat format, int maxBatchSize) override { // 实现空洞卷积计算 } }- FP16量化时锁定BN层参数
- 动态尺寸支持设置:
profile = builder.create_optimization_profile() profile.set_shape("input", (1,3,800,800), (1,3,1333,1333), (1,3,1600,1600))4.2 产线部署实测数据
| 设备型号 | 推理时延 | 吞吐量 | 显存占用 |
|---|---|---|---|
| Jetson Xavier NX | 58ms | 17FPS | 3.2GB |
| RTX 3060 | 22ms | 45FPS | 4.8GB |
| Tesla T4 | 28ms | 35FPS | 5.1GB |
优化技巧:使用多进程处理时,建议每个进程绑定独立CUDA stream
5. 常见问题排查
5.1 小目标漏检问题
现象:直径<20px的划痕检测率低
解决方案:
- 调整anchor设置:
anchor_generator=dict( ratios=[1.0], octave_base_scale=4, # 原始为8 scales_per_octave=3, strides=[8,16,32,64,128])- 增加P2特征层(下采样4x)
- 损失函数增加小目标权重:
loss_bbox=dict(type='IoULoss', loss_weight=1.5, small_box_weight=2.0)5.2 类别混淆问题
现象:凹陷与气泡类易误判
改进措施:
- 数据层面:
- 增加两类样本的旋转增强(气泡各向同性,凹陷有方向性)
- 添加GAN生成的困难样本
- 模型层面:
- 分类头改用Circle Loss
- 增加Grad-CAM可视化分析
6. 效果对比实验
6.1 消融实验(COCO val)
| 模型变体 | AP@0.5 | AP@0.75 | AR@100 |
|---|---|---|---|
| Baseline VFNet | 42.1 | 39.8 | 53.2 |
| +MDConv | 43.7↑1.6 | 41.2↑1.4 | 54.8↑1.6 |
| +FPN_ms | 45.3↑3.2 | 43.1↑3.3 | 56.4↑3.2 |
| 完整模型(ours) | 46.9↑4.8 | 44.7↑4.9 | 57.8↑4.6 |
6.2 车轮数据集测试
| 缺陷类型 | 准确率 | 召回率 | 误检率 |
|---|---|---|---|
| 划痕 | 99.2% | 98.7% | 0.3% |
| 凹陷 | 97.8% | 96.5% | 1.1% |
| 锈蚀 | 98.5% | 97.2% | 0.8% |
| 气泡 | 95.3% | 94.1% | 2.4% |
| 涂层脱落 | 97.1% | 96.8% | 1.5% |
| 杂质夹杂 | 93.7% | 90.2% | 3.8% |
实际部署中发现,通过以下技巧可进一步提升效果:
- 针对产线环境调整图像白平衡
- 对运动模糊图像进行Wiener滤波预处理
- 设置缺陷尺寸阈值过滤误检