尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
布匹瑕疵检测数据集实战:从标注转换到YOLO训练避坑指南
简介这份资源是2019年天池布匹瑕疵检测赛题相关的图像数据集面向从事工业质检、缺陷检测算法实践的开发者与学习者可用于分类、目标检测等任务的训练与验证。压缩包共935个文件以689张jpg瑕疵图像和245个xml标注文件为主另附1个txt说明文件整体约927.26MB图像与标注基本配套便于直接构建监督学习数据管线。数据覆盖32种布匹表面瑕疵类别但各类别样本数量差异明显部分类别图片偏少作者也坦言整体质量不算高更适合作为练手数据或补充样本使用。目前已有2919人学习下载具备一定参考热度。读者可从中获得多类别瑕疵图像与对应标注用于熟悉工业缺陷数据的组织方式、验证检测流程与模型鲁棒性并据此评估类别不均衡对训练效果的影响。1. 布匹瑕疵数据集2019 天池赛题留下的那份“验布底料”到底怎么用布匹瑕疵检测是工业质检里最典型的细粒度视觉任务之一2019 年天池赛题放出的这份布匹瑕疵数据集至今仍是不少从业者入门纺织质检、验证检测模型的第一份“底料”。它解决的核心问题很直接给你一批带瑕疵标注的布面图像让你把断经、破洞、油污、花毛这类缺陷从正常纹理里分出来。适合谁做工业视觉的算法工程师、想复现缺陷检测流程的学生、以及需要快速搭一个验布 Demo 的团队。但这份数据不是“下载即用”的成品标注格式、类别分布、图像分辨率都有它自己的脾气直接喂给 YOLO 大概率翻车。下面按我实际拆包、清洗、转格式、训练的顺序讲清楚。2. 先看清数据长什么样类别、标注与目录结构2.1 这份数据集的真实构成拿到压缩包后别急着解压进训练目录先花十分钟把结构摸清楚。这类赛题数据集常见的是“图像文件夹 标注文件”两段式标注可能是 CSV、JSON 或每张图一个 txt。布匹瑕疵的类别通常围绕纺织厂实际会遇到的缺陷来定常见的有断经、断纬、破洞、油污、花毛、结头、边不良等具体类别数以你手上这份的标注文件为准不要照搬别人的类别表。我一般会先跑一段统计脚本把类别分布、图像尺寸、标注框数量摸一遍。这一步不做后面类别不均衡、空标注、尺寸异常全会在训练时集中爆发。import os, json, collections from PIL import Image root cloth_defect # 解压后的根目录 ann_dir os.path.join(root, annotations) img_dir os.path.join(root, images) cls_counter collections.Counter() size_counter collections.Counter() box_per_img [] for fn in os.listdir(ann_dir): if not fn.endswith(.json): continue with open(os.path.join(ann_dir, fn), r, encodingutf-8) as f: data json.load(f) # 标注结构按实际字段调整这里假设是 shapes/label 形式 shapes data.get(shapes, []) box_per_img.append(len(shapes)) for s in shapes: cls_counter[s[label]] 1 for fn in os.listdir(img_dir)[:500]: # 抽样看尺寸即可 with Image.open(os.path.join(img_dir, fn)) as im: size_counter[im.size] 1 print(类别分布:, cls_counter) print(尺寸分布(抽样):, size_counter) print(单图框数 min/max/avg:, min(box_per_img), max(box_per_img), sum(box_per_img)/len(box_per_img))这段脚本干三件事统计每个类别的框数量、抽样看图像分辨率是否统一、看单图平均框数。参数上唯一要改的是root和标注字段名不同来源的标注键名可能是shapes、objects、annotations打开一个文件看一眼就知道。跑完你会得到两个关键判断类别是否严重长尾、图像尺寸是否杂乱。布匹数据里“正常布面”往往占大头缺陷样本偏少这个结论直接决定后面要不要做重采样。2.2 为什么不能直接套通用检测配置布匹瑕疵和 COCO 那类自然图像差别很大。第一缺陷尺度极端破洞可能只有十几个像素油污可能铺满半张图anchor 或特征层要兼顾。第二背景是强纹理布面的经纬纹理本身就是高频噪声模型很容易把纹理当边缘。第三类别间视觉差异小断经和断纬在低分辨率下几乎一样。所以通用配置里的输入尺寸、anchor 比例、数据增强策略都得改。常见做法是把输入切到 640 以上、增强里加随机亮度与对比度扰动、慎用大角度旋转布面纹理有方向性转 90 度会把断经转成断纬的视觉特征。这些判断不是拍脑袋是上面统计结果推出来的。3. 把标注转成训练格式转换脚本与四个边界坑3.1 转 YOLO 格式的完整脚本多数人拿到这份数据是想快速跑通一个检测模型YOLO 系列的 txt 标注是最省事的落点。转换的核心是把绝对像素坐标归一化到 0~1并按类别 x_center y_center w h写行。下面这段脚本处理了坐标越界裁剪和空标注跳过。import os, json root cloth_defect ann_dir os.path.join(root, annotations) img_dir os.path.join(root, images) out_dir os.path.join(root, labels) os.makedirs(out_dir, exist_okTrue) classes [断经, 断纬, 破洞, 油污, 花毛] # 按实际类别顺序改 cls2id {c: i for i, c in enumerate(classes)} def clip(v, lo, hi): return max(lo, min(hi, v)) for fn in os.listdir(ann_dir): if not fn.endswith(.json): continue stem os.path.splitext(fn)[0] with open(os.path.join(ann_dir, fn), r, encodingutf-8) as f: data json.load(f) W, H data[imageWidth], data[imageHeight] lines [] for s in data.get(shapes, []): label s[label] if label not in cls2id: continue pts s[points] xs [p[0] for p in pts]; ys [p[1] for p in pts] x1, x2 clip(min(xs), 0, W), clip(max(xs), 0, W) y1, y2 clip(min(ys), 0, H), clip(max(ys), 0, H) if x2 - x1 2 or y2 - y1 2: # 过滤退化框 continue cx (x1 x2) / 2 / W cy (y1 y2) / 2 / H bw (x2 - x1) / W bh (y2 - y1) / H lines.append(f{cls2id[label]} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) if lines: with open(os.path.join(out_dir, stem .txt), w) as f: f.write(\n.join(lines))逻辑说明clip处理标注点超出图像边界的脏数据这在人工标注里很常见x2-x12过滤掉几乎退化成点的框否则训练时归一化宽高接近 0 会产生 NaN 损失if lines保证空标注图不生成空 txt避免训练器读空文件报错。参数上classes必须和你的标注 label 字符串完全一致差一个字就整类丢失这是最常见的静默失败。3.2 划分训练验证集时别踩随机种子的坑转换完别直接random.shuffle一刀切。布匹数据往往按批次或按布卷采集同一卷布的图像高度相似随机划分会导致验证集里混进训练集的“近亲”指标虚高。我一般按文件名前缀或采集批次分组划分保证同一批次的图只出现在一个集合里。import os, random, shutil random.seed(42) img_dir cloth_defect/images train_dir, val_dir dataset/images/train, dataset/images/val os.makedirs(train_dir, exist_okTrue); os.makedirs(val_dir, exist_okTrue) files sorted(os.listdir(img_dir)) # 按前缀分组假设文件名形如 batch01_0001.jpg groups {} for f in files: key f.split(_)[0] groups.setdefault(key, []).append(f) for key, fs in groups.items(): random.shuffle(fs) n_val max(1, int(len(fs) * 0.2)) for i, f in enumerate(fs): dst val_dir if i n_val else train_dir shutil.copy(os.path.join(img_dir, f), os.path.join(dst, f))seed42保证可复现0.2是验证比例按组划分是关键。如果你的文件名没有批次信息退而求其次用图像感知哈希聚类再分组别偷懒用纯随机。4. 训练配置与增强策略参数怎么设才不白跑4.1 输入尺寸与 anchor 的取舍布匹缺陷小目标多输入尺寸我一般从 640 起步显存够就上 800 或 1024。小目标在 640 下可能只剩几个像素检测头根本学不到。anchor 方面如果用的是带自适应 anchor 的版本让它自己聚类如果是固定 anchor 的老版本得用第 2 章的统计脚本导出所有框的宽高跑一遍 k-means 重新生成否则默认 anchor 全是自然图像的比例对细长条状的断经完全不匹配。# 以常见 YOLO 训练入口为例参数按实际框架调整 python train.py \ --data cloth.yaml \ --img 800 \ --batch 8 \ --epochs 100 \ --hyp hyp_cloth.yaml \ --weights yolov5s.pt--img 800是权衡显存后的选择--batch 8在单卡 16G 上比较稳--hyp指向自定义增强配置。cloth.yaml里要写对train、val路径和nc、namesnc必须等于类别数写错会直接维度不匹配。4.2 增强策略里哪些能用哪些要关布面纹理有强方向性增强要克制。随机亮度、对比度、轻微高斯噪声可以用模拟车间光照波动水平翻转慎用断经翻过来视觉上接近断纬大角度旋转直接关掉Mosaic 可以用但要把概率调低四图拼接会让小缺陷被压缩得更小。我一般把 Mosaic 概率从默认 1.0 降到 0.3~0.5颜色抖动幅度控制在 ±20% 以内。# hyp_cloth.yaml 关键片段 hsv_h: 0.0 # 色相不动布面颜色是类别线索 hsv_s: 0.3 hsv_v: 0.3 flipud: 0.0 fliplr: 0.2 # 低概率水平翻转 mosaic: 0.4 scale: 0.3hsv_h0是因为色相变化可能把油污的颜色特征抹掉fliplr0.2留一点但不高mosaic0.4平衡小目标保留和增强多样性。这些值不是标准答案是布匹场景下的经验起点跑完看验证集上小类召回再微调。5. 避坑与排查五条血泪经验5.1 类别名对不上导致整类丢失现象训练完发现某个类别从来没被预测出来混淆矩阵里那一行全空。原因转换脚本里的classes列表和标注文件里的 label 字符串不完全一致比如标注写“断经”而你写“断经线”cls2id查不到就continue跳过了全程静默。解决转换前先set出所有 label 打印一遍和classes做差集差集非空就停下来对齐。5.2 空标注图引发损失 NaN现象训练几个 step 后 loss 变 NaN。原因某些图没有缺陷正常布面转换时生成了空 txt 或没生成 txt训练器读到空文件时 batch 内框数为 0归一化除零。解决转换脚本里if lines才写文件同时在数据集配置里确认框架对空标注的处理方式必要时把纯正常图单独放一个集合做负样本评估不混进训练。5.3 验证集指标虚高现象验证 mAP 0.9 以上上线一测惨不忍睹。原因按图随机划分同批次近亲图同时进了训练和验证。解决按批次前缀分组划分或者用感知哈希去重后再分。这个坑最隐蔽指标好看的时候反而要警惕。5.4 小目标全漏检现象大块油污能检出细小破洞全丢。原因输入尺寸太小或 anchor 不匹配小目标在特征图上不足一个像素。解决输入提到 800 以上检查 anchor 是否用本数据集聚类过必要时加一个高分辨率检测头。5.5 纹理被当成缺陷现象正常布面大量误检框落在纹理交界处。原因增强里对比度拉太猛或者模型把经纬纹理的高频边缘学成了缺陷特征。解决降低颜色抖动幅度增加正常样本的负样本比例训练后看误检框是否集中在纹理密集区针对性加纹理抑制。6. 验证与进阶用混淆矩阵反推数据问题训练跑完别只看一个 mAP 就收工。我习惯先导出混淆矩阵和每类的 PR 曲线重点看两件事哪两类互相混淆最多、小类召回是否被大类压制。布匹数据里断经和断纬混淆是常态如果混淆矩阵显示这两类互相误判超过 30%说明当前分辨率下方向特征没学出来要么提分辨率要么在增强里保留方向信息别翻转。# 用验证集推理结果画混淆矩阵的简化流程 from sklearn.metrics import confusion_matrix import numpy as np # preds: [(gt_cls, pred_cls), ...] 由你的评估脚本导出 gt [p[0] for p in preds] pd [p[1] for p in preds] cm confusion_matrix(gt, pd, labelslist(range(len(classes)))) print(cm) # 归一化后看每行最大值是否在对角线 cm_norm cm / cm.sum(axis1, keepdimsTrue) print(np.round(cm_norm, 2))labels顺序必须和classes一致cm_norm按行归一化后对角线低于 0.6 的类别就是重点排查对象。另一个进阶技巧是做切片评估把验证集按缺陷面积分成小、中、大三档分别算召回你会发现整体 mAP 不错但小目标档位可能只有 0.3这个数字才是验布场景真正关心的。还有个容易被忽略的点这份数据集的标注框是矩形但布匹缺陷很多是不规则形状矩形框里混进大量背景。如果追求更高精度可以尝试把矩形框转成掩码做分割任务或者用带旋转框的检测器。我一般先用矩形框跑通基线再决定要不要上分割别一上来就堆复杂结构。从那以后我每次拿到新的工业质检数据集都强制先跑一遍类别统计和分组划分再动训练脚本——这两步省下来的返工时间比调参多得多。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

封装的比较通用的写入SLG1日志的函数

封装的比较通用的写入SLG1日志的函数

1.全局变量​​​​​​​CONSTANTS: const_callback_form TYPE baluet VALUE ,bal_param_lognumber TYPE spar-param VALUE %LOGNUMBER. DATA gv_lognumber TYPE balhdr-lognumber.2.函数代码FUNCTION zfm_create_log. *"--------------------------------------…

📅 2026/11/5 6:51:46
小白程序员必看:大模型学习路线图,助你快速入门并找到高薪工作

小白程序员必看:大模型学习路线图,助你快速入门并找到高薪工作

本文对比了两位学习者在大模型学习上的差异,指出企业需求与学习者供给的不匹配问题。文章提出了面向需求的学习路线,包括Python和机器学习基础、大模型应用开发的三板斧(Prompt工程、RAG、Agent)、微调与部署,以及三条…

📅 2026/11/5 6:51:46
化工园区人员定位常见问题怎么解决?千寻位置排查指南

化工园区人员定位常见问题怎么解决?千寻位置排查指南

化工园区人员定位系统上线后,运维人员最常遇到的问题是"系统还在跑,但数据不敢用":某片区域位置不动了、告警不响了、换班时段轨迹全乱。这些问题多数不是设备坏了,而是部署条件、环境变化或参数配置与现场不匹配。本文…

📅 2026/11/5 6:51:46
MORE NEWS

更多资讯

📰

基于multisim的双钮电子锁电路设计

11 双钮电子锁 设计任务: 1. 有两个按钮A和B,开锁密码可自设,如(3、5、7、9); 2. 若按B钮,则门铃响;(滴、嗒…); 3. 开锁过程:按3下A&…

📰

网页视频资源嗅探:不开抓包工具,5 分钟下走视频直链

网页视频资源嗅探:不开抓包工具,5 分钟下走视频直链 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓(cat-c…

📰

MemReduct 界面变回英文?3 条路径恢复语言 + 防复发清单

MemReduct 界面变回英文?3 条路径恢复语言 防复发清单 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct M…

📰

把团队的文档变成 AI 问答服务:PandaWiki 知识库搭建指南

把团队的文档变成 AI 问答服务:PandaWiki 知识库搭建指南 【免费下载链接】PandaWiki PandaWiki 是一款 AI 大模型驱动的开源知识库搭建系统,帮助你快速构建智能化的 产品文档、技术文档、FAQ、博客系统,借助大模型的力量为你提供 AI 创作、A…

📰

Buildroot 开机自启动:让你的 ARM64 程序随 Linux 启动运行

Buildroot 开机自启动:让你的 ARM64 程序随 Linux 启动运行 每次启动 QEMU,都要登录系统,再手动输入 /usr/bin/debug_demo。学习时这样做没问题,但如果这是一个采集数据、监测状态的设备,难道每次开机都要有人敲命令吗…

📰

Boring Notch 安装指南:3 步搞定未识别开发者弹窗

Boring Notch 安装指南:3 步搞定未识别开发者弹窗 【免费下载链接】boring.notch TheBoringNotch: Not so boring notch That Rocks 🎸🎶 项目地址: https://gitcode.com/gh_mirrors/bor/boring.notch 刚下载完 Boring Notch&#xff…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬