首页/新闻资讯/正文详情

布匹缺陷数据集从RAR解压到YOLO训练:标注转换与避坑全指南

发布时间:2026/9/26 11:51:29 来源:云帆数科 栏目:资讯中心
布匹缺陷数据集从RAR解压到YOLO训练:标注转换与避坑全指南
简介这是一份面向计算机视觉与工业质检领域的布匹缺陷图像数据集涵盖孔洞、色差、污渍、起球等常见纺织品瑕疵专门用于训练和评估目标检测、图像分类等深度学习模型。压缩包共包含934个文件由689张JPG布匹图像与245个XML标注文件组成整体体积约927MB图像按采集时间命名XML文件对应标注位置信息便于直接接入Faster R-CNN、YOLO等检测框架。目前已有858人浏览学习是实践智能制造质检场景的优质素材。数据集提供了多类型缺陷样本覆盖模型训练、验证与测试各阶段可用于图像预处理、特征提取、迁移学习与超参数调优等完整流程借助丰富的标注信息还能帮助开发者快速构建并部署自动化布匹质检方案减少人工检测误差提升生产效率无论是入门计算机视觉还是工业项目落地都能从中获得可复用的数据基础。1. 布匹缺陷 dataset.rar打开压缩包之前先想清楚三件事做布匹质检视觉的同学大概率都下载过这类名为「布匹缺陷数据集-dataset」的压缩包一个 rar 里塞了几千张布面图像外加一堆 xml 或 txt 标注文字。我的血泪经验是这套数据真正的难点从来不在模型结构而在解压之后三个不起眼的位置标注格式是什么、类别编号对不对、目录能不能直接被训练器认出来。这篇笔记从 rar 包的完整解压开始逐步讲到 VOC 转 YOLO、最小训练命令和 5 个高频翻车点适合刚接手工业瑕疵检测、想用现成数据集快速做出第一版效果的同学。2. 先把 rar 完整解压出来分包、损坏和密码这三关怎么过2.1 用 rarfile 先看压缩包内部结构确认是不是分包文件拿到「布匹缺陷数据集-dataset.rar」第一件事不是双击解压而是先看压缩包内部长什么样。工业数据集打包时习惯按 images、Annotations、labels 三个目录组织但有些发布方会把大图像卷成多个分卷比如 dataset.part1.rar、dataset.part2.rar如果直接解压第一个分卷后面几个卷缺失文件列表会看起来不完整。用 Python 的 rarfile 库可以在解压前把目录树拉出来import rarfile rar_path 布匹缺陷数据集-dataset.rar rf rarfile.RarFile(rar_path) for info in rf.infolist(): print(f{info.filename} {info.file_size} bytes)这段代码会把压缩包内的所有文件名和原始大小打印出来。rarfile 读取时依赖系统自带的 unrar 或 WinRAR 命令行工具Windows 上如果报找不到 unrar去 WinRAR 安装目录把unrar.exe加到 PATH 里即可。运行之后重点看三件事第一顶层目录是否只有一个文件夹避免解压后文件散落一地第二图片数量与标注文件数量是否对得上比如 images 下 5000 张图Annotations 下就该有 5000 个 xml 或 labels 下 5000 个 txt第三是否存在 r00、r01 这种分卷后缀如果有就必须把全部分卷放在同一目录下再解压。2.2 完整性校验与中断恢复宁可重下也不要带病解压很多同学图快解压中途网络断了或者磁盘满了WinRAR 弹了个警告直接点确定结果训练时才发现图片打不开这就是典型的带病解压。解压前先做一次完整性测试unrar t 布匹缺陷数据集-dataset.rart是 test 模式不实际解压只逐文件读 CRC 校验。输出结尾显示All OK才能继续如果出现CRC failed或Unexpected end of archive说明压缩包本身损坏后面解压出来的文件大概率缺头少尾。对这种损坏包常见做法是先重新下载一次再校验比尝试各种修复工具省时得多。如果压缩包放在服务器上下到一半断了可以用unrar e的断点续传替代方案但 rar 不像 http 下载那样原生支持断点最稳妥的判断标准始终是unrar t全量通过。还有一种情况是压缩包设了密码。公开的布匹缺陷数据集一般不会加密但有些内部流转包会加密码。先看压缩包里有没有 readme 或 说明.txt密码往往写在里面找不到就联系数据提供方不建议去用网上那些所谓密码找回工具这类工具在工业环境里有引入恶意代码的风险为了一个数据集不值得。2.3 解压到符合训练工具要求的目录中文路径和空格是头号敌人校验通过后解压到一个专门的工作目录。Linux 服务器上我习惯这样建mkdir -p /data/fabric_dataset cd /data/fabric_dataset unrar x /data/download/布匹缺陷数据集-dataset.rar /data/fabric_dataset/注意目标路径/data/fabric_dataset全英文、无空格。Windows 用户对应的是D:\dataset\fabric不要解压到C:\Users\张三\桌面\新建文件夹 (2)这种路径。中文和空格在 OpenCV、Ultralytics 等库里经常引发读取失败报错还千奇百怪有的说图片不存在有的说标签解析不了实际上文件都在就是路径编码问题。与其事后追查路径玄学不如一开始就指定 ASCII 路径。解压完成后用find /data/fabric_dataset -type f | wc -l数一遍文件总数和 rarfile 列出来的数量做对比。数字一致这一关才算真正过了。3. 拆开数据集看家底标注格式、缺陷类别与 VOC 转 YOLO 的落地脚本3.1 布匹缺陷数据集的常见目录结构images、Annotations 与 labels 三种摆放完整解压之后先把目录结构摸清楚。布匹缺陷数据集的常见做法是下面这样的三层结构fabric_dataset/ ├── images/ │ ├── 001.jpg │ ├── 002.jpg │ └── ... ├── Annotations/ │ ├── 001.xml │ ├── 002.xml │ └── ... └── labels/ ├── 001.txt ├── 002.txt └── ...images放原始布面图像Annotations放 VOC 格式的 XML 标注labels放 YOLO 格式的 TXT 标注。有的包只有前两个目录labels需要自己从 XML 转换出来有的包直接给 YOLO 格式连 XML 都没有。动手前先随机打开几个文件看格式不要凭文件名猜。布面图像有几个共同特征分辨率高普遍在 1000×1000 以上有的到 4000×6000背景纹理重复缺陷目标小一个破洞可能只有几十像素宽。这些特征直接决定了后面的 imgsz 参数和 tiling 策略。3.2 缺陷类别先对齐再训练一张类别映射表能少跑十轮冤枉实验布匹缺陷的类别在不同数据集里叫法差异很大但工业现场常见缺陷基本是这几类类别名常见别名形态特征破洞hole、破洞、开缝黑色或透光区域边界明显污渍stain、油污、脏污颜色异常区域边界模糊褶皱wrinkle、折皱条状阴影纹理变化飞花fly、飞纱、毛球细小点状或短线状异物跳纱warp skip、跳花经纬组织断裂粗纬coarse weft、粗节横向粗线经缩shrink、经缩档横向条纹状密度异常拿到数据集后先找包内的 classes.txt 或标签文件确认实际类别编号顺序。比如 classes.txt 写的是0 hole 1 stain 2 wrinkle那 labels 里的 0 就代表破洞不是污渍。很多同学忽略这一步直接把类别按自己的理解排一遍结果训练完预测框全错位。这里有个血泪教训类别顺序一旦定下来后续所有脚本、data.yaml、模型输出都绑定这个顺序中途改顺序等于重新训练。3.3 写个 VOC 转 YOLO 的脚本坐标归一化与类别编号映射如果压缩包只给 VOC 格式的 XML就必须转成 YOLO 能直接读的 TXT。转换脚本是整套流程里最容易被低估的一步坐标算错一个符号训练出来的框就全是歪的。这里给出一个我常用的转换脚本import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_path, out_txt_path, class_map): tree ET.parse(xml_path) root tree.getroot() width int(root.find(size/width).text) height int(root.find(size/height).text) lines [] for obj in root.findall(object): name obj.find(name).text if name not in class_map: continue class_id class_map[name] bndbox obj.find(bndbox) x1 float(bndbox.find(xmin).text) y1 float(bndbox.find(ymin).text) x2 float(bndbox.find(xmax).text) y2 float(bndbox.find(ymax).text) x_c ((x1 x2) / 2) / width y_c ((y1 y2) / 2) / height box_w (x2 - x1) / width box_h (y2 - y1) / height x_c min(max(x_c, 0.0), 1.0) y_c min(max(y_c, 0.0), 1.0) box_w min(max(box_w, 0.0), 1.0) box_h min(max(box_h, 0.0), 1.0) lines.append(f{class_id} {x_c:.6f} {y_c:.6f} {box_w:.6f} {box_h:.6f}) with open(out_txt_path, w, encodingutf-8) as f: f.write(\n.join(lines)) class_map {hole: 0, stain: 1, wrinkle: 2} voc_to_yolo(Annotations/001.xml, labels/001.txt, class_map)逻辑说明XML 里存的是像素绝对坐标YOLO 要的是归一化的中心点坐标和宽高所以先把坐标框转成中心点形式再除以图像宽高完成归一化。min和max的夹紧操作是为了防止标注框越界导致训练时报 negative 值错误这一步在瑕疵数据里尤其重要因为人工标注的框经常把边界画出去一点。参数说明class_map必须与数据集自带的类别定义一致我这里只列了三个类别做演示实际以包内的 classes.txt 为准width和height取自 XML 里的 size 节点不是实际读图算出来的两者不一致时以 XML 优先否则坐标会整体偏移。3.4 划分 train/val/test 并完成打包部署转换完成后labels 目录出现与图片一一对应的 txt 文件下一步就是划分数据集。常见的分配比例是 train 8、val 1、test 1划分时要按整张图切不能按标签行切否则同一张图的 train 和 val 会互相泄漏。划完分后目录结构应该变成标准 YOLO 布局datasets/ └── fabric/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── train/ ├── val/ └── test/建议把转换和划分的结果重新打一次包留一个干净版本备用cd /data tar czf fabric_dataset_ready.tar.gz fabric/这就是很多人问的 dataset 如何打包部署的标准答案先整理成 images/labels 分离的结构再压缩归档。后续换机器训练时一条解压命令就能恢复完整数据集不用每次都在原始 rar 上重新转换。4. 用 YOLO 把数据集跑起来data.yaml、最小训练命令与三个必调参数4.1 data.yaml 里最容易写错的三个字段数据准备好了接下来是让 YOLO 认识它。Ultralytics YOLO 靠一个 data.yaml 描述数据集位置和类别我见过最多的问题出在三个字段path 写绝对路径还是相对路径、train 和 val 的值写错层级、names 列表与实际类别数量不一致。一个可用的例子path: /data/datasets/fabric train: images/train val: images/val test: images/test names: 0: hole 1: stain 2: wrinkle说明path是数据集根目录下面必须直接挂 images 和 labels 两个子目录train和val填的是相对于 path 的图片目录训练器会自己去对应的 labels 目录下找同名 txt所以千万不要写成images/train/images。names的键从 0 开始连续递增类别名和转换脚本里的 class_map 完全一致。如果你的数据只有两类缺陷names 就只写两个多写一个空位都会在训练时报AssertionError: class value out of range。4.2 最小训练命令与 batch、imgsz、epochs 的取值依据yaml 写好后训练的最小命令就是一条yolo detect train data/data/datasets/fabric/fabric.yaml \ modelyolov8s.pt \ imgsz640 \ epochs100 \ batch16 \ device0这是从零开始微调的最小闭环。下面这几个参数是布匹缺陷场景下最值得调的地方参数常见取值取值依据modelyolov8s.pt / yolov8m.pt布匹缺陷目标小s 起步效果不行再上 mimgsz6401280布面图很大但缺陷很小imgsz 太小会丢失细节batch832按显存大小调12GB 左右用 16epochs100200数据量少于 5000 张时100 epoch 足够判断趋势device0单卡训练写 0多卡写 0,1参数说明batch 是每轮喂进去的图片数显存不够就减半不要改 imgsz 来迁就 batchimgsz 是训练时把原图缩放到的尺寸布匹原图往往四千像素直接缩到 640 会把小缺陷抹掉建议先试 640 建立基线再对比 1280 看漏检率变化epochs 不用一上来就拉满 300工业数据量通常在几千张量级100 epoch 足够看出 loss 是否收敛收敛慢再加。4.3 大幅面布匹图像的内存问题不要一次性把 dataset 读进内存训练布匹数据集时第二个高频问题是内存爆掉。很多人的习惯是把图片全部读进 Python 列表再开始训练几千张 4000×6000 的布面图光 RGB 数据就占几十 GB机器直接卡死。正确做法是让训练框架按需加载Ultralytics 的 dataloader 本来就是流式读取磁盘图片不需要也不能把全部图像塞进内存。如果你要自己写预处理脚本记住一个原则按 batch 读取一次性最多在内存里放一个 batch 的图。比如在自定义 Dataset 里__getitem__每次只读一张图配合torch.utils.data.DataLoader的num_workers开多进程预取这样内存占用稳定在单 batch 量级。这也是为什么我前面强调压缩包解压后要留足磁盘空间、按标准目录摆放——训练框架靠路径按需读文件目录乱了流式加载就全乱套。5. 避坑清单从 rar 到模型这 5 个位置最容易翻车5.1 解压路径带中文或空格训练器第一轮就报图片读取失败现象训练刚开始日志里刷出一堆FileNotFoundError或Cannot identify image file但你用文件管理器打开明明能看到图片。原因解压到了带中文、空格或特殊字符的路径下OpenCV 的 imread 在 Windows 上用 ANSI 编码解析路径中文目录名直接解析失败Linux 下问题少见但空格路径也会在 shell 传参时被截断。解决把数据集整体迁移到纯英文无空格路径比如/data/datasets/fabric。如果已经解压在错误位置不要手动移动子目录直接把整个目录 mv 过去再检查 data.yaml 里的 path 是否同步更新。这个坑我在三台不同机器上遇到过每次都是路径问题不是代码问题。5.2 类别编号不连续训练过程 loss 异常、验证输出全部错位现象训练 loss 在某个 epoch 后突然变成 nan或验证阶段的预测框类别全部错位比如把破洞预测成褶皱但置信度却很高。原因数据集原本有 5 个类别你从中间删掉了一类剩下类别编号变成 0、1、3、4中间空了一个 2。模型输出维度按类别数加一算标签里的 3 实际被当成了下标越界的值训练器做了静默处理结果 loss 计算混乱。解决转换脚本里加入一个类别重映射步骤把离散编号压缩成连续序列。检查方法很简单运行yolo detect train前先看 data.yaml 的 names 字段确认是0:,1:,2:连续排列。出现跳号就写一段脚本统一重编号别指望训练器会自动处理。5.3 小瑕疵目标与长尾类别mAP 看着高、现场却一直漏检现象验证集 mAP 上了 0.85看起来效果很好但拿到现场跑细小的破洞和飞花大量漏检甚至完全检不出来。原因布匹缺陷数据分布极不均衡大块污渍样本多、目标大、容易学小破洞和飞花样本少、目标只有几十像素被背景纹理淹没。mAP 是各类别的平均大目标类别拉高了整体分数掩盖了小目标的真实表现。解决不要只看 mAP单独看每个类别的 AP重点盯 hole 和 fly 这类小目标类。训练参数上把 imgsz 从 640 提到 1280或者用 tiling 把原图切成小块再训练。数据层面对少样本类别做简单的复制增强或 mosaic 增强但不要做太过工业数据复制两倍以内通常比较稳。5.4 rar 分包解压提示需要下一卷文件静默缺失现象解压时提示Multi-volume archives are not supported或You need to start extraction from the first volume你点了继续最后目录看起来有图但数量比压缩包内列表少了一部分。原因解压的起点不是第一个分卷或者全部分卷没放在同一个目录。rar 分卷必须从.part1.rar开始且所有分卷在同一目录下缺任何一个卷都会导致部分文件被跳过rar 工具默认不报硬错误解压完成后你甚至不知道少了文件。解决把dataset.part1.rar到最后全部分卷放进同一个空目录从 part1 开始执行unrar x。解压完立刻用find | wc -l对比文件总数这个数字和 rarfile 列出来的列表长度不一致就重新来过。5.5 空标签、零坐标与越界框训练中断得莫名其妙现象训练跑到一半报ValueError: All bounding boxes should have positive height and width或者某个 epoch 结束后验证集 mAP 掉到 0日志里伴随RuntimeWarning: invalid value encountered in divide。原因原始标注里存在空标签文件即 txt 文件长度为 0或者人工标注时把框的 xmin 和 xmax 标成了同一个值归一化后宽高为零还有的框标得超出了图像边界归一化后坐标落在 01 之外。解决写一个数据清洗脚本跑训练前扫描所有标签过滤三类问题文件内容为空直接删除对应图片在训练列表里的条目宽高小于 1 像素的框删掉坐标小于 0 或大于 1 的框夹紧到边界。上面 3.3 节转换脚本里的min/max夹紧就是为了这个。清洗完再训练这类报错基本绝迹。6. 不急着上模型先验证这个数据集值不值得投入6.1 一张 PR 曲线判断「能检」还是「能生产」训练结束后先别急着导出部署跑到runs/detect/train目录下打开PR_curve.png。布匹缺陷场景里我习惯重点看每个类别的 PR 曲线右下角曲线往右上角顶得越满说明这一类在召回率高的区间还能保持精度具备上线条件如果曲线在中段直接塌下去说明这一类是靠阈值硬撑出来的假阳性现场一定会漏检。对应地confusion_matrix.png里如果污渍类被大量预测成褶皱先回去检查类别编号有没有错位而不是急着调阈值。6.2 tiling 裁剪把大幅布匹图切块训练与推理布面原图太大直接整图推理显存不够还会因为缩放丢失小目标。常见做法是 tiling把原图切成 640×640 或 1280×1280 的 patchpatch 之间留 10% 到 20% 的 overlap推理时把每个 patch 的预测框映射回原图坐标重叠区域用 NMS 去重。切块时注意标签框如果跨越切块边界要在每个 patch 里保留完整的框而不是把框截断。我的习惯是先用整图 640 跑一个基线再用 tiling 切 960 的 patch 对比一次两次结果差超过 3 个百分点就说明数据集里小目标占比确实高值得在切块方案上继续投入差别不大就老老实实把时间花在清洗标签和补数据上。布匹数据集能不能用、值不值得投入我从来不听别人说就看这一张 PR 曲线和两次对比实验。希望这些经验对你也有用。本文还有配套的精品资源点击获取

相关推荐

【桌面 AI 自动化工具】OpenClaw 完整教学:Windows/macOS 双系统安装包与 TaoToken 配置指南
【桌面 AI 自动化工具】OpenClaw 完整教学:Windows/macOS 双系统安装包与 TaoToken 配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 11:51:22

GitHub Copilot、Cursor、JetBrains AI Assistant 实战:用 TaoToken 统一 Key 打通三款 AI 编程工具
GitHub Copilot、Cursor、JetBrains AI Assistant 实战:用 TaoToken 统一 Key 打通三款 AI 编程工具

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 11:51:22

碱性电解槽多物理场模拟全攻略:从耦合建模到工程避坑
碱性电解槽多物理场模拟全攻略:从耦合建模到工程避坑

入行氢能仿真这几年,我越来越觉得“碱性电解槽很简单”是行业内最大的误解之一——两根电极、一张隔膜加上KOH溶液,听起来确实像个初中化学实验,但真把它放大到工业级电堆运行时,电流分布不均、气泡堵流道、局部过热导致隔膜加速老… · 2026/9/26 11:51:10

Substrate区块链开发框架:从概念到实战的完整指南
Substrate区块链开发框架:从概念到实战的完整指南

2. 1. 这个项目是什么:先把“substrate”这个词拆明白如果你在技术社区里搜“substrate”,大概率会看到两个完全不同的世界:一端是区块链开发者讨论的 Substrate 框架,另一端是生物、化学、材料领域里反复出现的“培养基”“底物”… · 2026/9/26 14:12:24

通达信超级量化指标源码:多因子融合的实战解析与调优指南
通达信超级量化指标源码:多因子融合的实战解析与调优指南

1. 项目概述:通达信超级量化指标源码到底是什么,它能解决什么问题“通达信超级量化指标源码”这个标题,乍看像一句行业黑话,实则精准指向一个在A股技术分析圈里持续活跃了近二十年的硬核需求——把模糊的经验判断,变成… · 2026/9/26 14:12:24

Loop Engineering 实战:用 /goal 命令 + TaoToken 让 AI 自己写完整项目
Loop Engineering 实战:用 /goal 命令 + TaoToken 让 AI 自己写完整项目

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 14:12:18

AI辅助代码开发实战:从工具选型到Agent搭建的避坑指南
AI辅助代码开发实战:从工具选型到Agent搭建的避坑指南

1. 从“能跑就行”到“跑得明白”:AI辅助写代码的真实体感 这两年AI编程工具铺天盖地,Cursor、Copilot、通义灵码、CodeGeeX、Trae,几乎每隔几个月就冒出一个新面孔。我身边不少做前端、做嵌入式的朋友,一开始都是抱着“试试看”的… · 2026/9/26 14:12:18

axios请求调度实战:从并发控制到优先级队列的工程化之路
axios请求调度实战:从并发控制到优先级队列的工程化之路

一说"ax",前端同事基本都知道我想表达什么——axios。这个几乎人人都会配置的HTTP客户端库,绝大多数项目的使用深度也就停留在"封装get和post,拦截器里放token"。但我今天想认真聊的,是另一个很少被系统讲透的… · 2026/9/26 14:12:18

Vue项目JavaScript堆内存溢出排查与修复实战
Vue项目JavaScript堆内存溢出排查与修复实战

先交代一下我自己处理这类问题的背景。不论是在公司带项目,还是帮朋友排查线上问题,vue项目里JavaScript heap out of memory这个报错都算得上高频。报错信息一般分三段:最上面是FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaS… · 2026/9/26 14:12:05

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码