目标检测数据集 第130期-基于yolo标注格式的纺织品纹理缺陷检测数据集(含免费分享)
做工业视觉的朋友应该都有同感:真正卡住项目的往往不是模型结构,而是干净、对齐、标注规范的数据集。尤其是纺织行业的缺陷检测,产线上布面缺陷种类杂、形态差异大,网上能找到的公开数据集要么太旧、要么标注格式混乱,想直接拿来做YOLO训练几乎都要重新转一轮 label。这一期分享的数据集,就是专门针对纺织品纹理缺陷检测整理的YOLO标注格式数据集,图片已经统一处理好,标注全部转成 YOLO 的 txt 格式,下载下来解压就能喂给模型训练。不管你是刚入门目标检测、还是已经在做工业质检项目,这套数据都能帮你省掉大量洗数据和转格式的时间。
我在实际整理和训练这套数据时,踩过不少标注坐标归一化、类别 ID 错位、小目标漏检之类的坑,这篇文章会把数据集的内容结构、格式细节、训练参数建议和排查经验一次讲清楚。
1. 项目背景与数据集定位
1.1 为什么纺织品缺陷检测这么依赖专用数据集
纺织品表面缺陷检测在工业生产里是一项高频刚需。布匹在织造、染色、定型、后整理过程中,会因为纱线张力不均、设备磨损、原料杂质、工艺参数波动产生各种外观缺陷,比如破洞、油污、断纱、跳花、色斑、褶皱、纬斜等等。传统做法是人工目检,验布工在验布机前盯着高速运行的布面,靠肉眼发现异常再停机处理,劳动强度大、漏检率高、而且不同检验员的标准很难统一。
用目标检测模型替代人工目检,第一步就是把“缺陷是什么样子的”量化成数据。但纺织缺陷有个特点:缺陷类别多、同类缺陷的尺度差异极大(一条细微断纱可能只有几个像素,一块油污可能占据大幅画面),而且纹理背景本身复杂,不同布种的组织结构差异很大。这些问题导致通用目标检测数据集(比如 COCO、VOC)直接拿来迁移效果很差,必须用贴近真实产线环境的数据来训练。
这套数据集的价值就在于,它采集和整理的场景直接对标纺织产线的实际质检需求,缺陷类型覆盖了最常见的几类表面问题,并且全部按照 YOLO 格式标注好,拿来就能直接做训练验证,不用再在格式转换上消耗时间。
1.2 为什么选择 YOLO 标注格式作为交付标准
YOLO 系模型目前是工业缺陷检测里落地最广的一类算法,YOLOv5、YOLOv8 以及后续的 v9、v11 系列,生态成熟、部署方案多,从 PC 端到边缘设备都能跑。而 YOLO 格式的标注是每一个目标对应一行文本,结构非常简单:
- 每一行代表一个目标框
- 五个字段分别是:类别ID、归一化中心点x坐标、归一化中心点y坐标、归一化框宽、归一化框高
我选择把数据集直接做成 YOLO 格式,而不是提供原始的 PASCAL VOC 的 XML 或者 COCO 的 JSON,核心原因是减少使用门槛。很多刚接触目标检测的开发者,在从 VOC/COCO 转 YOLO 格式这一步就会被坐标系换算、归一化、类别映射折磨一遍,而工业项目里时间成本往往比什么都贵。直接交付 YOLO 格式,配合一份 data.yaml,使用者在 YOLOv5/YOLOv8 的框架里把路径一改就能跑起来,整个流程最短。
提示:如果以后需要转回 COCO 或 VOC 格式做对比实验,也可以用 labelme 或开源转换脚本反向转,但日常训练和验证,YOLO 格式是效率最高的。
2. 数据集内容全景拆解
2.1 缺陷类别与标注统计
这一期数据集采集自多种常见坯布和成品布的产线表面图像,整理后共包含 5 个主要缺陷类别,分别是:
| 类别编号 | 类别名称 | 典型形态 | 实际难度 |
|---|---|---|---|
| 0 | 破洞 | 布面局部缺失、透光明显 | 中 |
| 1 | 油污 | 深色/浅色油渍、形状不规则 | 低 |
| 2 | 断纱 | 经纬向纱线断裂形成的细长线状缺陷 | 高(小目标) |
| 3 | 褶皱 | 布面折叠、压痕、局部不平整 | 中 |
| 4 | 色斑 | 颜色异常区域,边界模糊 | 中高 |
全套数据大约包含 2800 张已经统一尺寸的图像,标注框总数超过 9000 个,平均每张图像约 3 个目标。这里要特别说明的是,缺陷分布并不是完全平均的:油污和色斑这类比较明显的缺陷占比高一些,断纱这类细小缺陷占比相对少,但这种不平衡本身也符合真实产线的分布——明显缺陷更容易被发现并被记录,细小缺陷更难采集、也更难标注。
类别不平衡的问题,在后续训练时需要通过采样策略或损失函数权重去缓解,这一点我后面会在训练部分详细展开。
2.2 目录结构与文件说明
数据集的目录结构我整理成了标准 YOLO 项目布局,解压后直接就能被 YOLOv5/v8 的训练脚本识别:
textile_defect_dataset/ ├── images/ │ ├── train/ # 训练集图片 │ ├── val/ # 验证集图片 │ └── test/ # 测试集图片 ├── labels/ │ ├── train/ # 训练集标注txt │ ├── val/ # 验证集标注txt │ └── test/ # 测试集标注txt ├── classes.txt # 类别名称列表,每行一个 └── data.yaml # YOLO训练入口配置这里有个很容易被忽略的细节:images 和 labels 是严格一一对应的,同名文件共用一个主文件名。比如images/train/000123.jpg对应对应的标注文件一定是labels/train/000123.txt。如果使用者在拷贝、压缩、传输过程中不小心破坏了这种对应关系,训练时会出现 "Image without label" 或者标签错配的警告,我在生成的文档里特别强调过不要改动文件名结构。
data.yaml 的内容也很直观,主要包括训练验证路径、类别数量、类别名称三个部分:
path: ./textile_defect_dataset train: images/train val: images/val test: images/test nc: 5 names: ['hole', 'oil_stain', 'broken_yarn', 'wrinkle', 'color_spot']2.3 图像质量与场景覆盖
图像原始来源包括在线检测相机抓拍和离线验布平台采集,兼顾了不同光照条件、不同布面纹理密度、不同车速下的成像效果。部分图像存在光照不均、布面褶皱阴影、相机抖动轻微模糊等噪声,但我不建议直接把这些图像删掉。
原因很简单:真实产线环境本来就脏,模型如果只在“干净”图像上训练,部署到现场遇到阴影、反光就容易误报。保留一定比例的噪声样本反而能提升模型的鲁棒性。当然,如果某些图像模糊到连人眼都难以判断缺陷边界,这类样本确实应该剔除,否则会引入错误标注。我在整理时已经手工筛掉了一批不可标注的极端样本,保留的是“有挑战但可标注”的图像。
图像尺寸方面,原始图像统一做了缩放处理,最终以 640x640 附近的分辨率为主。不过要提醒一句:如果你的布面纹理非常细密,建议训练时用更高输入分辨率(比如 960 或 1280),否则细小断纱目标在下采样过程中很容易丢失特征。
3. 标注格式深入解析与验证方法
3.1 YOLO 格式核心参数理解
YOLO 标注每一行的五列数据,含义必须完全理解清楚,否则很容易在手工检查或脚本处理时犯错。
<类别ID> <x_center> <y_center> <width> <height>所有数值都是归一化后的比例值,范围在 0 到 1 之间,除以的是图像的宽和高。举个例子,如果一张图像宽 640、高 480,某个破洞的真实像素边界框是左上角 (160, 120)、右下角 (480, 360),那么中心点像素坐标是 (320, 240),框宽高是 (320, 240),归一化后就是:
0 0.500000 0.500000 0.500000 0.500000这里最容易犯的错误是混淆中心点坐标和左上角坐标。COCO 和 VOC 格式用的是左上角 xy + 宽高,YOLO 用的是中心点 xy + 宽高,转换时如果忘记做坐标换算,训练出来的模型边界框会整体偏移,而且 mAP 表现很怪——明明损失在下降,但检测框位置就是不对。这类问题通常不会报错,排查起来特别费时间,我建议在拿到任何数据集后,第一件事就是做可视化检查。
3.2 标注质量检查脚本实战
我当时拿到标注文件后,第一时间写了一个简单的 Python 脚本做批量可视化,把每一张图的标注框叠加画在原图上。这一步能快速发现三类问题:框坐标越界、类别串号、以及标注位置明显不对。
import cv2 import os img_dir = 'textile_defect_dataset/images/val' label_dir = 'textile_defect_dataset/labels/val' class_names = ['hole', 'oil_stain', 'broken_yarn', 'wrinkle', 'color_spot'] os.makedirs('check_vis', exist_ok=True) for img_name in os.listdir(img_dir): if not img_name.endswith('.jpg'): continue img_path = os.path.join(img_dir, img_name) label_path = os.path.join(label_dir, img_name.replace('.jpg', '.txt')) img = cv2.imread(img_path) h, w = img.shape[:2] if not os.path.exists(label_path): print(f'[WARN] missing label: {img_name}') continue with open(label_path, 'r') as f: for line in f: parts = line.strip().split() if len(parts) != 5: print(f'[ERROR] bad line in {img_name}: {line.strip()}') continue cls_id = int(parts[0]) x_c, y_c, bw, bh = map(float, parts[1:]) # 反归一化还原像素坐标 x1 = int((x_c - bw / 2) * w) y1 = int((y_c - bh / 2) * h) x2 = int((x_c + bw / 2) * w) y2 = int((y_c + bh / 2) * h) # 越界检测 if x1 < 0 or y1 < 0 or x2 > w or y2 > h: print(f'[WARN] out of bounds: {img_name}, cls={cls_id}') color = (0, 255, 0) cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) cv2.putText(img, class_names[cls_id], (x1, max(0, y1 - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1) cv2.imwrite(os.path.join('check_vis', img_name), img) print('可视化完成,请检查 check_vis 目录')这个脚本虽然简单,但在实际项目里帮我排查出不少问题。尤其是越界检测那段,y1 小于零或 x2 大于宽度时,在 YOLO 训练里通常不会报致命错误,只是那个框会被自动裁剪或忽略,但如果这类样本占比过高,会白白浪费训练样本。建议在拿到数据集时统一跑一遍这个脚本,把异常样本筛选出来单独处理。
4. 训练实操与参数调优建议
4.1 数据划分与增强策略
数据集在交付前已经按照约 7:2:1 的比例划分成 train/val/test,三个集合之间保证没有来自同一连续布面片段的图像重复,避免数据泄露。这一点很重要,因为同一匹布相邻位置图像如果同时出现在训练集和验证集里,验证指标的置信度会打折扣。
训练时我建议在原有划分基础上,再做一次离线增强,尤其是针对缺陷样本较少的类别。我常用的是这几种增强组合:
- 水平翻转和垂直翻转:布面缺陷没有明显的方向先验,翻转不会破坏语义
- 随机旋转 90 度倍数:需要配合合适的标注自动旋转
- 亮度对比度扰动:模拟产线不同光照条件
- 高斯噪声和轻微模糊:增强模型对镜头老化和轻微失焦的鲁棒性
需要注意的是,像破洞、断纱这类缺陷的尺度非常敏感,如果做随机缩放增强,缩放比例不宜过大,否则小目标会变得更难学习。我一般把 scale 控制在 0.5 到 1.5 之间,超出这个范围容易让标注框和真实缺陷形态失真。
4.2 模型选型与超参数配置
基于这套数据集规模,我实测下来最稳的起步配置是 YOLOv8n 或 YOLOv8s。n 模型训练速度快,适合先跑通流程、验证数据没问题;s 模型精度更高一些,适合作为正式训练的基础模型。如果检测精度仍然不够,再考虑用 YOLOv8m 或者引入注意力模块,但不要一上来就上大模型,工业数据集迭代快,模型太大会拖慢整个实验循环。
一个可以直接参考的训练命令(以 YOLOv8 为例):
yolo train data=textile_defect_dataset/data.yaml model=yolov8s.pt epochs=150 imgsz=640 batch=16 device=0有几个超参数值得单独说:
- imgsz:如果断纱这类小目标占比高,建议提升到 960 甚至 1280,代价是显存占用和训练时间增加。我测试过同一套数据在 640 和 1280 下的结果,小目标 AP 差距可以达到 5 个点以上。
- batch:显存允许的情况下尽量大,稳定 BN 统计量对纹理背景复杂的数据很有帮助。
- epochs:早期停止机制打开,避免过拟合。纺织缺陷数据类别间相似度高,训练后期很容易过拟合到纹理细节上。
对于类别不平衡问题,我在训练时设了每个类别的采样权重。YOLOv8 里可以通过修改数据集的重复采样策略或者自定义 loss 权重来实现,最简单的做法是对样本少的类别做离线多副本增强,把断纱这类小样本类别复制几份混入训练集。经验上,类别数量相差 3 倍以内可以不处理,超过 5 倍就要干预。
4.3 训练监控与结果评估
训练过程中不要只盯 loss 曲线,更要关注验证集上每个类别的 mAP。纺织缺陷检测里,整体的 mAP 好看不代表能落地,必须逐类看:
- 破洞和油污这类大目标,AP 通常能到 0.9 以上
- 断纱这类小目标,AP 如果低于 0.6,基本没法直接用
- 色斑和褶皱边界模糊,容易出现框偏移半个目标的情况,需要看 AP50 和 AP75 的差距
如果类别间 AP 差距过大,优先排查的是该类别的样本量和标注一致性。很多时候不是模型不行,而是同一类缺陷不同标注员的框标准不一致(有人框到缺陷核心区,有人框到整个异常范围),模型学到的边界是“平均框”,自然对不齐。
注意:评估指标的阈值选择也很关键。产线质检如果关注的是“有没有缺陷”,AP50 更贴近实际需求;如果还需要定位准确供机械手执行剔除动作,那就必须同时关注 AP75 以上的定位精度。
5. 常见问题与排查实录
5.1 数据集加载报错排查
很多使用者在加载数据集时遇到报错,我整理了出现频率最高的几个:
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 训练时提示 no labels found | data.yaml 里路径写错,或 images/labels 目录不匹配 | 检查 path 是绝对路径还是相对路径,确认 train/val 路径指向目录而非文件 |
| 提示 image 与 label 数量不一致 | 部分图片没有对应 txt,或 txt 为空文件 | 用脚本对比两个目录的主文件名集合,找出缺失项补齐或剔除 |
| 提示 class ID 越界 | txt 里的类别编号 ≥ nc | 检查 classes.txt 顺序,确认类别 ID 是否从 0 开始 |
| 训练 loss 正常但验证 AP 为 0 | 验证集标注全为空,或类别名称不一致 | 打开 val 标签文件检查是否为空,确认评估脚本加载的类别顺序与训练一致 |
这些坑里,class ID 越界是新手最容易犯的。YOLO 的类别编号必须从 0 开始,如果有人把 classes.txt 写成了从 1 开始,模型会直接报错或者把所有预测结果错位。拿到数据集先看一眼 classes.txt 的第一行是不是第一类,这个小习惯能省很多排查时间。
5.2 检测效果不佳的排查思路
模型训练完,在测试集上效果不好,先别急着调参,按下面这个顺序排查:
- 可视化预测结果。把预测框画到图上,看是“该检出的没检出”(漏检)还是“检出的框不准”(定位误差)还是“把纹理误判为缺陷”(误检)。
- 如果是漏检,多半是目标太小或样本不足,优先提升输入分辨率和对该类别做增强。
- 如果是框不准,去检查训练集标注质量,重点看边界模糊的类别是不是标注框本身就不一致。
- 如果是误检,通常是背景纹理被当成了缺陷。这时候不要盲目加数据,先看误检样本集中在哪些纹理区域,针对性补充反例样本。
我遇到过一个典型情况:在深色布面上,细小的白色纱线反光被模型误判为断纱。这种情况单纯增加断纱正样本没啥用,反而需要在训练数据里加入大量正常纹理但带反光的负样本,让模型学会区分“纹理异常”和“光照反光”。
5.3 标注边界框解析异常
手工打开标注文件时,有时候会看到某些框的宽高数值明显不合理,比如 width 是 0.0001 或者 height 接近 1.0。前者一般是标注时误点了点状目标或者导出精度丢失,后者可能是把整个布面都框进去了。在 YOLO 训练中,过小或过大的框都会影响 anchor 匹配效率,导致这些目标无法被合理分配正样本。
处理建议是写一个过滤脚本,把宽高小于图像尺寸 0.01 的框或大于 0.95 的框单独列出来,人工确认后再决定保留还是删除。不要批量删除,因为有些细长断纱的框确实可能在一个维度上非常小,需要逐个判断。
另外提醒一点,所有标注数值建议保留 6 位小数,不要为了省空间截断成 2 位。坐标精度丢失对宽框影响不大,但对细长小目标的影响非常明显,有时候差 0.001 的归一化偏移在 1280 分辨率下就是 1 个像素级别的误差,对断纱这种线状缺陷来说,1 个像素可能就是检测成功和失败的差别。
6. 基于这套数据的后续扩展方向
数据集本身可以直接训练检测模型,但实际产线落地时往往还要再往前走几步。这里分享几个我在项目中验证过的扩展路径。
第一个是缺陷分类与定位的联动。检测模型输出缺陷框之后,可以在每个框内再接一个轻量分类器,区分同一框内的具体缺陷子类型。尤其是在色斑这类边界模糊的类别上,检测框可能覆盖了较大区域,后续分类能提供更精细的质量分级。比如染色工艺里,色斑的深浅程度直接影响产品是降级还是报废,这类分级信息检测模型不擅长,但一个框内的分类网络可以做得很好。
第二个是结合分割模型做缺陷形态分析。有些缺陷(比如褶皱)用矩形框表达本身就损失了大量信息,框只能告诉你“这里有问题”,但产线关心的是褶皱的走向、宽度、面积占比。这种情况下可以考虑用 YOLOv8-seg 在这套数据上做二次标注,把矩形框升级为多边形分割掩码。标注成本会上升,但对后续决策非常有利。
第三个是异常检测的兜底方案。深度学习检测模型对已知类别效果好,但对未见过的缺陷类型(比如设备故障后出现的新型磨损痕迹)几乎无能为力。成熟的产线方案一般会用 PatchCore、Padim 这类无监督异常检测算法做兜底,把检测模型当作第一道筛选,异常检测模型负责捕捉“看起来不正常但不在已知类别里”的区域。这两套系统并行,能显著降低漏检风险。
我个人在实际操作中的体会是,数据集永远不是一次性资产,它需要在项目迭代中持续成长。每一次产线反馈回来的误检、漏检样本,都应该补充进下一版训练数据里。这套纺织品缺陷检测数据集作为一个高质量的起点,最大的价值不是替你解决所有问题,而是让你在真实项目里有据可依、有底可查,把精力花在模型调优和系统集成上,而不是从零开始攒数据。如果你正准备做纺织质检方向的项目,拿这套数据先跑通一遍全流程,再结合实际产线数据迭代,会是效率最高的一条路。