资讯动态

YOLOv5布匹缺陷检测实战:从数据构建到训练部署全流程

发布时间:2026/9/15 4:53:02 来源:尧图企业网站定制
简介这套基于YOLOv5的布匹缺陷检测Python算法实现面向工业视觉质检、目标检测竞赛选手及入门CV的学习者解决布匹生产场景中表面缺陷的自动标注与定位问题。其完整覆盖从官方布匹数据集的标注格式转换、数据整理、滑动窗口将大图切分为1024×1024小图到YOLOv5模型训练与检测推理的全流程代码目录包含模型配置、权重保存和官方测试数据入口适合作为实战项目或竞赛复现的起点。整包共8个文件以6个Python脚本为主辅以1个Markdown项目说明和1个Jupyter Notebook压缩后约25KB小巧而结构清晰便于直接阅读和修改目录结构区分代码、训练数据、官方测试数据和权重保存并配备了环境准备与训练数据路径设置说明可快速复现实验结果。已有363人学习浏览对希望快速跑通布匹缺陷检测流程的读者具有较高参考价值。1. 从布匹缺陷检测到YOLOv5为什么这个方案能直接落地布匹缺陷检测是纺织行业质检线上最容易先用起来的目标检测场景机台固定、光照可控、缺陷类别相对集中。把“基于yolov5的布匹缺陷检测算法python源码项目说明数据集.zip”这个压缩包拆开看本质上就是一条已经跑通的YOLOv5训练与推理管线附带已经标注好的布匹图像数据和一份把这些步骤串起来的说明文档。对大多数做视觉算法的工程师来说这套组合最大的价值不是模型结构而是“从数据到权重”的完整路径数据怎么组织、标注怎么处理、训练参数怎么调、推理结果怎么接进产线。适合三类人刚入门想复现完整流程的学生、做机器视觉需要快速出原型的工程师、以及想把YOLOv5当作缺陷检测基线的算法负责人。需要提前说的是布匹缺陷检测的难点不在YOLOv5本身而在小目标、纹理干扰和类别不平衡下面几章按这个顺序展开。2. 布匹缺陷检测数据集YOLOv5的标注、划分与增强策略2.1 布匹缺陷检测数据集的目录结构与YOLO标注格式拿到压缩包后先按源码默认约定的目录去摆数据。YOLOv5在训练时只认“images”和“labels”两个平级目录里面各放 train/val 子目录图片和标签文件名必须一一对应。常见做法是建立一个独立的 fabric_dataset 目录与 yolov5 源码目录平级避免把数据混进源码包里fabric_dataset/ ├── images/ │ ├── train/ # 约 80% 的布匹图像 │ └── val/ # 约 20% 的布匹图像 └── labels/ ├── train/ # 每张图对应一个 .txt └── val/每个 txt 文件里一行代表一个缺陷框格式是class_id x_center y_center width height四个坐标值全部归一化到 01不是像素值。比如一张 2448×2048 的图像里某个破洞中心在像素 (612, 1024)宽 300高 200那这行就写成0 0.25 0.5 0.1225 0.0977宽高要除以图像宽和高。这个格式最容易出错的点是把中心坐标写成左上角坐标或者忘记归一化。写一个小脚本扫一遍所有标签能在训练前把明显的越界和格式错误拦下来import numpy as np from pathlib import Path err_lines 0 for txt in Path(labels/train).glob(*.txt): for line in txt.read_text().strip().splitlines(): parts line.split() if len(parts) ! 5: err_lines 1 continue try: cid int(parts[0]) vals [float(v) for v in parts[1:]] except ValueError: err_lines 1 continue cx, cy, w, h vals if not (0 cid 20 and 0 cx 1 and 0 cy 1 and 0 w 1 and 0 h 1): err_lines 1 print(format/range error lines:, err_lines)提示源码包里的项目说明通常会给出一个类似的脚本但自己跑一遍更稳妥尤其是数据是由不同人标注时0 宽或中心点出界的框很常见。2.2 布匹缺陷标注的边界问题与类别合并策略布匹缺陷和通用目标有一个明显差异缺陷经常是长条状比如断经、纬斜、跳花长度横跨整幅布面宽度却只有几个像素。LabelImg 拉出的矩形框会包含大量正常纹理背景模型学到的特征容易被“背景”带偏。我的处理方法是长条缺陷按段标注每段长度控制在图像短边的 1/4 到 1/2框尽量贴合缺陷的实际宽度而不是把整条都框进去。这样每个样本的“正信息密度”更高。另一个常见问题是缺陷跨出图像边缘。布匹图像从工业相机出来后往往是连续卷材的一部分缺陷出现在画面边缘的概率不低。标注时需要把露出的部分标全也就是把框画到图像边界上不要为了美观往回收。如果某个边缘缺陷被截得太碎直接裁掉这一块并调整标注而不是保留一个超出边界的框。类别数量也值得提前控制。布匹缺陷检测算法在实际项目中常见的缺陷种类有破洞、污渍、纬斜、跳花、棉结、色差加起来也就 510 类。如果项目说明里给了十几类先看合并空间不同颜色的污渍可以统一为 oil_stain严重程度不同的破洞不需要拆成两级。类别太少比如只有 2 类类别不平衡会更明显类别太多每一类的样本量会被稀释。我一般建议控制在 48 类每个类别训练样本不少于 300 张。2.3 布匹纹理场景的增强策略数据增强是这次布匹缺陷检测模型能落地的重要环节。YOLOv5 自带的增强管线在 hyp.scratch.yaml 里有默认值但对布匹场景需要做三处调整。第一是色相偏移 hsv_h布匹颜色通常比较单一色相偏移过大会把白布变成彩布让模型学到错误的颜色关联建议从默认 0.015 调低到 0.01 或 0.02。第二是翻转和旋转水平翻转对布匹是合理的但 90 度旋转要慎用因为布匹的经纬方向在物理上有意义旋转后会改变纹理朝向。第三是 mosaic 增强默认 1.0 可以保留但要确保参与拼接的图片来自同一个布种跨布种拼接会让模型对纹理基频产生混淆。对于小缺陷样本单独做一块离线增强更有效。把包含小缺陷的原图按 512 或 640 滑动裁切得到一批局部放大图扩充训练集。这一步不需要在训练时做用脚本离线生成即可import cv2, os from PIL import Image from pathlib import Path raw Path(raw_images) out_img Path(fabric_dataset/images/train) out_txt Path(fabric_dataset/labels/train) out_img.mkdir(parentsTrue, exist_okTrue) out_txt.mkdir(parentsTrue, exist_okTrue) for img_path in raw.glob(*.jpg): img cv2.imread(str(img_path)) h, w img.shape[:2] base img_path.stem label_src raw / (base .txt) boxes [] if label_src.exists(): for line in label_src.read_text().strip().splitlines(): cid, cx, cy, bw, bh map(float, line.split()) cx * w; cy * h; bw * w; bh * h boxes.append((int(cid), cx, cy, bw, bh)) for i, (x, y) in enumerate([(0, 0), (w//2, 0), (0, h//2), (w//2, h//2)]): crop img[y:yh//2, x:xw//2] ch, cw crop.shape[:2] cv2.imwrite(str(out_img / f{base}_{i}.jpg), crop) lines [] for cid, cx, cy, bw, bh in boxes: nx, ny cx - x, cy - y if 0 nx 0.5 * w and 0 ny 0.5 * h: nx / cw; ny / ch; bw / cw; bh / ch lines.append(f{cid} {nx:.6f} {ny:.6f} {bw:.6f} {bh:.6f}) (out_txt / f{base}_{i}.txt).write_text(\n.join(lines))这个脚本把每张图切成四块只保留中心落在对应块内的缺陷框。切完后建议人工抽查一遍确认没有出现半截框。3. YOLOv5环境配置与训练前的最小验证3.1 用 conda 装 YOLOv5 依赖的最小命令“yolov5环境配置”在训练自己的数据集之前是第一个门槛。YOLOv5 对 Python 版本不挑剔3.83.10 都可以PyTorch 按显卡驱动装对应版本即可。我用 conda 建环境的标准步骤是conda create -n yolov5 python3.9 -y conda activate yolov5 cd yolov5 python -m pip install -r requirements.txtrequirements.txt 里会一次性装好 torch、torchvision、opencv-python、numpy 等核心依赖。如果机器没有外网访问权限可以从源码包的依赖目录里安装离线 wheel网络受限时优先确认 torch 和 torchvision 版本一致这两个不一致会导致导入报错。装完后先执行一条命令确认环境可用python -c import torch; print(torch.__version__, torch.cuda.is_available())输出类似2.1.0 True说明 CUDA 可见如果显示 False检查显驱和 torch 的 CUDA 版本这一步不通过后面训练再快也没有意义。CPU 机器也能训练只是时间会放大多倍建议先跑通流程再找 GPU 资源。3.2 跑通 YOLOv5 的最小验证命令环境装好后不要直接上完整数据集。先用一张图和一行命令验证源码本身能正常工作python train.py --data fabric_dataset/fabric.yaml --epochs 1 --batch-size 2 --img 640这里 fabric.yaml 是指向布匹数据集的配置文件暂时用原始数据也行epochs1 只为让训练循环跑起来。如果源码和目录结构没错1 分钟内会看到进度条开始推进日志里会打印出训练的类别数。常见做法是把这个“1 epoch 验证”当成环境检查的固定步骤。看到类似下面的日志就是成功了hyperparameters: lr00.01, lrf0.01, momentum0.937, weight_decay0.0005 Model Summary: 232 layers, 7020913 parameters如果卡在Downloading yolov5s.pt说明预训练权重没有下载权限。这时把源码包里自带的权重文件放到 yolov5 根目录或者在torch.hub.load前手动指定本地路径。不下载预训练权重也能训练但收敛会慢很多不推荐。3.3 按显存与缺陷尺寸选 YOLOv5 模型规格源码里预置了 n、s、m、l、x 五档模型布匹缺陷检测场景一般选 s 或 m。选型的依据有两个缺陷最小尺寸和目标检测的实时性要求。下表是五档模型的相对参数与经验值模型规格宽度倍数深度倍数模型大小(约)640x640 推理耗时(GPU,约)适用场景YOLOv5n0.250.344 MB2 ms低算力嵌入式设备YOLOv5s0.500.3314 MB4 ms多数产线原型YOLOv5m0.750.6741 MB6 ms小缺陷较多的布种YOLOv5l1.051.0090 MB10 ms离线抽检YOLOv5x1.251.25166 MB14 ms高精度低实时场景布匹表面的断经、跳花在 2448×2048 原图上可能只有 20×20 像素缩放到 640×640 后只剩下 5×5 像素左右YOLOv5n 会明显漏检。我一般先在 YOLOv5s 上跑通 baseline如果 val 集上小目标类别的 recall 低于 0.8再切到 YOLOv5m。直接上 l 或 x 的收益边际很小却会拖慢训练和推理速度对产线联调不友好。4. 用 YOLOv5 训练布匹缺陷检测模型与调参4.1 data.yaml 和超参数文件如何针对布匹设置用 yolov5 训练自己的数据集第一步是把数据配置文件写对。data.yaml 的关键字段是 path、train、val、nc、namespath: ../fabric_dataset train: images/train val: images/val nc: 5 names: 0: hole 1: oil_stain 2: slub 3: weft_bar 4: immature_yarnpath是数据集根目录相对当前运行目录的路径也可以写绝对路径。train/val是相对 path 的目录。nc必须和 names 列表长度一致否则训练会在第一个 epoch 直接报错。names 最好不要用中文控制台和 TensorBoard 对中文字体支持不完整显示成方块会影响排查。超参数文件推荐从源码的 data/hyps/hyp.scratch.yaml 复制一份出来改名 fabric.yaml。布匹场景需要重点改的只有几项lr0: 0.01 # 初始学习率数据量小时降到 0.005 mosaic: 0.8 # mosaic 增强概率布匹大图拼接容易引入纹理错位 hsv_h: 0.02 # 色相偏移保留默认值的小幅下调 hsv_s: 0.8 # 饱和度增强可以拉大 fliplr: 0.5 scale: 0.5 # 缩放增强保证小缺陷不会因过度缩小而消失mosaic 从默认 1.0 降到 0.8是因为布匹纹理具有周期性四张不同方向的布样拼在一起会产生伪纹理边界模型容易把拼接缝当成缺陷。hsv_h 调低是基于 2.3 里提到的原因布匹颜色信息是稳定的物理属性不应该被大幅增强。饱和度 hsv_s 可以保留较高值模拟不同批次布料的深浅差异。4.2 启动训练与关键参数调整在源码根目录执行训练命令python train.py \ --data fabric_dataset/fabric.yaml \ --hyp fabric_dataset/fabric.yaml \ --weights yolov5s.pt \ --img 640 \ --batch-size 16 \ --epochs 100 \ --workers 8 \ --cache ram逐项说明这里面的参数含义--weights yolov5s.pt加载 COCO 预训练权重做迁移学习比从零训练省一半以上的 epoch--img 640是输入边长布匹缺陷检测通常先在 640 上练一版后续想提精度再加到 1280 微调--batch-size按显存调16 在 12 GB 左右的显卡上是安全值--cache ram把图片一次性读入内存避免每个 epoch 都重新读盘但数据集超过 20 GB 时会吃满物理内存内存不足时改成--cache disk即可。数据量少于 2000 张时有条件地冻结骨干训练。在训练命令后追加--freeze 10表示冻结前 10 个模块的骨干参数只训练检测头。这样做能防止小数据集上骨干过拟合到布匹纹理上先用完整数据把检测头的框回归学稳训练 30 个 epoch 后再去掉 freeze 参数继续跑全体参数。训练中断时不需要重新开始。输出目录 runs/train/exp 下会保存 last.pt 和 best.pt用下面的命令恢复python train.py --data fabric_dataset/fabric.yaml --resume runs/train/exp/weights/last.pt如果训练中 loss 出现 nan优先检查 data.yaml 里是否有空的标注文件以及标注坐标是否为 0 或负数。空 txt 文件会导致损失函数除以零删除空文件或跳过该图片即可。4.3 观察指标与定位误检、漏检训练结束后runs/train/exp/ 下会生成 results.png、confusion_matrix.png、val_batch1_labels.jpg 和 val_batch1_pred.jpg 四类关键文件。results.png 里重点看 val_loss 和 mAP0.5 两条曲线val_loss 先降后升说明过拟合需要在 4.1 的 yaml 里加大 mosaic 概率或启用更多数据增强mAP0.5 在布匹场景达到 0.85 以上才具备上线意义。逐类看指标而不是只看平均 mAP。布匹缺陷类别不平衡严重棉结、纬向瑕疵这类低对比度缺陷的 recall 往往拉低均值。用验证集单独测每一类的 recallpython val.py --weights runs/train/exp/weights/best.pt --data fabric_dataset/fabric.yaml --task val --conf-thres 0.1把--conf-thres从默认 0.25 降到 0.1如果 recall 明显上升说明模型其实学到了特征只是推理阶段要调低阈值如果此时 recall 仍然低说明该类别训练样本不足或标注框偏小需要回到第 2 章补数据。混淆矩阵里最常见的误检模式是背景纹理被预测成某个缺陷类这类问题不要靠调阈值解决通常是因为负样本太少。布匹数据集中应加入 10%20% 的正常布样作为背景负样本让模型有机会学习“无缺陷”这个状态。下表是布匹缺陷检测场景下三个核心指标的建议范围指标参考值说明mAP0.5≥ 0.85布匹缺陷类别少达到 0.85 才有产线可行性小缺陷 recall≥ 0.8按单个类别观察不是平均 recall误检率≤ 5%在线检测如果误报过多挡车工会直接关停相机5. YOLOv5 推理部署与布匹产线接驳技巧5.1 用 detect.py 跑批量推理并输出标签文件模型训练完成后先把验证集上的推理跑一遍确认输出效果python detect.py \ --weights runs/train/exp/weights/best.pt \ --source test_images/ \ --conf-thres 0.25 \ --line-thickness 2 \ --save-txt \ --save-conf--save-txt会把每张图的目标框以 YOLO 格式写到 runs/detect/exp/labels/ 下--save-conf会在每行末尾追加置信度格式是class x_center y_center w h conf。这个 txt 可以直接被产线上的 PLC 或剔除控制器读取不需要再解析图片上的画框结果。--source指向包含待检测图片的目录也可以直接指向一张图或一个视频文件用来做相机联动测试很方便。如果只想上报关键缺陷用--classes 0 1指定类别序号把次要缺陷过滤掉减少误报对生产线的干扰。5.2 导出 ONNX 并在 Python 中调用yolov5 训练好的 best.pt 既可以继续在 PyTorch 环境里跑也可以导出成 ONNX 格式部署到工控机或边缘设备上。导出命令python export.py --weights runs/train/exp/weights/best.pt --img 640 --include onnx --dynamic--dynamic允许输入尺寸在推理时变化但如果布匹相机分辨率固定建议去掉这个参数导出固定 640×640 输入的模型以省去动态尺寸的前处理开销。导出后得到 best.onnx用 onnxruntime 在 CPU 上就能加载import cv2 import onnxruntime as ort import numpy as np session ort.InferenceSession(best.onnx, providers[CPUExecutionProvider]) image cv2.imread(test_images/001.jpg) img, ratio, (dx, dy) letterbox(image, (640, 640)) im img[:, :, ::-1].transpose(2, 0, 1) im np.ascontiguousarray(im, dtypenp.float32) / 255.0 im im[None, :, :, :] outputs session.run(None, {session.get_inputs()[0].name: im})[0] # outputs shape: [1, 25200, 85]后续接 NMS 得到最终框这里的 letterbox 要和训练时保持一致否则目标位置会偏移。ONNX 输出形状固定为[1, 25200, 85]25200 是三个尺度上的 anchor 总数85 是 80 类 COCO 加 5 个坐标属性。由于 best.pt 是重新训练的布匹模型实际类别数会变为5 5 10即[1, 25200, 10]用 models 里的非极大值抑制函数处理即可。这一步可以把推理速度在 CPU 上跑到几十毫秒每张满足离线抽检要求。5.3 用切图推理解决布匹小目标漏检布匹缺陷检测模型在产线上遇到的最大瓶颈是工业相机分辨率太高直接缩放到 640 之后断经、棉结这类小目标只有几个像素必然漏检。常见的做法是把大图切成若干有重叠的 tile 分别推理最后合并结果。下面是一个可以直接套用的切图函数def tile_predict(image, model, tile640, overlap64, conf_thres0.25): h, w image.shape[:2] boxes [] step tile - overlap for y in range(0, h, step): for x in range(0, w, step): y2 min(y tile, h) x2 min(x tile, w) crop image[y:y2, x:x2] # letterbox 和模型推理省略 pred predict_on_crop(crop, model) for *xyxy, conf, cls in pred: if conf conf_thres: continue # 坐标还原到大图 xyxy[0] x; xyxy[2] x xyxy[1] y; xyxy[3] y boxes.append([*xyxy, conf, cls]) return merge_nms(boxes)重叠区设为 64 像素确保跨在切缝上的缺陷至少在相邻两个 tile 里各出现一次完整形态避免目标被切成两半。合并阶段使用普通 IoU NMS 即可重叠区域里同一个缺陷会被检测多次NMS 会把冗余框抑制掉。实测中2448×2048 原图切 6 块后小目标 recall 比整图缩放高 815 个百分点这个提升在布匹缺陷检测场景里基本是最大的一块。切图带来的推理时间增加可以接受因为产线相机通常只有一到两台工业机能并行处理这些分块。完成切图推理后把 tile、overlap、conf_thres 和类别过滤写到一个配置表里再接到相机 SDK 的采集回调中模型的输出就是产线控制器直接可用的结果。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价