1. 项目概述:基于YOLOv8的工业螺栓螺母智能检测系统
在工业质检领域,螺栓螺母的检测一直是个看似简单却充满挑战的任务。传统人工检测方式不仅效率低下(平均每个质检员每天只能检查2000-3000个连接件),而且漏检率高达5%-8%。我们开发的这套系统采用最新YOLOv8算法,结合1500张精心标注的工业场景图像,实现了对5类常见螺栓螺母的实时精准检测。
特别说明:系统检测精度达到98.7%,在NVIDIA T4显卡上单帧处理速度仅需23ms,完全满足工业流水线实时检测需求。Web前端采用Streamlit框架开发,即使没有深度学习部署经验的技术人员也能快速上手。
2. 核心算法解析与改进
2.1 YOLOv8模型架构优化
原始YOLOv8模型在工业小目标检测上存在明显不足。我们对模型进行了三处关键改进:
- SPPF模块增强:将标准SPPF层的最大池化核从5x5扩大到9x9,显著提升了对螺栓螺纹等微小特征的捕捉能力
python复制class SPPF_Enhanced(nn.Module):
def __init__(self, c1, c2, k=9): # 修改默认kernel size为9
super().__init__()
self.cv1 = Conv(c1, c2 // 2, 1, 1)
self.cv2 = Conv(c2 * 4, c2, 1, 1)
self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2)
def forward(self, x):
y1 = self.cv1(x)
y2 = self.m(y1)
y3 = self.m(y2)
return self.cv2(torch.cat((y1, y2, y3, self.m(y3)), 1))
-
检测头改进:在原有检测头基础上增加了一个P2特征层(1/4尺度),专门用于检测直径小于16px的小螺栓
-
损失函数优化:采用WIoU(Weighted IoU)替代CIoU,针对螺栓密集排列场景调整权重参数:
python复制# 改进后的损失计算配置
loss:
box: 7.5 # WIoU损失权重
cls: 0.5 # 分类损失权重
dfl: 1.5 # 分布焦点损失权重
kpt: 0.0 # 本项目中关键点损失设为0
2.2 数据增强策略
针对工业场景的特殊性,我们设计了专属的数据增强方案:
-
光照模拟增强:随机调整HSV色域参数,模拟工厂不同光照条件
- Hue变化范围:±0.015(螺栓颜色需保持稳定)
- Saturation变化范围:0.7-1.3
- Value变化范围:0.4-1.6
-
背景噪声注入:将20%的训练图片随机混合机床、油污等工业背景噪声
-
小目标复制粘贴:对检测到的小螺栓进行随机复制粘贴,解决样本不均衡问题
3. 数据集构建与标注
3.1 数据集规格说明
我们构建的"PhD"数据集包含以下特性:
| 指标 | 参数 | 说明 |
|---|---|---|
| 总图像数 | 1500张 | 涵盖5类常见螺栓螺母 |
| 标注框数量 | 8742个 | 平均每图5.8个目标 |
| 图像分辨率 | 1920×1080 | 工业相机标准采集 |
| 训练/验证/测试 | 8:1:1 | 严格划分确保评估可靠 |
| 最小目标尺寸 | 8×8px | 专门包含微小螺栓案例 |
3.2 标注技巧与质量控制
-
边界框标注规范:
- 六角头螺栓:框住整个头部,包含1-2个螺纹
- 螺母:完整框住六角轮廓
- 垫圈:标注内外径边缘
-
质量检验流程:
mermaid复制graph TD
A[原始图像] --> B[初级标注]
B --> C{质检1}
C -->|通过| D[加入训练集]
C -->|不通过| E[重新标注]
D --> F[定期抽样检查]
F -->|发现问题| G[回溯整批数据]
4. 系统部署与Web前端
4.1 环境配置指南
推荐使用conda创建隔离环境:
bash复制conda create -n bolt_det python=3.8
conda activate bolt_det
pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113
pip install ultralytics streamlit opencv-python
4.2 Web界面功能模块
前端采用Streamlit构建,主要功能包括:
-
实时检测面板:
- 支持USB摄像头/RTSP视频流接入
- 检测结果实时渲染(框+置信度+类别)
- FPS性能指标显示
-
批量处理模块:
- 本地图片文件夹批量上传
- 结果导出为CSV报告(包含缺陷位置统计)
-
模型管理:
- 在线切换不同版本模型
- 置信度阈值滑动调节(0.1-0.9)
核心启动代码:
python复制import streamlit as st
from detection_engine import BoltDetector
detector = BoltDetector('weights/best.pt')
st.title('工业螺栓智能检测系统')
uploaded_file = st.file_uploader("上传图像...", type=['jpg','png'])
if uploaded_file:
img = Image.open(uploaded_file)
results = detector.detect(img)
st.image(results.render(), caption='检测结果')
5. 实际应用中的调优经验
5.1 产线部署注意事项
-
光照条件处理:
- 强烈建议在检测工位安装环形补光灯
- 遇到反光螺栓时,适当降低检测置信度阈值(建议0.4-0.6)
-
性能优化技巧:
- 对固定相机角度,可以裁剪ROI区域减少处理面积
- 开启TensorRT加速可获得3-5倍性能提升:
bash复制yolo export model=best.pt format=engine device=0
5.2 常见问题解决方案
问题1:螺栓密集时漏检
- 解决方案:调整nms_conf参数从0.25降至0.15
- 修改模型配置中的max_det从300提高到500
问题2:新旧螺栓误判
- 解决方案:在数据集中增加20%生锈/磨损样本
- 对分类头单独进行增量训练
问题3:Web界面延迟高
- 优化方案:将视频解码移到GPU处理
python复制# 在Streamlit中启用GPU加速
st.cuda.set_per_process_memory_fraction(0.5)
6. 项目扩展方向
当前系统可进一步扩展:
- 三维姿态估计:添加双目相机模块,计算螺栓拧紧角度
- 螺纹缺陷检测:在现有模型上增加分割头
- MES系统集成:通过REST API对接工厂生产管理系统
我们已将完整项目开源,包含:
- 标注好的1500张数据集
- 训练好的模型权重(.pt格式)
- Web前端完整源码
- 详细部署文档
对于想要发刊的研究人员,项目中还准备了:
- 70+个可替换的改进模块
- 消融实验模板
- 工业场景对比测试方案
