1. 项目背景与核心需求
在机械制造领域,齿轮作为传动系统的核心部件,其质量直接影响整个设备的运行效率和使用寿命。而端面作为齿轮的关键工作面之一,常见的划痕、凹陷、锈蚀等缺陷往往会导致传动精度下降、噪音增大甚至设备故障。传统的人工检测方式不仅效率低下(每小时仅能检测20-30个齿轮),且受人员疲劳影响漏检率高达15%-20%。
这个项目要解决的核心痛点在于:
- 实现齿轮端面缺陷的自动化检测(Detection)
- 对缺陷类型进行准确分类(Classification)
- 适应工业现场复杂的光照条件和多变的缺陷形态
我们选择DINO-4Scale作为基础框架,主要基于三个考量:
- 其多尺度特征提取能力特别适合处理齿轮端面这种具有明显层级结构的对象
- 自监督预训练机制对工业场景小样本数据友好
- Transformer架构在边缘设备上的推理速度能满足产线节拍要求(实测在Jetson Xavier NX上可达23FPS)
2. 技术方案设计详解
2.1 整体架构设计
项目采用"两阶段检测+分类"的混合架构:
Raw Image → DINO-4Scale Backbone → Defect Detection → ROI Align → ResNet18 Classifier → Output关键设计决策:
- 输入分辨率:保持原始图像1024×1024尺寸,避免下采样导致小缺陷丢失
- 数据增强策略:针对工业场景特别添加:
- 模拟油渍污染的随机斑点噪声
- 金属反光模拟(使用OpenCV的flair增强)
- 随机机械阴影(模拟设备遮挡)
- 损失函数配置:
loss = 0.5*DETR_Loss + 0.3*FocalLoss + 0.2*SSIM_Loss
2.2 DINO-4Scale的改造点
原始DINO框架主要针对自然图像设计,我们做了以下工业适配:
多尺度特征融合改进:
- 在原有4个尺度([8,16,32,64]下采样)基础上
- 增加跨尺度注意力模块CSAM(Cross-Scale Attention Module)
class CSAM(nn.Module): def __init__(self, channels): super().__init__() self.query = nn.Conv2d(channels, channels//8, 1) self.key = nn.Conv2d(channels, channels//8, 1) def forward(self, feats): # feats: list of multi-scale features queries = [self.query(f) for f in feats] keys = [self.key(f) for f in feats] # 跨尺度注意力计算...位置编码优化:
- 将原始正弦位置编码替换为可学习的极坐标编码
- 更适合齿轮的环形结构特征表达
解码器结构调整:
- 将6层解码器缩减为4层
- 每层增加局部窗口注意力(Window Attention)
- 计算量降低37%,精度仅下降0.8%
3. 数据集构建与标注规范
3.1 数据采集方案
我们使用Basler ace acA2000-50gc工业相机搭建采集系统:
- 分辨率:2048×2048
- 光源:环形红色LED(波长625nm)
- 拍摄距离:30cm
- 每个齿轮采集8张不同角度的端面图像
最终构建的数据集包含:
- 训练集:12,458张图像(8类缺陷)
- 验证集:1,562张图像
- 测试集:2,000张图像
3.2 标注标准示例
采用COCO标注格式,但增加了工业特有字段:
{ "defect_type": "pitting", "severity": 2, "area_ratio": 0.15, "bbox": [x,y,w,h], "contour_points": [[x1,y1],...] }关键标注规则:
- 划痕类缺陷:标注整个连续痕迹
- 点蚀缺陷:当相邻蚀坑间距<2mm时合并标注
- 锈蚀区域:标注最小外接矩形
4. 模型训练实战细节
4.1 训练环境配置
硬件配置:
- GPU:NVIDIA RTX 3090 × 2
- 内存:128GB DDR4
- 存储:2TB NVMe SSD
软件环境:
# 关键依赖版本 torch==1.12.1+cu113 mmdetection==2.25.0 timm==0.6.124.2 超参数设置
训练分为两个阶段:
第一阶段(预训练):
- epochs: 50
- batch_size: 16
- lr: 1e-4 (cosine decay)
- optimizer: AdamW
- warmup_iters: 500
第二阶段(微调):
- epochs: 100
- batch_size: 8
- lr: 5e-5 (linear decay)
- augmentation: Heavy
4.3 关键训练技巧
渐进式分辨率训练:
- 前10epoch:512×512
- 10-30epoch:768×768
- 30epoch后:1024×1024
困难样本挖掘:
def hard_example_mining(losses, ratio=0.2): k = int(len(losses)*ratio) hard_idx = torch.topk(losses, k).indices return hard_idx分类头冻融策略:
- 前30epoch冻结分类头
- 后70epoch联合训练
5. 部署优化与实测效果
5.1 TensorRT加速方案
导出ONNX时的关键设置:
torch.onnx.export( model, dummy_input, "gear_dino.onnx", opset_version=13, input_names=['images'], output_names=['outputs'], dynamic_axes={ 'images': {0: 'batch', 2: 'height', 3: 'width'}, 'outputs': {0: 'batch'} } )TensorRT优化参数:
- FP16精度模式
- 最大workspace size:4GB
- 优化profile:设置3个典型输入尺寸(512,768,1024)
5.2 实测性能指标
在Jetson Xavier NX上的测试结果:
| 指标 | 数值 |
|---|---|
| 推理速度 | 23.4 FPS |
| 内存占用 | 2.1GB |
| 检测mAP@0.5 | 0.892 |
| 分类准确率 | 94.7% |
典型缺陷检测效果对比:
正常齿面 → [OK] 置信度0.98 轻微划痕 → [Scratch] 置信度0.91 重度点蚀 → [Pitting] 置信度0.89 锈蚀区域 → [Corrosion] 置信度0.936. 常见问题与解决方案
6.1 反光干扰处理方案
当遇到强反光干扰时:
在预处理阶段使用基于HSV空间的反射分量抑制:
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) hsv[:,:,2] = cv2.medianBlur(hsv[:,:,2], 5)在模型层面增加对抗样本:
- 训练时随机添加高光区域模拟
6.2 小缺陷漏检优化
对于直径<3mm的小缺陷:
- 在ROI Align阶段采用更密集的采样点(从7×7改为9×9)
- 在损失函数中增加小目标权重:
loss = base_loss * (1 + 2*(1 - area/max_area))
6.3 类别混淆问题
常见于划痕(scratch)与加工纹路(machining mark)的混淆:
- 特征工程解决方案:
- 增加局部二值模式(LBP)特征作为辅助输入
- 数据层面解决方案:
- 收集更多过渡样本进行针对性训练
7. 工程落地经验
7.1 产线集成要点
触发同步:
- 使用PLC的I/O信号触发相机拍摄
- 确保齿轮停在预设角度位置(±2°公差)
结果反馈:
- 通过Modbus TCP协议将结果传回PLC
- 不良品分类结果映射到不同分拣口
异常处理:
- 设置超时机制(单次检测超时500ms自动跳过)
- 开发心跳包监控进程
7.2 持续改进方案
建立数据闭环系统:
- 每天自动收集10%的检测结果存入待审核池
- 质检人员复核后自动加入训练集
- 每周进行一次增量训练(fine-tune 10 epoch)
关键经验:在产线部署时一定要给相机加装防震支架,我们曾因设备振动导致图像模糊,使误检率临时上升了8个百分点。