
目标检测数据集 第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_okTrue) 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 datatextile_defect_dataset/data.yaml modelyolov8s.pt epochs150 imgsz640 batch16 device0有几个超参数值得单独说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 founddata.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 这类无监督异常检测算法做兜底把检测模型当作第一道筛选异常检测模型负责捕捉“看起来不正常但不在已知类别里”的区域。这两套系统并行能显著降低漏检风险。我个人在实际操作中的体会是数据集永远不是一次性资产它需要在项目迭代中持续成长。每一次产线反馈回来的误检、漏检样本都应该补充进下一版训练数据里。这套纺织品缺陷检测数据集作为一个高质量的起点最大的价值不是替你解决所有问题而是让你在真实项目里有据可依、有底可查把精力花在模型调优和系统集成上而不是从零开始攒数据。如果你正准备做纺织质检方向的项目拿这套数据先跑通一遍全流程再结合实际产线数据迭代会是效率最高的一条路。