1. 项目概述
轮胎缺陷检测是汽车工业中至关重要的质量控制环节。传统的人工检测方法效率低下且容易出错,而基于深度学习的自动检测系统能够显著提升检测效率和准确性。本项目基于改进的YOLOv8模型构建了一个完整的轮胎缺陷分割系统,包含从数据准备、模型训练到Web前端展示的全流程解决方案。
1.1 核心功能
- 支持6类轮胎缺陷检测:鼓包(Bulge)、切割(Cut)、正常(Normal)、穿刺(Puncture)、侧壁(Sidewall)和磨损(Wornout)
- 采用改进的YOLOv8-seg模型架构,包含C2f-RFAConv等50+创新点
- 提供完整的数据集(1200张标注图像)和训练代码
- 包含Web前端展示界面,支持实时检测结果可视化
2. 技术架构解析
2.1 模型改进方案
2.1.1 主干网络优化
在YOLOv8原有架构基础上,我们引入了以下关键改进:
- C2f-RFAConv模块:
python复制class C2f_RFAConv(nn.Module):
def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):
super().__init__()
self.c = int(c2 * e) # 隐藏通道数
self.cv1 = Conv(c1, 2 * self.c, 1, 1)
self.cv2 = Conv((2 + n) * self.c, c2, 1)
self.m = nn.ModuleList(RFAConv(self.c, self.c) for _ in range(n))
def forward(self, x):
y = list(self.cv1(x).split((self.c, self.c), 1))
y.extend(m(y[-1]) for m in self.m)
return self.cv2(torch.cat(y, 1))
- 注意力机制增强:
- 引入CBAM(Convolutional Block Attention Module)注意力机制
- 在关键特征层添加SE(Squeeze-and-Excitation)通道注意力
2.1.2 损失函数优化
采用CIoU损失函数替代传统IoU,同时引入Focal Loss处理类别不平衡问题:
code复制Loss = λ1*CIoU + λ2*Focal + λ3*Dice
其中λ1, λ2, λ3为可调权重参数,通过实验确定最优组合。
2.2 数据集构建
2.2.1 数据分布
我们构建了包含1200张标注图像的"Tyre"数据集,各类别分布如下:
| 缺陷类型 | 样本数量 | 占比 |
|---|---|---|
| Bulge | 200 | 16.7% |
| Cut | 180 | 15.0% |
| Normal | 300 | 25.0% |
| Puncture | 150 | 12.5% |
| Sidewall | 220 | 18.3% |
| Wornout | 150 | 12.5% |
2.2.2 数据增强策略
为提高模型泛化能力,采用了以下增强方法:
- 随机旋转(-30°~30°)
- 亮度/对比度调整(±20%)
- 高斯噪声(σ=0.01)
- 随机裁剪(保留80%-100%区域)
3. 系统实现细节
3.1 训练配置
训练参数配置如下:
yaml复制# 训练参数配置文件(train.yaml)
lr0: 0.01 # 初始学习率
lrf: 0.01 # 最终学习率
momentum: 0.937 # 动量
weight_decay: 0.0005 # 权重衰减
warmup_epochs: 3 # 热身epoch数
warmup_momentum: 0.8 # 热身动量
warmup_bias_lr: 0.1 # 热身偏置学习率
启动训练命令:
python复制model.train(
data='datasets/data/data.yaml',
epochs=100,
batch=8,
imgsz=640,
device='0', # 使用GPU
workers=4,
optimizer='AdamW',
pretrained=True
)
3.2 Web前端实现
前端采用Streamlit框架构建,核心功能模块包括:
- 图像上传接口:
python复制uploaded_file = st.file_uploader("上传轮胎图像", type=['jpg','png','jpeg'])
if uploaded_file is not None:
image = Image.open(uploaded_file)
st.image(image, caption='上传的轮胎图像', use_column_width=True)
- 检测结果显示:
python复制results = model.predict(image)
plot = results[0].plot() # 生成带标注的可视化结果
st.image(plot, caption='检测结果', use_column_width=True)
- 结果统计面板:
python复制with st.expander("检测统计"):
st.write(f"检测到缺陷数量: {len(results[0].boxes)}")
for box in results[0].boxes:
st.write(f"- {model.names[int(box.cls)]}: 置信度 {box.conf:.2f}")
4. 部署与性能优化
4.1 模型导出
训练完成后,将模型导出为ONNX格式以便部署:
python复制model.export(format='onnx', dynamic=True, simplify=True)
4.2 推理加速
采用以下技术优化推理速度:
- TensorRT加速:将ONNX模型转换为TensorRT引擎
- 半精度推理:使用FP16精度减少计算量
- 批处理优化:支持动态批处理提高吞吐量
实测性能对比:
| 设备 | 精度 | 推理时间(ms) | FPS |
|---|---|---|---|
| RTX 3090 | FP32 | 12.5 | 80 |
| RTX 3090 | FP16 | 8.2 | 122 |
| Jetson Xavier | FP16 | 35.6 | 28 |
5. 常见问题与解决方案
5.1 训练问题排查
问题1:训练早期loss震荡严重
- 可能原因:学习率设置过高
- 解决方案:降低初始学习率(lr0),增加warmup周期
问题2:验证集mAP不升反降
- 可能原因:过拟合或数据分布不一致
- 解决方案:
- 检查训练集和验证集分布是否一致
- 增加数据增强多样性
- 添加早停机制(EarlyStopping)
5.2 部署注意事项
- 环境依赖:
- CUDA >= 11.3
- cuDNN >= 8.2
- TensorRT 8.x
- 内存优化:
对于边缘设备部署,建议:
- 使用量化后的INT8模型
- 限制并发推理数量
- 启用内存池优化
6. 扩展应用方向
本系统架构可扩展至其他工业检测场景,只需替换训练数据即可应用于:
- 电子产品表面缺陷检测
- 纺织品瑕疵识别
- 机械零件质量检查
关键调整点:
- 根据新场景调整anchor box尺寸
- 针对新缺陷类型优化损失函数权重
- 适配不同的输入分辨率
在实际工业部署中,我们通常会将检测系统与生产线PLC系统集成,实现自动分拣和报警功能。一个典型的部署架构包括:
- 工业相机采集图像
- 工控机运行检测算法
- 通过Modbus/TCP与PLC通信
- 触发分拣机构或报警装置