
简介针织品瑕疵检测是工业质检中的重要场景这份标注数据集提供了面向YOLOv8训练的图像与标注文件。数据包共有一百零五个文件包含五十二张原始图片、五十二个文本格式标注文件以及一个配置文件整体大小约为五点三七兆字节轻量且便于下载。文本标注采用YOLO格式记录瑕疵目标的位置和类别配置文件则写明类别名称与训练集、验证集划分结构规范下载后即可接入YOLOv8训练流程截至目前已有一千一百七十六人次浏览学习。对于正在入门目标检测、需要真实工业数据做算法验证的开发者以及开展计算机视觉实训项目的学生而言可省去自行采集和标注的繁琐环节。借助这套数据既可专注调整模型结构与训练参数也能作为基准数据集对比不同检测网络在细小瑕疵场景下的表现帮助提升模型在纺织领域的实际应用能力。1. 针织品瑕疵检测数据集先说清楚它解决什么问题做针织品质检的老师傅扫一眼就能看出破洞、油渍、跳针但一个班八小时盯下来漏检率照样能到百分之十几。换到产线自动化场景你需要的不只是算法而是一份能直接喂给模型的数据。这个标题里的核心就是一份已经用 yolov8 标记过的针织品瑕疵检测数据集压缩包——它把验布环节最值钱的“标注成果”打包好了拿到手解压就能开始训练不用再从零去画几千张框。这份数据集适合三类人想在产线上跑瑕疵检测的工程师、需要用真实工业数据做毕业设计的学生、以及刚接触 yolov8 想训练自己数据集但不知道标签格式怎么弄的人。它能省掉你至少两周的标注和清洗时间但前提是你会正确使用它并知道哪些坑在等着你。2. 用YOLOv8跑通针织品瑕疵检测数据格式、训练命令与3个必改参数2.1 数据集的目录结构images、labels 与 data.yaml 是怎么组织的拿到 zip 先解压不要急着双击打开图片。YOLOv8 标记的数据集通常遵循一个固定骨架你先按这个骨架检查包内结构是否符合预期dataset_root/ ├── data.yaml ├── images/ │ ├── train/ │ │ ├── 001.jpg │ │ └── ... │ └── val/ │ ├── 002.jpg │ └── ... └── labels/ ├── train/ │ ├── 001.txt │ └── ... └── val/ ├── 002.txt └── ...images 放原图labels 放同名的 .txt 标注文件train/val 目录按比例划分好了训练集和验证集。最关键的是 data.yaml它记录了数据集路径和类别名称是训练时第一个被读取的文件。针织品瑕疵数据集的类别一般包含破洞、油渍、跳针、漏针、线头、钩纱这类高频瑕疵具体以包内 data.yaml 的 names 字段为准。你不需要重新整理目录但必须要确认它的路径写法能直接适配你当前环境——这是很多人翻车的第一个地方yaml 里的 path 写的是打包者自己机器上的绝对路径解压到你本机就对不上了。正确做法是把 data.yaml 里的 path 改成你解压后的实际绝对路径或者直接改成相对路径。train 和 val 推荐用相对路径这样换机器不炸# data.yaml 内容示意 path: /home/user/knit_defect_dataset # 改成你解压的实际路径 train: images/train val: images/val names: 0: hole # 破洞 1: oil_stain # 油渍 2: skipped_stitch # 跳针 3: dropped_stitch # 漏针 4: loose_thread # 线头2.2 手写一个数据集自检脚本先别训练30行代码把标签问题全抓出来很多所谓“标记好的数据集”解压后其实夹带着标签错位、坐标越界、类别编号断档这类问题。数据集的清洗不是玄学是体力活。我的习惯是任何数据集到手先跑一遍自检脚本再喂给模型。下面这个脚本能处理最典型的四类问题import os from pathlib import Path label_dirs [labels/train, labels/val] image_dirs [images/train, images/val] num_classes 5 # 改成 data.yaml 里 names 的长度 for ld, imd in zip(label_dirs, image_dirs): label_path Path(ld) image_path Path(imd) for txt_file in label_path.glob(*.txt): # 1. 检查是否有对应的图像文件 img_file image_path / (txt_file.stem .jpg) if not img_file.exists(): print(f[缺图] {txt_file} 找不到同名图片) continue # 2. 逐行检查标签格式 with open(txt_file) as f: for line_num, line in enumerate(f, 1): parts line.strip().split() if len(parts) ! 5: print(f[格式错误] {txt_file} 第{line_num}行字段数{len(parts)}) continue cls_id, cx, cy, w, h map(float, parts) # 3. 检查类别ID是否越界 if cls_id num_classes or cls_id 0: print(f[类别越界] {txt_file} 第{line_num}行 class{cls_id}) # 4. 检查归一化坐标是否在0~1之间w/h 是否异常 if not (0.0 cx 1.0 and 0.0 cy 1.0): print(f[坐标越界] {txt_file} 第{line_num}行 cx{cx} cy{cy}) if w 0 or h 0 or w 1.0 or h 1.0: print(f[尺寸异常] {txt_file} 第{line_num}行 w{w} h{h}) print(自检完成以上为全部问题。)逻辑说明第 1 步建立标签和图像的映射检查避免训练时缺图报错第 2 步检查每行是否恰好 5 个字段YOLO 格式里一行代表一个瑕疵框多余或缺失都说明标记有误第 3 步检查类别 IDdata.yaml 里 names 是 0 到 N-1 这个顺序如果类间有断档训练会直接报错第 4 步是坐标合理性YOLO 的 cx、cy、w、h 都是除以原图宽高后的比值必须落在 0 到 1 之间如果出现大于 1 的值说明标注工具导出时用的是像素坐标没有归一化。参数说明num_classes 要按你 data.yaml 里的实际类别数改image 后缀如果包内是 .png 或 .bmp把脚本里.jpg一并改掉。这段脚本跑完如果输出干干净净数据就能进训练流程了如果刷出一堆报错别犹豫先修复再练不然模型会给你演一出“loss 下降但验证集 mAP 全零”的戏。# 如果你的包内图片是 png 后缀把上一段代码的 .jpg 改成 img_file image_path / (txt_file.stem .png)2.3 训练最小配置CPU环境也能跑但GPU会让你少等半辈子环境搭建是入门者最容易被劝退的一步。如果你手头只有普通 CPU 机器在 ubuntu20.04 或 windows 上搭建 CPU 版 yolov8 环境是可行的推理没问题训练也能跑但会很慢。要分两步先装 PyTorch CPU 版再装 ultralytics 包。GPU 环境则先装 CUDA 对应的 PyTorch再装 ultralytics。验证环境是否就绪用一条命令python -c from ultralytics import YOLO; print(YOLO(yolov8s.pt))能打印出模型对象就说明 yolov8 环境没问题。接下来是最小训练命令yolo detect train data/path/to/data.yaml modelyolov8s.pt epochs100 imgsz640 batch16 patience20命令逻辑说明modelyolov8s.pt表示加载 COCO 预训练权重做迁移学习不是从头训练这会显著缩短收敛时间。epochs100是最大训练轮数配合patience20启用早停即验证集指标连续 20 轮不提升就自动停止防止过拟合。imgsz640是输入图像缩放尺寸瑕疵检测里这是最重要的超参下面单独讲。batch16是每批次图片数由显存决定。显卡显存推荐 batch 值推荐 imgsz4GB 及以下8~166408GB16~32640~76812GB32~64768~8962.4 必改的3个参数不要拿默认值赌运气第一是 epochs。默认值 100 对针织品这个场景通常偏多瑕疵检测的数据集往往只有几千张图模型在 50 轮左右就该收敛了。开早停之后多设无妨不开早停就盲目设大后半程几乎必然过拟合。你要做的是把patience调到 20~30让训练自己决定停在哪。第二是 imgsz。针织品的破洞、跳针、线头在画面里属于典型小目标可能只占几十乘几十像素。imgsz 设 640 意味着所有图都被缩放到这个尺寸如果原图是 2000 像素宽缩到 640 后小瑕疵直接被抹成几个像素模型自然学不到特征。我的做法是先看原图尺寸原图大于 1500 像素时把 imgsz 提到 768 或 896小目标召回率能肉眼可见地涨上去。代价是训练时间变长但瑕疵检测值得这个成本。第三是 batch。不要为了省显存硬凑一个 batch8也不要贪大把显存塞爆报CUDA out of memory。batch 太小会让批次内的样本分布不稳定loss 曲线像锯齿。参考上面那张表按自己的显卡选稳定优先于极限。3. 标签清洗是第一道坎类别映射、误标与边界框的检查清单3.1 坐标归一化不是“建议”而是硬性要求YOLO 系列对标签的硬性要求是每个瑕疵框的坐标必须是归一化后的中心点 x、中心点 y、框宽 w、框高 h取值 0 到 1。这个值是相对于原图宽高的比例。比如原图宽 2000 像素高 1500 像素一个瑕疵框左上角在 (200, 300)右下角在 (600, 750)换算后就是 x_center (200600)/2 / 2000 0.2y_center (300750)/2 / 1500 0.35w (600-200)/2000 0.2h (750-300)/1500 0.3。写进 .txt 就是0 0.2 0.35 0.2 0.3。多数标注工具导出 YOLO 格式时会自动完成换算但有些工具导出的是像素坐标的 VOC 格式需要手工转换。如果你自查时发现某行坐标是0 356 480 100 120这种明显超过 1 的值那它大概率是像素坐标。碰上这种情况要么重新标注要么写脚本按图像宽高除一遍。注意不要随手改数值而不重新查边界很多“清洗完”的数据集恰恰是手动改坐标改出来的错位框一个框位置差了几百像素训练出来的模型会在疵点旁边框一个空气。3.2 类别编号必须从 0 连续排列中间不能断data.yaml 的 names 列表里类别编号的隐含规则是从 0 开始连续递增。比如你有 5 类瑕疵names 就只能是 0~4。如果打包者原数据集用了 6 类后来删掉一类标签里却还残留着旧编号模型会直接报index out of range或者把 5 号错认成 4 号。这就是为什么自检脚本里要单独检查类别越界。如果你要合并自己的数据集进去也保持这个规则。最常见错误是把自己数据集标成0: hole、1: oil_stain、2: hole同一个类别占了两行编号模型会把它们当两个不同类别去学导致同类瑕疵被预测出两个名字。合并时先做一个类别映射表把你原有的类别名映射到目标编号写在一个临时 python 字典里然后批量改标签里的第一个字段# 示例把旧的四种标注名映射到统一编号 mapping { hole: 0, broken_hole: 0, # 同义类目合并 oil: 1, stain: 1, skip: 2, }3.3 标注粒度瑕疵框画多大直接决定模型学的是“瑕疵”还是“纹理”同样的瑕疵不同人画出来的框差别很大。有人严格紧贴瑕疵边缘有人喜欢往外扩两圈“安全距离”。这两种框训练出来的模型行为完全不同紧贴框对定位精度要求高适合破洞这类边界明显的瑕疵扩边框对油渍这类边界模糊的瑕疵更友好但会把周围正常纹理包进去增加误检风险。画框原则对边界清晰的破洞、跳针框紧贴瑕疵本体对油渍、污渍稍微往外包含一点过渡区域反而更好因为这类瑕疵的灰度是渐变的。还有一个实战细节个别瑕疵如果是大面积散布的微小点状比如细密油点不要整片框一个大框应该按明显聚集区域拆分成多个小框。整片框会让模型认为“大片区域是异常”漏掉那些零星的小瑕疵。3.4 数据增强是补数据不是救数据针织纹理里的过拟合陷阱yolov8 默认开启的马赛克增强、随机翻转、HSV 扰动对针织品这个场景要做取舍。fliplr水平翻转对针织品基本无害但flipud垂直翻转要看布匹方向如果你生产流程里布匹都是同一经向垂直翻转出来的样本和真实分布不一致模型学的特征方向就偏了。另一个高发问题是 HSV 扰动太强。针织品的纹理、颜色本身就是特征的一部分你把色调扰动从默认的 0.015 调到 0.1白色毛巾会被随机变成淡粉色和淡蓝色模型会误以为“颜色变化瑕疵”到了产线上遇到正常染色差异就开始误报。我的设置是hsv_h0.01、hsv_s0.4、hsv_v0.4只做微弱扰动同时开启mosaic0.5而不是默认的 1.0因为针织品瑕疵检测数据集通常没有庞大规模马赛克增强过强会把小目标裁得不成样子。数据增强的目的是让模型见过更多“同分布”的变化而不是制造出训练集里不存在的纹理—颜色组合。4. 训练针织品瑕疵模型的避坑清单5个常见翻车点4.1 现象loss 曲线正常下降mAP 一直为零训练日志里 box_loss 降得挺漂亮但每轮结束验证时 mAP50 和 mAP50-95 始终挂零。这个组合拳最容易让人陷入自我怀疑“是不是我哪里代码写错了”。原因往往只有一个——标签格式根本没有配对。YOLO 的 loss 是模型输出的预测框与标签框做匹配后计算的如果标签文件里的坐标是像素值而非归一化值loss 表面上会下降但损失计算的坐标量纲与实际图像完全错位验证时目标框匹配不上mAP 自然是 0。解决方法是回到自检脚本把第四类检查“坐标是否在 0~1 之间”跑一遍把所有越界标签抓出来重新生成不要手工改。4.2 现象标签文件比图片多或者少训练时报错AssertionError: train dataset length mismatch或者训练能跑但是准确率诡异。数据集的 labels 和 images 目录数量对不上常见原因是打包者用脚本抠图裁框时漏掉了没有标注对象的图片对应的空标签文件或者有些瑕疵实在太小没被标注图片被归入“无瑕疵”但标签目录里也删了对应 txt。解决方式写脚本统计两个目录的文件名差集单独为缺失标签的图片补一个空 txt或者把标签缺失的图片移出数据集二选一不要放任不管。一个空 txt 只有 0 字节它告诉模型“这张图没有目标”这本身也是训练信息。4.3 现象训练完单张图验证没问题产线视频一开就疯狂误检这是瑕疵检测落地最坑的一关。模型在测试集图片上表现不错一旦接上产线摄像头对着正常布匹频繁报警“有洞”“有油渍”。原因分两层一是训练集里正常样本太少模型没见过足够多的“正常纹理”把经纬线的阴影变化当成了异常。二是光线差异训练集图多数是自然光或固定光源拍的现场灯管频闪、反光造成的灰度波动在模型看来就是异常。解决思路是正负样本都补在数据集里专门建一个不含任何标注对象的负样本目录加进验证集或训练集让模型见见“正常布是什么样”。如果数据集本身没有负样本你可以自己从产线视频里抽帧把无瑕疵帧直接放进 images 目录labels 对应放空 txt。4.4 现象小瑕疵线头、跳针基本漏检大瑕疵破洞倒是很准模型对破洞的 mAP 能到 0.85线头只有 0.1。这是典型的“目标尺度差异”问题不是模型不够强。原因在于 imgsz640 时几十像素宽的线头被缩放到只剩几个像素特征图上一个点可能都没覆盖到。解决的第一个手段是提高 imgsz 到 768 或 896让特征图在同等感受野下保留更多细节。第二个手段是切片训练把原图按滑窗裁成若干小块每个小块独立训练和推理最后合并结果这个后面第 6 章会展开。千万不要做的是“把小瑕疵图片复制放大”那样只是复制了原像素没有新信息模型照样学不会。4.5 现象验证集 mAP 奇高无比新数据一测就打回原形mAP 到了 0.96你兴冲冲把模型拿去验一块新布结果漏检一堆。原因是典型的训练集和验证集划分重叠打包者用同一批图片的随机划分脚本拆 train/val但针织品数据集里同一匹布的不同裁剪区域可能被分成多张图开膛破肚式随机划分导致训练集里出现和验证集非常相似的图像模型等于“开卷考试”。解决方式划分数据集时按生产批次或布匹 ID 进行分组保证同一匹布的所有裁剪图要么全部进训练集要么全部进验证集不能两边都放。拿到 zip 后先看一眼 images/train 和 images/val 下的文件名如果有大量同序列号前缀的文件散落两侧你就要重新划分一遍。这一点上偷懒后面施工现场就会还债。5. 训练完怎么判断模型真的能用mAP、混淆矩阵与产线场景验证5.1 训练日志里看什么损失曲线和 mAP 的判读顺序yolov8 训练完会自动在runs/detect/train/下生成 results.png里面包含损失和指标的曲线。很多人一打开就盯 mAP50 那条线这不是正确顺序。正确顺序是先看 box_loss 和 cls_loss 的验证曲线。训练损失和验证损失之间的 gap 如果越拉越大说明过拟合已经开始了。gap 不大的前提下再去看 mAP50 和 mAP50-95。画损失曲线不需要额外工具训练过程自带的 results.png 就够用如果你想画得更细用 ultralytics 内置的 plotting 模块读取训练日志里的字典数据也可以。关键判读标准给三条val/box_loss 连续 10 轮不降说明模型容量到顶或学习率太小train/box_loss 在降而 val/box_loss 在升早停触发点回调与过拟合的赛跑mAP50 在 0.8 左右算及格0.9 以上在验证集上有参考意义但还是要过现场那关。5.2 用 predict 模式做批量回放把预测结果贴回原图验证集指标只是考试成绩模型能不能用最终要在真实数据上跑一遍。用 predict 模式对一批新图做批量推理把框画出来保存再人眼扫一遍这是所有参数调优里最“血泪”但也最有效的一步yolo detect predict modelruns/detect/train/weights/best.pt source/path/to/test_images save_txtTrue save_confTrue saveTrue conf0.25命令参数说明model 指向最佳权重source 放你的现场抽帧图片目录save_txtTrue会生成与图片同名的 txt 结果文件里面是预测出的框坐标和置信度save_confTrue把置信度写进 txtsaveTrue保存画框后的可视化图conf0.25是置信度阈值现场验证时可以先设低一些比如 0.1目的是把“模型犹豫的框”也暴露出来看清楚它到底在哪些正常纹理上发虚。跑完重点看那些置信度 0.2 到 0.5 之间的框是否集中在某类纹理上如果是对应调整训练集里该类纹理的负样本。5.3 混淆矩阵读法漏检和误检分别怎么修yolov8 自动生成的confusion_matrix.png是整个诊断过程的核心依据。看它不需要被矩阵吓住你只需要关注两类格子一是对角线的颜色是否够深对角线每类数值代表该类召回率二是背景类background那一行里有没有不该出现的亮格子它的存在代表误检来源。矩阵现象含义动作某类对角线值低于 0.5该类瑕疵严重漏检加该类样本提高 imgsz检查该类标注框大小分布background 行某列偏亮正常纹理被误判为该类补负样本降低 HSV 色调扰动两类之间交叉亮度高两类特征相似被混淆回查标签是否错标区分两者关键外观差异并补齐样本每列都偏暗该类别基本没有被正确预测先查训练集中该类样本量和标签格式再看是否类别编号错位5.4 现场验证的固定动作抽三段视频每段 5 分钟不管离线指标多漂亮模型上线前必须过一道固定的流程在产线上抽三段不同工况的视频——正常开机段、换料段、停机前后段每段 5 分钟。把视频抽帧后喂给 predict 命令人工统计误检数和漏检数。这个过程你会发现很多离线验证看不到的问题换料段布匹颜色突变引发的一连串误报滚筒阴影导致的周期性误检停机前后灯光色温变化引起的漏检。针对这些现象去调整训练数据才算是“模型适配现场”的开始。6. 小目标瑕疵总是漏试试切片推理我这样处理漏检率线头、跳针这类目标在原图里可能只有 20×20 像素。直接把它缩到 640 训练等于帮模型把特征磨没了。我现在处理这类小目标必用的手段是切片训练配合切片推理推理阶段不用全图打分而是按滑窗把原图切成若干带重叠的小块分别推理再合并结果。重叠比例 20% 到 50%目的是避免瑕疵正好落在切缝上被切断。同一瑕疵在大图上可能因为太小被忽略切成小块后它占了整块画面的较大比例模型就能识别出来。import cv2 from ultralytics import YOLO model YOLO(best.pt) img cv2.imread(large_frame.jpg) H, W img.shape[:2] tile_size 640 overlap 0.3 step int(tile_size * (1 - overlap)) results [] for y in range(0, H - tile_size 1, step): for x in range(0, W - tile_size 1, step): tile img[y:ytile_size, x:xtile_size] pred model(tile, conf0.3, verboseFalse)[0] for box in pred.boxes: cx, cy, w, h box.xywh[0].tolist() results.append((x cx, y cy, w, h, float(box.conf), int(box.cls)))这段代码的逻辑是以 640 为切片边长、步长 448即 30% 重叠两层循环覆盖整张大图的滑窗。每个切片的预测框坐标都还原回原图坐标系。合并时同一瑕疵可能被多个切片框到最后按置信度排序保留高分框再用 NMS 去掉重复框即可。参数上切片边长大致等于你训练时的 imgsz重叠比例越大漏检越少但推理耗时成倍增长30% 是个平衡点。切片训练牺牲的是训练推理时间换来的是小目标检出率在针织品瑕疵这个场景里几乎是决定性改进。我用这套方法把线头类的 mAP50 从 0.12 提到了 0.63。最后分享一个习惯我拿到任何数据集的第一件事永远是先看标签文件里每个类别的框宽高分布而不是直接开训。画个直方图你就能直观看到哪些目标太小需要在图像预处理阶段处理这个习惯帮我避免过无数次“训了三天发现目标根本进不了特征图”的尴尬。希望这次的笔记对你有帮助祝你的模型在产线上第一个月就稳定运行。本文还有配套的精品资源点击获取