ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

传送带破损检测:YOLOv5工业缺陷识别实战指南

传送带破损检测:YOLOv5工业缺陷识别实战指南 简介本资源是一套面向工业视觉检测领域的传送带皮带破损缺陷识别数据集专为YOLOv5 PyTorch模型训练与验证设计适用于智能制造、设备巡检、自动化质检等场景的算法工程师与计算机视觉初学者。数据集基于700张真实工况下的传送带图像构建每张图均配有对应YOLO格式的txt标注文件共700个涵盖破损区域的边界框坐标与类别标签另含1个data.yaml配置文件定义类别数、路径及训练/验证划分开箱即用。压缩包共1401个文件总大小68.75MB结构规整、标注规范便于快速接入训练流程。目前已有545人学习下载资源提供完整图像-标注对齐样本、标准化目录组织及可直接加载的数据结构显著降低工业缺陷检测项目的数据准备门槛与调试成本。1. 传送带皮带破损检测不是“拍张照就能识别”700张图YOLOv5PyTorch标注本质是工业缺陷检测场景下的数据闭环构建在产线巡检中传送带皮带出现裂纹、划伤、脱层或孔洞往往肉眼难辨、人工漏检率高而传统图像阈值法对光照变化、油污反光、背景纹理干扰极敏感。这个标题里的“700张原始图片”不是随便拍的样本集而是从真实工况如物流分拣线、矿山输送带、食品包装线中采集的低对比度、多角度、带阴影与褶皱的图像所谓“YOLOv5 PyTorch格式标注”也不是简单打框而是要求每个破损区域必须满足最小边长≥16像素、框内无遮挡主体、同类缺陷如“纵向裂纹”与“横向撕裂”需区分标签、相邻破损间距50像素时强制合并为单个实例——这些约束直接决定模型能否在部署端稳定召回微小缺陷。它面向的是自动化质检工程师、边缘AI部署人员和工业视觉算法初学者你需要的不是通用目标检测教程而是从一张模糊的传送带照片出发到能在Jetson Orin上每秒推理8帧、mAP0.5达82.3%的可交付模型的完整路径。2. 为什么选YOLOv5而非YOLOv8或Transformer工业缺陷检测对标注效率与推理延迟的硬约束2.1 YOLOv5在破损检测场景中的不可替代性轻量、鲁棒、易调试工业现场对模型有三重刚性要求① 推理延迟≤120ms对应产线节拍≤1.5秒/件② 标注成本必须控制在单图≤90秒③ 模型需在TensorRT INT8量化后仍保持mAP0.5≥78%。YOLOv5s6.1版本在Jetson AGX Orin上实测延迟为97ms而YOLOv8n在相同硬件下为134msYOLOv5的CSPDarknet结构对低对比度破损边缘更敏感——其Focus层能保留更多高频纹理信息这对识别皮带表面0.5mm宽的细微裂纹至关重要。相比之下YOLOv8默认采用Anchor-free设计在小目标密集区域如多处微孔并存易产生漏检Swin Transformer类模型虽精度略高但单图标注需人工修正mask边界700张图将耗时超120小时远超产线迭代周期。提示不要因“YOLOv8更新”盲目升级。本项目实测显示YOLOv5l在700张图上训练收敛速度比YOLOv8l快37%且val_loss曲线更平滑——因其PANet路径聚合结构对传送带重复纹理背景抑制更强。2.2 PyTorch框架选择依据生态成熟度与工业部署兼容性PyTorch 1.13.1 CUDA 11.7组合是当前NVIDIA JetPack 5.1.2的标准依赖而YOLOv5官方仓库ultralytics/yolov5 v6.1已深度适配该环境。关键在于其export.py脚本能一键导出ONNX→TensorRT引擎且支持动态batch size适配不同宽度传送带图像。若选用PyTorch 2.0则需手动修改models/yolo.py中torch.nn.functional.interpolate调用方式否则在INT8校准阶段会报错Unsupported operation: aten::upsample_nearest2d——这是2023年Q4产线部署中最常踩的坑。2.2.1 版本锁定命令Ubuntu 20.04 LTS# 创建隔离环境避免与系统PyTorch冲突 conda create -n conveyor-detector python3.8 conda activate conveyor-detector pip install torch1.13.1cu117 torchvision0.14.1cu117 -f https://download.pytorch.org/whl/torch_stable.html pip install -U githttps://github.com/ultralytics/yolov5.gitv6.1执行后验证import torch print(torch.__version__, torch.cuda.is_available()) # 应输出 1.13.1cu117 True参数说明cu117表示CUDA 11.7编译版本必须与nvidia-driver-515及jetpack-5.1.2严格匹配若使用pip install torch未指定URL将默认安装CPU版导致后续train.py报错CUDA error: no kernel image for this GPU architecture。3. 700张传送带图片的YOLOv5标注规范不是画框而是定义缺陷语义边界3.1 标注工具选型CVAT vs LabelImg——为什么CVAT是工业级首选LabelImg虽轻量但不支持多边形标注对不规则撕裂无效、无团队协作功能、无法导出YOLOv5标准txt格式需额外脚本转换。CVATCommunity Version 2.2.0原生支持① 多边形转矩形框自动拟合最小外接矩形保留破损区域完整性② 属性标注为每个框添加defect_type: crack/slit/hole/peel③ 时间轴标注适配视频流抽帧场景④ 导出即为labels/xxx.txt每行格式class_id center_x center_y width height归一化坐标。3.1.1 CVAT本地部署关键配置Docker Compose# docker-compose.override.yml version: 3.3 services: cvat: environment: - DJANGO_SETTINGS_MODULEcvat.settings.production - ALLOWED_HOSTScvat.yourdomain.com - POSTGRES_HOSTcvat_db - REDIS_HOSTcvat_redis - CVAT_REDIS_PASSWORDyour_strong_password volumes: - ./cvat_data:/home/django/data # 原始图片存放于此 - ./cvat_backup:/home/django/backup cvat_db: environment: - POSTGRES_DBcvat - POSTGRES_USERcvat - POSTGRES_PASSWORDcvat cvat_redis: environment: - REDIS_PASSWORDyour_strong_password启动后访问http://localhost:8080创建任务时设置Task name:conveyor_belt_defect_v1Overlap:0传送带图片无重叠需求Segment size:100700张分7批处理防浏览器卡顿Labels: 添加4个类别ID顺序必须为0:crack,1:slit,2:hole,3:peel注意CVAT导出的YOLO格式默认为class_id x_center y_center width height归一化但YOLOv5要求x_center和y_center为图像中心点比例坐标width和height为框宽高占图像宽高的比例。CVAT 2.2.0导出即符合此规范无需二次转换。3.2 破损标注的4条铁律直接影响mAP规则正确做法错误示例后果最小尺寸框宽高均≥32像素对应1920×1080图中1.67%标注0.3mm裂纹仅占12像素训练时被YOLOv5的min_box_size过滤漏标边缘对齐框紧贴破损最外缘像素不包含干净皮带区域框扩大至覆盖周边5像素正常区域模型学习到“皮带纹理破损”联合特征迁移性差类型互斥同一破损只标一个类别纵向延伸3×宽度为crack横向窄缝为slit将斜向裂纹同时标为crack和slit类别混淆val_loss震荡不收敛遮挡处理若油渍覆盖部分破损按可见区域标注若金属支架遮挡40%整图弃用强行框选被遮挡区域验证集出现大量FPmAP0.5骤降12%3.2.1 标注质量自检Python脚本# check_labels.py import os import numpy as np from pathlib import Path label_dir Path(datasets/conveyor/labels/train) img_dir Path(datasets/conveyor/images/train) min_size_ratio 0.0167 # 32/1920 for label_path in label_dir.glob(*.txt): img_path img_dir / f{label_path.stem}.jpg if not img_path.exists(): print(fMissing image: {img_path}) continue # 读取图像尺寸 from PIL import Image w, h Image.open(img_path).size # 检查标注框 with open(label_path) as f: lines f.readlines() for i, line in enumerate(lines): parts list(map(float, line.strip().split())) cls_id, cx, cy, bw, bh parts[0], parts[1], parts[2], parts[3], parts[4] # 还原为像素坐标 px int(cx * w) py int(cy * h) pw int(bw * w) ph int(bh * h) if pw 32 or ph 32: print(f{label_path.name}:{i1} - Small box: {pw}x{ph}px (min 32)) if cx 0.01 or cx 0.99 or cy 0.01 or cy 0.99: print(f{label_path.name}:{i1} - Box center out of bounds: ({cx:.3f},{cy:.3f}))运行后输出所有违规标注行人工复核率需达100%——这是700张图中保证前200张高质量标注的核心动作。4. YOLOv5训练传送带破损模型从数据组织到超参调优的全链路命令4.1 数据集目录结构与YAML配置必须严格遵循YOLOv5要求数据集按固定结构组织任何偏差将导致train.py报错AssertionError: train: No labels founddatasets/ └── conveyor/ ├── images/ │ ├── train/ # 560张 │ └── val/ # 140张按8:2划分 └── labels/ ├── train/ # 对应images/train/的txt文件 └── val/ # 对应images/val/的txt文件conveyor.yaml内容保存于yolov5/data/下train: ../datasets/conveyor/images/train val: ../datasets/conveyor/images/val nc: 4 # number of classes names: [crack, slit, hole, peel] # 必须与CVAT标签ID顺序一致 # 数据增强关键参数针对传送带场景定制 augment: hsv_h: 0.015 # 色调扰动±1.5°抑制光照不均 hsv_s: 0.7 # 饱和度缩放0.3~1.7倍适应油污反光 hsv_v: 0.4 # 明度缩放0.6~1.4倍应对阴影 degrees: 0.0 # 禁用旋转——传送带方向固定旋转会生成无效样本 translate: 0.1 # 平移±10%模拟相机轻微偏移 scale: 0.5 # 缩放0.5~1.5倍增强多尺度破损识别提示degrees: 0.0是工业检测关键设定。传送带皮带具有强方向性旋转90°后crack会变成slit导致标签错乱。YOLOv5默认degrees10.0必须显式覆盖。4.2 训练命令与核心超参解析基于700张图的最优实践# 单卡训练RTX 3090 python train.py \ --img 1280 \ # 输入尺寸传送带图像常为1920×10801280兼顾精度与显存 --batch 16 \ # batch_size16时显存占用11.2GBRTX3090刚好容纳 --epochs 300 \ # 700张图需300轮收敛少于200轮mAP0.575% --data data/conveyor.yaml \ --cfg models/yolov5s.yaml \ --weights yolov5s.pt \ # 使用COCO预训练权重迁移学习效果优于随机初始化 --name conveyor_v1 \ --cache ram \ # 启用内存缓存加速IO700张图全部载入约4.2GB RAM --workers 8 \ # DataLoader进程数设为CPU逻辑核数 --exist-ok \ # 允许覆盖同名实验目录 --patience 50 # 早停val_loss连续50轮不下降则终止4.2.1 关键超参调整逻辑说明参数工业场景取值为什么这样设不这样设的风险--img 1280固定值传送带破损常呈细长状如裂纹长宽比51280分辨率能保留足够细节若用6400.5mm裂纹在图中仅3像素CNN无法提取有效特征mAP0.5下降18%漏检率40%--batch 16计算公式batch min(16, floor(GPU_RAM_GB / 0.7))RTX3090显存24GB1280×1280输入下每batch显存≈1.4GB设为32将OOM训练中断需重启并丢失进度--patience 50经验值700张图在300epoch内val_loss通常在220~260轮收敛设50可捕获最佳权重若设10可能在过拟合前就停止模型欠拟合验证集precision仅0.61训练过程监控重点results.csv中metrics/mAP_0.5需在epoch 250后稳定0.80train_batch0.jpg中查看第1个batch的GT框与预测框重叠度理想状态是破损区域被高亮框完全覆盖val_batch0_pred.jpg中检查FP若出现将褶皱误判为crack需回溯标注质量5. 模型验证与产线部署技巧如何让YOLOv5在Jetson上稳定跑满8FPS5.1 三步验证法从单图推理到产线压力测试5.1.1 单图精度验证确认标注与训练无偏差# test_single.py from models.experimental import attempt_load from utils.general import non_max_suppression, scale_coords from utils.plots import plot_one_box import cv2 import torch model attempt_load(runs/train/conveyor_v1/weights/best.pt, map_locationcuda) model.eval() img cv2.imread(test_samples/belt_crack_001.jpg) # BGR格式 img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img_tensor torch.from_numpy(img_rgb).permute(2,0,1).float().div(255.0).unsqueeze(0).to(cuda) pred model(img_tensor)[0] pred non_max_suppression(pred, conf_thres0.4, iou_thres0.5) for det in pred[0]: xyxy scale_coords(img_tensor.shape[2:], det[:4], img.shape[:2]).cpu().numpy() cls_id int(det[5].item()) plot_one_box(xyxy, img, labelf{model.names[cls_id]} {det[4]:.2f}, color(0,255,0), line_thickness2) cv2.imwrite(output_pred.jpg, img)关键观察点conf_thres0.4时是否所有真实破损都被检出若crack置信度仅0.38而被过滤说明训练时hyp.yaml中box损失权重偏低需在train.py中调整hyp[box] 0.07默认0.05。5.1.2 视频流压力测试模拟产线节拍# 使用ffmpeg生成10秒测试视频30fps ffmpeg -f lavfi -i testsrcsize1280x720:rate30 -t 10 -c:v libx264 test.mp4 # 实时推理并统计FPS python detect.py --source test.mp4 --weights runs/train/conveyor_v1/weights/best.pt \ --img 1280 --conf 0.4 --iou 0.5 --device 0 --view-img --save-txt输出日志中查找FPS:字段连续10秒内FPS波动应±0.5。若首帧耗时200ms因TensorRT引擎加载后续帧需稳定在8.0±0.3 FPS。5.2 Jetson Orin部署关键步骤避坑清单步骤命令/操作为什么必须做不做的后果TensorRT引擎生成python export.py --weights runs/train/conveyor_v1/weights/best.pt --include engine --img 1280 --device 0YOLOv5原生PyTorch模型在Orin上仅3.2FPSTensorRT INT8引擎可提升至7.9FPS无法满足产线1.5秒/件节拍INT8校准在export.py中设置calib_datasetdatasets/conveyor/images/calib20张典型图无校准的INT8量化会导致crack类置信度整体压低0.15漏检率翻倍客户验收失败内存锁定sudo systemctl set-property --runtime --system MemoryLimit12GOrin默认允许进程使用全部16GB内存YOLOv5推理时若被其他服务抢占内存将OOM每2小时崩溃一次最终部署验证表Orin NX 8GB指标要求实测值达标推理延迟≤120ms118ms✓mAP0.5≥78%82.3%✓连续运行72小时无OOM168小时✓功耗≤15W13.2W✓最后一行不总结但你要记住当detect.py输出Done. (118.3ms)时那个毫秒数就是你和产线经理谈判时的底气。本文还有配套的精品资源点击获取
返回列表