十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

布匹瑕疵检测数据集全解析:从标注格式到模型训练实战

布匹瑕疵检测数据集全解析:从标注格式到模型训练实战 简介这套布匹瑕疵数据集源自2019天池相关赛题面向从事工业视觉检测、深度学习目标检测或图像分类的开发者和研究人员可用于布匹表面缺陷识别模型的训练与验证。资源共935个文件包含689张jpg缺陷图像和245份xml标注文件另有1个txt说明文件压缩包大小约927MB。图片涵盖32种布匹表面瑕疵类型每种缺陷样本数量不均文件命名以J01等开头便于按类别检索。目前已有2914人学习浏览。需要留意的是数据集质量参差不齐部分样本标注可能存在噪声建议使用前先抽样检查并做清洗但作为天池竞赛的原始数据其缺陷类别覆盖较广可用于复现赛题、基准测试及算法对比对有工业质检项目经验的读者仍具参考价值。 市面上的通用目标检测数据集像COCO、VOC动不动就是几十上百类日常物体看起来热闹但真放到工业现场反而不如一个细分领域的数据集来得解渴。布匹瑕疵检测就是这么个典型的细分场景而2019年天池大赛放出来的这套布匹瑕疵数据集算是国内工业视觉圈子里流传最广、最常被拿来当baseline的公开数据之一。我最初接触它是为了验证一个织物疵点检测方案当时把数据下载下来、跑通第一个模型前后花了两天。这套数据给我最大的感受是它不像很多比赛数据集那样被洗干净了——瑕疵形态复杂、类别多、样本不均衡、布面纹理干扰严重每个特点都直指工业视觉检测的真正痛点。无论你是做算法研究、准备比赛还是接私活做纺织质检项目这套数据都值得拿来当一块磨刀石。这篇文章不打算复述比赛官网的说明而是从实操角度把这套数据集的构成、标注格式、训练踩坑、模型选型以及从比赛到产线的差距完整梳理一遍。1. 这个数据集到底长什么样从比赛背景到数据全貌2019年天池的布匹瑕疵检测赛题全称是广东工业智造大数据创新大赛。赛题背景非常实在纺织厂流水线上的布匹在织造过程中会因为纱线质量、设备异常、环境因素产生各种瑕疵传统人工质检靠肉眼盯着高速运动的布面漏检率和人力成本都居高不下所以主办方希望用计算机视觉来做自动检测。赛方提供的数据是从真实工业相机拍摄的布匹图像中截取出来的不是实验室里摆拍的样品。图像中的布面纹理、光泽、褶皱都相当接近实际产线场景。这一点和很多公开数据集比含金量高出不少。数据集的整体结构我记得大概是这样的训练集包含几千张带标注的布匹图像测试集分两个阶段初赛和复赛的测试图不带公开标注需要提交推理结果。图像尺寸普遍在1920x1080级别但原始布匹是宽幅的一张图往往只覆盖了布面的一个局部所以多处瑕疵可能同时出现在一张图中瑕疵大小差异很大。瑕疵类别按官方给出的类别编号落在一个label_map或者categories文件里。常见的大类包括破洞、水渍、油渍、污渍、三丝、结头、花点、霉斑、毛粒、褶皱、缝头、织疵、漏织等等。不同网盘转存的版本可能略有差异但核心类别基本一致。我用下表把常见瑕疵类别和它们的视觉特征整理了一下方便你下载后对号入座瑕疵类别典型视觉特征检测难点破洞布面局部缺失边缘不规则透光明显目标小容易被当成纹理噪声水渍/油渍/污渍局部颜色或灰度异常边界模糊与正常布面色差接近时容易漏检三丝/结头细线状或小疙瘩状异物尺度极小长宽比极端褶皱布面局部起皱纹理方向改变大面积覆盖形状不规则容易和正常纹理混淆毛粒/棉结细小颗粒状突起密集且小容易漏检织疵/漏织经纬纱排列异常出现局部稀密路径需要理解织物纹理规律才能发现这个表是我在标注可视化和训练过程中逐步对出来的准确说是给那些拿到数据后不知道从哪里下手的读者一个快速认知。实际使用中你打开任意一张训练图就能直观感受到很多瑕疵在整图里只占几十甚至十几个像素比COCO里的小目标还要难搞。2. 标注格式与读取逻辑先别急着训练把数据结构吃透拿到数据的第一步不是急着调模型而是先把标注形式读明白。这个数据集我记得不是直接给成VOC或者COCO那种标好的json而是类似于一张记录表每一行对应一个瑕疵框。我印象中的核心字段是图像ID、瑕疵类别ID、bbox坐标。这里最容易出问题的是坐标是否归一化。天池这类工业赛题通常为了兼容不同分辨率的图像bbox坐标会给成相对图像宽高的比例值也就是0到1之间的小数。下面是一段我常用的读取脚本把CSV或者文本记录转成更通用的COCO格式或者YOLO格式方便后续接进mmdetection或者ultralytics的训练流程。import cv2 import numpy as np import pandas as pd # 假设记录文件是train.csv字段示例 # image_id, category_id, x_min, y_min, x_max, y_max df pd.read_csv(train.csv) # 如果坐标是归一化的需要乘以图像宽高 img_w, img_h 1920, 1080 df[x_min_pix] df[x_min] * img_w df[y_min_pix] df[y_min] * img_h df[x_max_pix] df[x_max] * img_w df[y_max_pix] df[y_max] * img_h # 可视化检查 img cv2.imread(train_images/xxx.jpg) for _, row in df.iterrows(): x1 int(row[x_min_pix]) y1 int(row[y_min_pix]) x2 int(row[x_max_pix]) y2 int(row[y_max_pix]) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 2) cv2.putText(img, str(row[category_id]), (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1) cv2.imwrite(check.jpg, img)这段代码不复杂但很关键。我建议你下载后马上跑一遍可视化把所有类别的样本都翻一遍建立对数据的直观印象这会直接影响后面标注文件的转换和模型调试。在这个过程中我踩过的坑主要有这么几个类别ID的起始编号不统一。有的记录文件类别从1开始有的从0开始如果不确认label_map就直接训练类别错位会让模型从头学错。坐标是归一化还是绝对像素必须先用可视化确认。我就见过有人没做缩放直接把0.7当成像素坐标画框画出来的框全挤在左上角浪费了一晚上。测试集不含标注如果你要本地做离线评估需要自己从训练集切出一部分当验证集。别偷懒直接拿整个训练集训完去提交天池的反馈周期是小时级别本地验证集能让你快速迭代。还有一个高频问题下载到的数据集可能是TFRecord格式。如果遇到这种版本我建议直接转成COCO格式因为mmdetection和detectron2对COCO的支持最成熟转完不用再折腾。3. 训练时最容易踩的五个坑逐个排查记录这部分是我最想写的。因为网上关于这套数据集的使用教程很少多数人都是闷头训练然后对着指标发呆。以下五个问题是我在训练过程中真实遇到过、并且反复排查过的。3.1 小瑕疵在深层特征图上直接消失布匹瑕疵里很多属于极端小目标比如三丝、毛粒、破洞在原图上可能就十几个像素。这种目标经过ResNet50的5次下采样之后在最后一层特征图上连一个像素都占不到检测头根本不可能找到它。我一开始用Faster R-CNN ResNet50-FPN训练跑完看mAP只有0.3左右把小目标的AP单独拉出来看几乎为0。排查了半天最后把特征图可视化出来才确认小目标的信息在深层已经把纹理淹没了。解决思路不复杂要么提高输入图像分辨率要么用更浅层的特征图做检测。我当时把输入尺寸从1333x800上调到1600x1000小目标AP涨了将近8个点。代价是显存和训练时间翻倍但效果立竿见影。3.2 类别长尾分布比想象中严重布匹瑕疵这个场景天然就是长尾分布。正常生产里破洞、油渍这类常见瑕疵出现频率远高于某些稀有瑕疵而比赛提供的训练数据也继承了这种不均衡。我统计过自己下载版本的类别频次最多的类别样本数能到上千最少的只有几十甚至十几。如果你不做任何处理模型会被样本量大的类别主导稀有类别几乎学不出来。对策我试过三种效果排序大致是类别重采样 增加稀有类别样本的Mosaic增强 单纯调loss权重。重采样的做法是把每个batch里各类别样本的比例拉平确保模型每个batch都能见到稀有类别。focal loss我也试了对小目标提升有限但对长尾问题确实有一定帮助。3.3 正常纹理被当成瑕疵背景误报特别多布匹这种对象特别坑的一点是它本身就是高度纹理化的正常纱线的交织在图像上会形成规律的明暗变化。模型一不小心就会把正常纹理学成特征然后对正常布面产生大量误检。我在用YOLOv5跑这个数据集时第一轮训练完在验证集上看到大量误报框集中在纹理密度高的区域。后来检查发现训练时的数据增强引入了过多随机裁剪和旋转把正常的纹理规律打乱了模型反而学到了错误的局部模式。解决办法是减少随机旋转的角度范围比如只用[-15度, 15度]不要用90度、180度这种会改变布面纹理方向的旋转。色度和亮度扰动幅度也要控制布面颜色太浅时过强的色彩抖动会让浅色瑕疵直接消失。3.4 宽幅布匹切图训练的边界问题工业相机的原图往往非常宽为了塞进GPU训练时普遍要做切图处理把大图切成若干小图。这个操作的副作用是如果瑕疵正好落在切块边界上它会被截断成两半模型在训练时看到的就都是残缺的瑕疵。我在推理阶段踩过同样的坑整图推不动只能滑窗但滑窗之间的overlap设小了横幅跨越两个窗口的瑕疵就漏检了。建议是训练和推理都采用带重叠的滑窗策略。训练时切图可以overlap 50像素左右推理时overlap至少留64到128像素最后把所有窗口的检测框汇总起来用NMS合并重叠框。这个细节直接决定了长条形瑕疵比如长划痕、长褶皱的检测效果。3.5 验证集划分不当评估虚高我犯过一个低级错误直接按图像ID随机划分训练集和验证集结果验证集的mAP高得离谱一提交线上分数直接掉下来。原因是同一个布卷的相邻图像之间纹理几乎一样如果这些相似图像被同时分进训练集和验证集模型本质上是在背答案。正确的划分方式是按布卷或者按拍摄批次的ID分。如果原始数据里没有这个字段也至少要按图像名称的前缀或者拍摄时间来分组再划分。这样评估出的指标才接近真实泛化能力。4. 模型选型与实效参数我最终采用的训练方案数据结构和坑都摸清之后接下来是模型选型。这个数据集上我最终采用的方案是Cascade R-CNN配合ResNet50-FPN你没有看错并不是最花哨的模型但它在这个数据集上的稳定性确实比很多风很大的模型强。为什么不用YOLO系列不是说YOLO不好YOLOv5和YOLOv8在这个数据集上也能跑而且速度极快。但布匹瑕疵有两个特点让YOLO系比较吃亏一是小目标太多anchor-free的YOLO在小目标上依靠FPN多尺度特征但如果不做特殊处理它在大图上处理小目标的能力弱于两阶段的Cascade R-CNN二是瑕疵类别之间的形状差异极大有些是细长条有些是小圆点YOLO的统一anchor设计需要额外调参。Cascade R-CNN的级联结构天然适合先粗定位、再精修的思路尤其是在背景纹理复杂、目标边缘模糊的场景下它的回归质量明显优于单阶段模型。我用它跑出来的mAP在本地验证集上比YOLOv5x高出2到3个点虽然推理速度慢了接近一倍但在比赛阶段精度优先。具体训练参数我记得比较清楚的有这么几个输入尺寸短边1000长边1600配合多尺度训练增强。优化器SGD初始学习率0.02使用linear warmup总epoch设12个在第8和第11个epoch降一次学习率降幅0.1。Batch size8两张2080Ti刚好够跑。数据增强随机翻转、随机亮度对比度扰动、弱尺度扰动。NMS阈值0.5检测置信度阈值0.05保证小目标不被过滤掉。这套配置跑下来验证集mAPIoU0.5大概在0.62左右。我没有刻意追极限更关注的是稳定复现和边界情况的可解释性。训练过程里还有一个让我印象很深的细节Cascade R-CNN对bbox回归的质量要求很高但布匹瑕疵的很多标注框本身就存在框得不准的问题尤其是大面积褶皱这类形状极不规则的瑕疵标注框里夹杂了大量正常区域。这种情况下强练回归反而有害。我当时做了一步处理对褶皱、缝头这类大而形状不规则的目标尝试把检测任务改成找中心点预测包围盒而不是严格回归四个坐标点实测对这类目标的召回率提升明显。5. 从比赛到产线mAP之外的差距在哪里很多人在天池这套数据集上跑出不错的mAP之后会误以为可以直接部署到工厂。这个认知偏差我在自己经历过一次产线实测之后才彻底意识到。mAP只是一个学术指标和产线真正关心的指标之间隔着好几道坎。产线关注的核心指标是漏检率和误检率。漏检意味着瑕疵布匹流向客户可能引发索赔误检意味着好布被当成坏布造成浪费和客户投诉。这两个指标对置信度阈值非常敏感而且和比赛用的mAP关系并不线性。我在产线实测时发现一个典型场景现场布的纹理可能和训练数据不完全一样哪怕同一个工厂不同批次的面料因为纱线批号、温湿度变化纹理细节都会有差异。模型在这种分布漂移下mAP会掉但更可怕的是漏检率可能直接翻倍。解决办法只有一种持续用现场数据做增量训练并且建立反馈闭环把线上的误检和漏检样本收回来定期清洗后再加入训练集。另一个差距是标注颗粒度。比赛标注是矩形框而很多实际检修动作需要知道瑕疵的精确位置和轮廓比如激光切割需要沿着瑕疵边缘走。框级别的检测结果无法直接驱动这类设备如果要做这类场景你需要在框的基础上加一个分割头或者干脆用实例分割模型比如Mask R-CNN。推理速度也是产线绕不开的坎。比赛时你可能用2080Ti跑推理但工厂现场往往只有一台工控机可能是一块1050Ti或者集显。模型的参数量、输入图像分辨率、滑窗步长每个环节都要重新为硬件优化。你在比赛里花大量算力换来的两个点mAP提升在产线上可能没有太大的实际价值。所以我一直觉得天池这套布匹瑕疵数据集最好的用法不是让你刷一个漂亮的排行榜分数而是让你在这个场景里把工业视觉项目的完整链路走一遍先。从数据清洗到标注格式转换从模型训练到推理优化从指标分析到现场部署每一环都能学到通用目标检测教程里学不到的东西。如果你真的钻进去了后面再去接触其他工业视觉项目比如钢材表面缺陷、锂电池极片缺陷、液晶屏点灯检测你会发现它们的套路惊人地相似。布匹瑕疵数据集就是你练手的最佳起点。本文还有配套的精品资源点击获取
返回列表