ARTICLE DETAIL

资讯详情

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

布料缺陷检测数据集:1690张YOLO/VOC双格式标注图像

布料缺陷检测数据集:1690张YOLO/VOC双格式标注图像 简介本资源是面向计算机视觉初学者与工业质检算法工程师的布料缺陷检测专用数据集聚焦破洞与污渍两类典型瑕疵识别任务适用于YOLO系列、Faster R-CNN等目标检测模型的训练与验证。压缩包共2000个文件含1690张640×640分辨率JPG图像、1690份Pascal VOC格式XML标注文件及310份YOLO格式TXT标签文件含classes.txt统一类别定义结构清晰、即取即用另有数据集说明、使用前必读等指导文档明确标注统计Holes 1268框、Stain 1196框、增强策略约500张增强图及格式注意事项。资源大小84.76MB采用7z高压缩比封装便于快速下载与本地部署。目前已有65人学习下载适合开展纺织品AI质检项目实践、课程实验或竞赛baseline构建可直接支撑模型训练、评估与可视化分析全流程。1. 这个布料缺陷数据集到底解决了什么问题先说结论这是一份可以直接拿去训练YOLO系列模型的工业质检数据集包含1690张布匹图像标注了两类最常见的缺陷——破洞和污渍同时提供了VOC格式的XML标注和YOLO格式的TXT标注压缩包用7z打包解压即用。我做了这么多年计算机视觉落地的项目布料缺陷检测算是纺织行业里需求最刚性、落地价值最高的一个方向。传统的布匹质检靠人工肉眼盯熟练工人每分钟要看几十米布长时间高强度工作下漏检率根本压不住。而缺陷检测模型一旦训练好了部署在产线相机后面能做到实时告警、自动标记甚至直接驱动裁切机构把瑕疵段隔离开。所以工业界对这个方向的需求一直很旺盛但真正卡住大家的不是算法而是数据。这个数据集的价值就在于它把最棘手的“数据准备”这一步帮你做完了。1690张图说起来不算多但对于布匹缺陷这类目标缺陷区域往往比较集中、特征相对明确配合数据增强手段这个量级已经足够训练出一个能跑的baseline模型。更关键的是它直接给了VOC和YOLO双格式标注省去了最让人头疼的格式转换环节。再来说说适用人群。如果你正在做纺织品质检相关的课题或者想入门工业缺陷检测又或者需要一份现成的数据集来验证自己的检测算法这份数据都能直接上手。哪怕你不是做布的这个数据集也可以作为通用缺陷检测的练习样本用来熟悉YOLOv5、YOLOv8的完整训练流程。我一直觉得做目标检测最烦的不是写模型而是搞数据。数据标注工具的安装、标注规范的制定、格式转换脚本的编写这一套流程走下来没个两三天搞不定。有了这种现成的双格式数据集你就能把精力直接放在模型调优和业务逻辑上这才是它最大的价值。2. 数据集的构成与标注格式深度解析2.1 整体目录结构与文件组织拿到压缩包解压之后首先会看到按VOC规范组织的目录结构大致是这样的布料缺陷破洞污渍检测数据集/ ├── Annotations/ │ ├── 000001.xml │ ├── 000002.xml │ └── ... ├── JPEGImages/ │ ├── 000001.jpg │ ├── 000002.jpg │ └── ... ├── ImageSets/ │ └── Main/ │ ├── train.txt │ ├── val.txt │ └── test.txt └── labels/ ├── 000001.txt ├── 000002.txt └── ...JPEGImages存放原始图像Annotations存放VOC格式的XML标注文件ImageSets/Main下面是训练集、验证集、测试集的划分文件labels目录则是YOLO格式的TXT标注。这种组织方式基本是行业标准如果你之前用过其他VOC格式数据集会发现结构几乎一致不会有任何上手障碍。2.2 VOC格式标注怎么读VOC格式的核心是XML文件每个图像对应一个同名XML。打开一个XML文件里面的结构大概是这样的annotation folderJPEGImages/folder filename000001.jpg/filename size width640/width height480/height depth3/depth /size object namehole/name bndbox xmin156/xmin ymin203/ymin xmax302/xmax ymax341/ymax /bndbox /object /annotation每个object节点代表图中的一个缺陷目标name是类别名称bndbox是缺陷边界框的左上角和右下角坐标。一个图里有几个缺陷就有几个object节点。2.3 YOLO格式标注的核心原理YOLO格式的TXT文件和VOC格式表达的是同样的标注信息但组织方式完全不同。每个TXT文件对应一张图每一行代表一个目标格式为class_id x_center y_center width height关键点在于YOLO格式里所有坐标都做了归一化处理。也就是说x_center表示目标中心点的x坐标除以图像宽度y_center是中心点y坐标除以图像高度width和height分别是目标宽高除以图像宽高。所有值都在0到1之间。这样做的好处很明显无论输入图像被缩放到什么尺寸归一化后的标注都能直接使用模型不用关心图像的原始分辨率。这也是YOLO系列训练时对标注格式的硬性要求。2.4 类别定义两类缺陷的标注逻辑这个数据集定义了2个类别通常是hole破洞和stain污渍。在YOLO训练中类别编号从0开始所以如果配置文件里把hole放在第一位它的class_id就是0stain的class_id就是1。在实际标注时需要注意破洞和污渍在视觉特征上有本质区别。破洞是布料纤维断裂形成的孔洞边缘通常不规整内部区域灰度值较低甚至能看到背景污渍则是异物附着在布料表面可能是油渍、颜料或者灰尘与布料本底有明显色差。标注时要把边界框尽量贴合缺陷的实际范围既不要框得太大引入过多背景也不要框得太小截断缺陷边缘这直接影响模型的学习效果。3. 快速上手从解压到训练YOLOv8的完整流程3.1 第一步7z包的解压方法压缩包是7z格式Windows系统自带的解压工具不支持这种格式需要专门的处理方式。如果你用的是Windows推荐直接装7-Zip免费开源解压速度快。装好之后右键压缩包选择“7-Zip”-“解压到当前文件夹”就行了。如果你习惯用命令行可以这样操作7z x 布料缺陷破洞污渍检测数据集VOCYOLO格式1690张2类别.7zmacOS或Linux系统下则更简单直接用系统自带的工具或者用p7zip# macOS brew install p7zip 7z x 布料缺陷破洞污渍检测数据集VOCYOLO格式1690张2类别.7z # Ubuntu/Debian sudo apt install p7zip-full 7z x 布料缺陷破洞污渍检测数据集VOCYOLO格式1690张2类别.7z解压后务必检查一下目录结构是否完整重点看labels目录和Annotations目录的文件数量是否与JPEGImages一致都是1690个。如果数量对不上说明解压过程中出了问题需要重新解压。3.2 第二步准备YOLOv8训练环境训练推荐直接用YOLOv8目前Ultralytics框架已经非常成熟安装方式也简单pip install ultralytics它会自动把torch、torchvision、opencv-python这些依赖装好。如果你有NVIDIA显卡建议装对应版本的CUDA版PyTorch训练速度能快好几倍。没有显卡也没关系小数据集用CPU训练也能跑就是慢一些一个epoch可能需要几分钟。3.3 第三步编写数据集配置文件YOLOv8训练需要指定一个数据集YAML文件用来告诉框架类别信息、数据路径和训练集验证集划分。在项目目录下创建fabric_defect.yaml内容如下path: /path/to/布料缺陷破洞污渍检测数据集 train: ImageSets/Main/train.txt val: ImageSets/Main/val.txt names: 0: hole 1: stain这里有一个细节要特别注意path字段指向的是数据集的根目录train和val是相对路径。但YOLOv8在读取train.txt的时候期望里面每行写的是图像的完整路径。如果你在Windows上操作而且项目路径、数据集路径都带中文容易出各种奇怪的编码问题建议统一用英文路径或者先把路径做好转换。ImageSets/Main目录下的train.txt、val.txt、test.txt是数据集作者已经划分好的。每行是一个不带扩展名的文件名比如000001。但YOLOv8期望的是一行一个图像路径所以需要做一个简单转换。在数据集根目录写个Python脚本import os def make_yolo_txt(file_list, output_file, img_dir): with open(output_file, w) as f: for name in file_list: name name.strip() if not name: continue img_path os.path.join(img_dir, name .jpg) f.write(img_path \n) with open(ImageSets/Main/train.txt, r) as f: train_names f.readlines() with open(ImageSets/Main/val.txt, r) as f: val_names f.readlines() make_yolo_txt(train_names, train_paths.txt, os.path.abspath(JPEGImages)) make_yolo_txt(val_names, val_paths.txt, os.path.abspath(JPEGImages))然后在yaml文件里引用新生成的路径文件path: . train: train_paths.txt val: val_paths.txt这也是实际项目中处理数据集最常遇到的一个坑很多人忽略了这个细节导致明明数据集格式没问题训练报错说找不到图像。报错信息往往还很迷惑容易让人绕弯路。其实根子就在于YOLOv8和VOC的ImageSets文件格式约定不同VOC只需要文件名YOLO需要完整路径。多花一分钟把路径表生成好后面就能省心很多。3.4 第四步训练模型环境配好、配置文件写好后训练命令非常简洁yolo detect train datafabric_defect.yaml modelyolov8n.pt epochs100 imgsz640 batch16YOLOv8提供了多个不同大小的预训练模型从nnano到xextra large参数量递增精度也递增但对算力的要求同步提高。对于这个数据集如果你用的是普通消费级显卡推荐用yolov8n或者yolov8s起步先跑通流程再逐步换更大的模型。参数说明epochs训练轮数工业缺陷检测一般100轮起步早期可以先用50轮快速迭代验证imgsz输入图像尺寸数据集图像分辨率如果偏大可以设成640或512batch批大小显存不够就调小16不够就降到8训练过程中框架会定期输出每个epoch的metrics包括box_loss、cls_loss、mAP50、mAP50-95等信息。观察loss曲线的下降趋势和mAP的变化就能判断模型是否在正常收敛。3.5 第五步推理验证训练完成后用训练好的权重对测试图像进行推理yolo detect predict modelruns/detect/train/weights/best.pt sourcetest_images/best.pt是训练过程中验证集表现最好的权重推理时会输出检测框、类别和置信度。这一步主要是直观感受模型效果看看有没有漏检、误检。如果有问题回到训练环节调整参数或数据增强策略。4. 关键问题排查与避坑实录4.1 问题一图像尺寸差异大要不要统一resize这个数据集里的图像尺寸不一定完全一致有的可能是640x480有的可能是1280x720甚至更大。YOLOv8训练时会把图像自动resize到imgsz指定的尺寸所以理论上不需要手动统一。但要注意如果原始图像的长宽比差异悬殊resize之后目标会被拉伸变形影响检测精度。实践中建议先用脚本统计一下所有图像的尺寸分布和长宽比情况import os from PIL import Image img_dir JPEGImages sizes {} for name in os.listdir(img_dir): if not name.endswith(.jpg): continue img Image.open(os.path.join(img_dir, name)) size img.size sizes[size] sizes.get(size, 0) 1 print(sizes)如果大部分图像尺寸比较集中直接设置imgsz640训练就行。如果长宽比差异很大可以把图像填充成正方形或者使用YOLOv8自动的letterbox处理框架本身就内置了这个能力所以一般情况下不用过分担心。4.2 问题二类别不平衡怎么办这个数据集虽然是2个类别但破洞和污渍的数量不见得相等。如果某一类样本特别少模型会倾向于把这类缺陷预测成另一类或者干脆漏检。先统计一下import os labels_dir labels class_count {0: 0, 1: 0} for name in os.listdir(labels_dir): if not name.endswith(.txt): continue with open(os.path.join(labels_dir, name), r) as f: for line in f: cls int(line.strip().split()[0]) class_count[cls] 1 print(class_count)如果发现某个类别的实例数远少于另一个通常的处理手段有三个一是用数据增强扩充少数类样本比如对包含该缺陷的图像做随机旋转、平移、色彩抖动二是调整损失函数中的类别权重YOLOv8支持在训练时设置cls参数增大少数类的分类损失权重三是换用更大的预训练模型更强的特征提取能力对少数类往往有更好的召回表现。4.3 问题三训练loss不下降或者下降后反弹loss不下降是最折磨人的问题大多数时候不是模型的问题而是数据或配置的问题。优先级从高到低排查第一个检查标注是否正确。随机挑几组图像和标注叠加可视化确认边界框是否确实框住了缺陷。我见过太多标注坐标错位、类别标反的情况这些在数据集中有时候也会存在千万不能盲信。第二个检查学习率是否合适。YOLOv8默认会自动调整学习率但如果训练过程明显不稳定可以手动调低lr0参数。第三个检查数据划分是否合理。如果训练集和验证集的分布差异大会出现训练集loss很低但验证集loss居高不下的情况本质是过拟合。这时可以增加数据增强的强度或者增加weight_decay参数。第四个检查是否装好了环境。GPU训练时显存不足、CUDA版本不匹配有时候报错不明显但是训练曲线一旦异常就要检查。4.4 问题四7z压缩包解压之后文件损坏7z格式的压缩率比zip高不少但代价是解压时如果磁盘空间不足、文件被其他程序占用容易出现解压不完整的情况。解压完成后建议立即检查文件夹大小是否和压缩前一致或者直接统计JPEGImages下的jpg文件数量是否为1690。如果数量对不上优先重新解压而不是手动补文件。还有一个容易忽略的点解压出来的路径如果包含中文目录名在Windows下使用Ultralytics框架时偶尔会遇到编码问题。保险的做法是解压后把数据集目录重命名为纯英文比如FabricDefectDataset再开始训练。5. 标注格式转换从VOC到YOLO的完整理解虽然这个数据集已经同时提供了VOC和YOLO两种格式但理解两者的转换逻辑依然很重要——因为实际工作中你经常需要处理其他只有单格式的数据集。VOC格式的边界框是绝对坐标XML里记录的是xmin, ymin, xmax, ymax单位是像素。YOLO格式是归一化相对坐标记录的是x_center, y_center, width, height范围在0到1之间。转换公式如下x_center ((xmin xmax) / 2) / image_width y_center ((ymin ymax) / 2) / image_height width (xmax - xmin) / image_width height (ymax - ymin) / image_height对应Python脚本import os import xml.etree.ElementTree as ET def voc_to_yolo(xml_path, img_width, img_height): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.findall(object): name obj.find(name).text cls_id class_map[name] bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) x_center ((xmin xmax) / 2) / img_width y_center ((ymin ymax) / 2) / img_height w (xmax - xmin) / img_width h (ymax - ymin) / img_height lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) return lines class_map {hole: 0, stain: 1}注意在转换过程中如果xmax超过了图像宽度或者xmin小于0需要做边界裁剪否则训练时会报错或者出现坐标越界问题。反向转换从YOLO到VOC就是逆运算xmin (x_center - width / 2) * image_width ymin (y_center - height / 2) * image_height xmax (x_center width / 2) * image_width ymax (y_center height / 2) * image_height这类转换脚本在实际项目中几乎每周都会用到建议保存下来当作日常工具而不是每次重新写。6. 基于这个数据集的进阶优化思路如果1690张的训练已经跑通了模型在测试集上也有不错的效果但距离实际产线部署还有差距可以从以下几个方向继续优化。6.1 数据增强策略的精细化调整布匹缺陷检测有个特点纹理背景复杂缺陷与背景的对比度参差不齐。YOLOv8默认集成了Mosaic增强、随机仿射变换、色彩抖动等策略但对于这个场景可以针对性地增强其中一些能力。比如布料缺陷常出现在不同光照条件下适当增加亮度、对比度调整的强度可以让模型对光照变化更鲁棒。在ultralytics框架中可以在训练参数中指定增强策略默认配置通常已经够用。如果想更精细地控制可以直接修改ultralytics/cfg/default.yaml中的hsv_h、hsv_s、hsv_v、degrees等参数。但要注意增强强度不要过大否则会让缺陷特征失真反而降低模型表现。6.2 Anchor-Free与Anchor-Based的选型考量我在实际项目中发现对于破洞这种小尺寸缺陷Anchor-Based的YOLOv8已经不完全是传统意义上的Anchor了它在新版本中做了大量Anchor-Free的改进。实际上YOLOv8的核心检测头已经变成了Anchor-Free的解耦头这也是它对比YOLOv5在小目标检测上的优势之一。选型方面如果你在这个数据集上的目标是追求极限精度可以考虑YOLOv8m或者YOLOv8l配合更大输入尺寸如imgsz1024训练代价是推理速度下降。如果目标是产线实时检测yolov8n配合TensorRT部署是最合适的组合在工业相机场景下能做到非常高的帧率。6.3 从检测到分割的进阶路径布料缺陷有时候形状非常不规则尤其是破损区域边界框表示方式比较粗糙——框里可能只有一半是缺陷区域另一半是正常布料。这种情况下检测模型的精度上限会被标注形式本身限制住。如果业务上需要更精细的缺陷定位可以考虑从检测升级到实例分割。YOLOv8本身就支持分割任务yolo segment train datafabric_defect.yaml modelyolov8n-seg.pt epochs100 imgsz640不过实例分割需要的数据标注是多边形点坐标如果数据集作者只提供了检测框标注你需要额外标注或者用现成的标注工具补一遍。在实际项目中很多团队会先用检测模型做初步筛查然后对可疑区域进行分割细化这也是一个可行且成本更低的方案。6.4 模型部署到产线训练好的模型最终要服务于产线部署环节同样重要。YOLOv8的模型可以通过ultralytics导出为ONNX格式再进一步转换为TensorRT引擎yolo export modelruns/detect/train/weights/best.pt formatonnx simplifyTrue导出ONNX后可以用trtexec工具生成TensorRT引擎或者使用onnxruntime-gpu直接推理。对于Python快速验证用onnxruntime更省事对于C或者高并发场景TensorRT是更稳重的选择。实测下来一个小模型在TensorRT加速下推理单张图像的时间可以压到几毫秒完全满足产线实时检测的需求。这里有个经验部署时千万别用PyTorch直接推理不仅慢而且环境依赖重ONNX或TensorRT方案成熟稳定得多。7. 写在最后的实操心得做缺陷检测项目几年下来我的体会是数据集的质量基本决定了模型精度的天花板算法只是去逼近这个天花板。这份1690张的双格式数据集虽然算不上大但胜在标注规范、格式齐全、拿来即用作为baseline非常合适。关于数据集的进一步扩展我个人的建议是先用这份数据把模型跑通然后收集自己产线的实际缺陷样本做增量训练。因为实验室数据再规范和真实生产环境的光照、布种、纹理还是有差异。用自己的数据做fine-tune通常只需要几百张样本就能让模型在目标场景下的表现上一个台阶。最后分享一个实战小技巧训练BP完一批模型后保存好每次训练的结果目录包括hparams.yaml、args.yaml和混淆矩阵图。如果你以后要调整数据集或标注这些记录能帮你快速定位是数据变化导致的效果波动还是模型参数设置的问题。这个习惯帮我排查过很多莫名其妙的精度回退问题值得养成。本文还有配套的精品资源点击获取
返回列表