新闻详情

新闻详情

首页 / 资讯中心 / 详情

皮革缺陷检测数据集与YOLOv8训练实战指南

发布时间:2026/10/1 6:06:08来源:尧图网络
皮革缺陷检测数据集与YOLOv8训练实战指南
简介皮革缺陷检测数据集是一套面向工业质检场景的多类别目标检测资源适用于制造业自动化质量分拣、生皮原料评估及计算机视觉算法研发。包内共982个文件包含490张真实采集的JPEG图片及对应YOLO格式txt标注文件另附1个yaml配置文件用于模型训练参数设置和1个docx说明文档提供数据集详细介绍与使用指南压缩包整体15.55MB结构紧凑无需额外预处理即可直接投入训练。数据划分清晰训练集429张、验证集41张、测试集20张标注了CUERO、MALO、REGULAR三种质量状态覆盖正常、缺陷与轻微瑕疵区域。图片均来自真实生产环境边界框定位准确可直接适配YOLO系列模型也支持迁移学习至其他工业检测任务适合质检工程师、AI开发者和教学实训场景快速上手。目前已有251人学习下载可满足工业落地与教学实验的双重需求。1. 皮革缺陷检测数据集拿它训练质检模型到底值不值在皮革厂待过的人都知道成品革出库前最后一道人工质检全靠眼睛。老师傅拿强光灯一照、手一抹能在两平米的皮面上找出针孔、划痕和褶皱新人跟三个月检出率还是忽高忽低。我最早接触这份多类别目标检测数据集就是想把这道工序从“靠老师傅经验”变成“模型先筛一遍、人再复核一遍”。它按 YOLO 格式组织解压后直接进 ultralytics 训练流程从下载到跑通第一个验证集绝大多数时间花在数据清洗而不是改代码上。适合刚入门目标检测、被“自制数据集”折磨过的人也适合想给质检方案做设备预研的工程师。2. 数据集里到底有什么zip包结构、标签格式与类别分布2.1 先解压再认目录结构拿到皮革缺陷检测数据集.zip之后第一步不是急着训练而是先解压、把目录结构看明白。这个步骤看起来基础但很多翻车事故都是从这里开始的。unzip leather_defect.zip -d leather_defect cd leather_defect find . -maxdepth 2 -type f | head -40在 Linux 下没装 unzip 的话先装一下再执行不同的发行版命令不一样Debian/Ubuntu 系是apt install unzipCentOS/RHEL 系是yum install unzip。解压完成后find命令会打印出前 40 个文件路径这个动作能让你在动手训练之前就对数据量有一个直观印象。这份数据集的目录组织是 YOLO 系列的标准做法图片和标注文件分成images和labels两大块每块内部再按train、val、test划分。路径内容格式作用images/train训练图片.jpg模型拟合images/val验证图片.jpg调参和早停images/test测试图片.jpg最终评估labels/train训练标注.txt对应训练图片labels/val验证标注.txt对应验证图片labels/test测试标注.txt对应测试图片图片和标注是严格同名的images/train/0001.jpg对应的标注就是labels/train/0001.txt。之所以强调这一点是因为很多人拿到数据集后习惯把图片拷来拷去一改文件名配对关系就断了训练时模型会一直警告“Found 0 labels”。2.2 标签文件读法YOLO 格式的每一行是什么随便打开一个.txt标注文件里面每一行是五个数字分别代表类别编号和边界框的归一化信息。以labels/train/下某个文件为例常见内容是这样的0 0.4832 0.5167 0.0321 0.0284 1 0.2156 0.8732 0.1245 0.0145 2 0.7231 0.3419 0.0867 0.0952每行五个字段的含义依次是class_id、x_center、y_center、width、height。注意这里的坐标全部做了归一化值域在 0 到 1 之间并且是中心点加宽高不是左上角加右下角。如果你以前用的是 VOC 的 XML 格式转成 YOLO 格式时一定要做一次换算。def voc_to_yolo(x1, y1, x2, y2, img_w, img_h): cx (x1 x2) / 2 / img_w cy (y1 y2) / 2 / img_h w (x2 - x1) / img_w h (y2 - y1) / img_h return cx, cy, w, h这段代码不复杂但值得留个印象。x1、y1、x2、y2 是左上角和右下角的像素坐标除以图片宽高之后变成归一化值。很多人在自己扩充数据集时把 VOC 标注直接改成五个数字塞进 YOLO 流程结果训练出来的模型完全不像样排查半天才发现坐标根本没归一化。2.3 类别与样本分布先用脚本摸清底细这份数据集把皮革缺陷归成了四类常见的有孔洞、划痕、褶皱、污渍。具体类别命名在data.yaml里能看到但每个类别的样本量是否均衡需要自己跑一遍统计。import collections from pathlib import Path counter collections.Counter() total 0 for p in Path(leather_defect/labels/train).glob(*.txt): for line in p.read_text().splitlines(): cls int(line.split()[0]) counter[cls] 1 total 1 for cls, cnt in sorted(counter.items()): print(fclass {cls}: {cnt} objects, {cnt / total:.1%})这段脚本遍历训练集里所有标注文件把每个目标框的类别编号累加最后打印出每个类别占全体目标的百分比。建议拿到数据集的第一时间就跑一遍因为缺陷数据集普遍存在长尾问题孔洞和划痕这类小目标数量多褶皱和污渍这类大目标数量少。不提前看分布后面训练时 loss 可能降得很漂亮但少数类的 mAP 会惨不忍睹。3. 用YOLOv8训练皮革缺陷检测目录划分、yaml与参数清单3.1 为什么选 YOLOv8 而不是更旧的 v5/v7这份数据集本身是 YOLO 标签格式理论上 v5、v7 都能训。我之所以默认用 YOLOv8是因为 ultralytics 现在的生态最完整训练、验证、导出 ONNX、转 TensorRT 一套命令走完而且默认支持自适应锚框和数据增强对缺陷检测这种小目标场景省心不少。v5 也能训但导出和部署链路要自己折腾做工业预研时不值得浪费时间。如果只是验证数据集能不能跑通直接用yolov8n.pt这个轻量权重训练速度快显存占用小。等确认效果可行再换成yolov8s或者yolov8m也不迟。3.2 划分 train/val/test 目录如果下载的压缩包已经帮你分好了train/val/test那这一步可以跳过。但很多时候从其他地方拿到的版本只有一张图片目录和一张标签目录没有划分。这时我会自己写一个按比例划分的脚本。import random from pathlib import Path import shutil random.seed(42) src_images Path(images) src_labels Path(labels) train_dir Path(dataset/train) val_dir Path(dataset/val) test_dir Path(dataset/test) for d in [train_dir, val_dir, test_dir]: (d / images).mkdir(parentsTrue, exist_okTrue) (d / labels).mkdir(parentsTrue, exist_okTrue) names [p.name for p in src_images.glob(*.jpg)] random.shuffle(names) n len(names) train_names names[: int(n * 0.8)] val_names names[int(n * 0.8): int(n * 0.9)] test_names names[int(n * 0.9):] for split, parts in [(train, train_names), (val, val_names), (test, test_names)]: for name in parts: shutil.copy2(src_images / name, fdataset/{split}/images/{name}) label_name name.replace(.jpg, .txt) shutil.copy2(src_labels / label_name, fdataset/{split}/labels/{label_name})按 8:1:1 的比例划分random.seed(42)保证每次运行结果一致。这里拷贝而不是移动文件是为了保留原始数据万一划分出错还能重来。皮革缺陷检测数据集通常整体量级不大80% 做训练在很多场景下是够用的验证集留 10% 用于早停测试集留 10% 做最终评估。如果追求更严谨的评估可以做五折交叉验证但训练成本会涨很多预研阶段不建议一上来就玩这么大。注意划分时一定要用copy2保留原始文件。移动文件一旦中途报错原始数据就乱了。3.3 data.yaml 与训练命令ultralytics 的训练入口是yolo命令它需要一个data.yaml来描述数据集路径和类别配置。这个文件是后面所有坑的总开关尤其是names的顺序必须和标注文件里的类别编号一一对应。path: leather_defect train: images/train val: images/val test: images/test nc: 4 names: 0: hole 1: scratch 2: wrinkle 3: stainpath是数据集根目录train、val、test是相对这个根目录的路径。这里最容易翻车的点是names与标注编号错位比如标注文件里0实际是划痕但 yaml 里0写成了孔洞模型不会报错只会默默学出一套错位的映射。yaml 写好后训练命令可以这样yolo detect train dataleather_defect.yaml modelyolov8n.pt epochs120 batch16 imgsz640 optimizerAdamW lr00.01 patience20训练过程中要重点关注几个参数参数示例值说明epochs120缺陷检测数据量不大太少欠拟合太多过拟合batch168G 显存用 16显存不够先降到 8imgsz640输入尺寸皮革缺陷目标小不建议降到 320 以下optimizerAdamW小数据集上收敛更稳lr00.01初始学习率太高容易震荡patience20val_loss 20 轮不降就早停省时间我一般会把patience设成 20这样训练到七八十轮如果已经不涨了直接自动停不用守着看。3.4 显存不够怎么办很多人用 8G 显存的显卡跑yolov8nbatch16是能跑动的。如果报显存溢出先不要急着换卡把batch改成 8 试一次或者把imgsz降到 512。显存溢出很多时候不是模型太大而是batch加imgsz的组合超过了显存上限。4. 训练跑完不等于能用推理验证、指标解读与可视化4.1 先用 best.pt 跑一遍验证集训练完成后runs/detect/train/目录下会有best.pt和last.pt两个权重文件。best.pt是验证集上指标最好的那个last.pt是最后一轮的状态评估和部署都拿best.pt。yolo detect predict modelruns/detect/train/weights/best.pt sourceleather_defect/images/val save_txtTrue save_confTrue加上save_txtTrue会把检测结果写成文本文件save_confTrue会一并输出置信度方便后面筛查漏检。跑完之后runs/detect/predict/里除了预测图片和标签文件还会有一个annotations的汇总信息。先打开几张预测图片看看这个动作比看指标更直观能一眼看出大问题比如类别全乱了、框的位置整体偏移等。4.2 指标怎么读mAP、PR 曲线和混淆矩阵训练结束后ultralytics 会自动输出一组指标文件包括results.png、confusion_matrix.png、PR_curve.png。新手最容易犯的错是只看mAP50觉得挺高就完事了在缺陷检测场景里我更看重的是这几个指标的配合指标关注原因mAP50-95反映边界框回归质量比 mAP50 更严格Recall缺陷漏检是最不能接受的召回率优先混淆矩阵看哪些类别互相认错比如褶皱被认成划痕F1-Confidence找置信度阈值的最优点皮革缺陷里褶皱和背景纹理高度相似mAP50-95往往比mAP50低不少这是正常现象。如果mAP50有 0.9 但mAP50-95只有 0.5说明框的定位不够精细需要加大imgsz或者补充小目标样本而不是盲目加大模型。质检场景有一个和通用目标检测不一样的判断逻辑漏检比误检更严重。一个缺陷没报出来流到下一道工序就是直接损失一个误检最多就是让工人多看一眼。所以调阈值时优先保证召回率把置信度阈值适当调低。4.3 用可视化找翻车样本跑推理时降低置信度阈值到 0.15专门看低置信度的预测结果能快速定位困难样本。yolo detect predict modelruns/detect/train/weights/best.pt sourceleather_defect/images/test save.txtTrue conf0.15把conf调低会输出大量低置信度预测框。如果某些缺陷在 0.15 的阈值下都检不出来说明模型根本没有学到这个模式这类图值得单独挑出来看一眼多半是标注本身有问题比如边界框框得太随意或者类别标签标错。5. 避坑解压、标注与训练环节的五个高频问题5.1 五个高频翻车记录训练数据集翻车十次里有九次不在算法而在数据本身。这里把我在这个数据集上踩过的几个常见问题列出来每条都是现象、原因、解决三步。1. 现象训练日志里大量图片报 “Found 0 labels”原因图片文件名和标签文件名不匹配。有些人解压后把图片挪到了别处或者批量重命名过导致images和labels两个目录的同名关系被破坏。解决先跑一遍配对检查找出缺失项。for f in images/train/*.jpg; do b$(basename $f .jpg) test -f labels/train/$b.txt || echo missing label: $f done这段命令遍历所有训练图片检查对应的标注文件是否存在缺失的会被打印出来。文件名配对是 YOLO 流程的命根子这个检查应该作为拿到数据集后的例行动作。2. 现象loss 正常下降但 mAP 一直上不去原因标注文件的类别编号和data.yaml里的names顺序错位了最常见的是标注里类别从 1 开始编号而 yaml 默认从 0 开始。解决看一眼标签文件里 class 编号的最大值。如果出现4但 yaml 里nc: 4那说明编号溢出多半是从 1 开始编的需要把所有编号减 1并把 yaml 的names顺序对齐。from pathlib import Path max_cls 0 for p in Path(labels/train).glob(*.txt): for line in p.read_text().splitlines(): max_cls max(max_cls, int(line.split()[0])) print(max class id:, max_cls)3. 现象zip 包明明说明没密码解压时却提示输入密码原因zip 伪加密。有人修改过压缩包头的加密标志位把 general purpose bit flag 的 bit 0 置成 1但实际上数据区并没有真正加密。解决用支持识别伪加密的工具解压。也可以用十六进制编辑器打开 zip 包找到 local file header 中的标志位把加密标志位置回 0。这个操作只针对伪加密的包真正加密的 zip 不能用这个办法绕过密码。4. 现象Windows 解压后文件名乱码原因压缩包内的文件名用 UTF-8 编码但某些老牌解压工具默认按 GBK 解码导致中文路径变成乱码。解决换用支持 UTF-8 的解压工具或者在命令行下执行unzip -O UTF-8强制按 UTF-8 解码文件名。这个坑在 Linux 和 Windows 之间倒腾数据集时特别常见。5. 现象训练一启动就 Out of Memory原因batch16加imgsz640在显存不足的卡上直接溢出。解决先把batch降到 8 跑通再逐步往上加。或者把imgsz降到 512等确认训练流程没问题再升回来。不要一上来就追求大 batch小数据集上 batch 的收益边际很有限。5.2 一条命令自查标注文件是否被截断标注文件如果被不完整地拷贝或者解压中断最后一行可能只有两三个数字训练时会被当成非法标签。用这条命令快速检查所有标注文件的行字段数是否合法。awk -F NF ! 5 {print FILENAME : NR : NF fields} labels/train/*.txtawk按空格切分每一行凡是字段数不等于 5 的行都被打印出来附带文件名和行号。正常情况下没有任何输出一旦有输出就把对应的标签文件重新解压或者替换掉。6. 进阶模型导出与质检台账把检测结果真正用起来训练出来的best.pt只能在调试时用真正做质检预研需要把模型导出成部署格式再写一个把检测结果落成台账的小脚本。yolo export modelruns/detect/train/weights/best.pt formatonnx opset12导出成 ONNX 后可以再转成 TensorRT 或者 OpenVINO 跑在边缘设备上。这一步值得做原因很简单工业现场的检测机器多半不是带大显存显卡的服务器而是一台工控机或边缘盒子ONNX 在 CPU 上跑 OpenVINO 会比 PyTorch 直接推理快不少。推理结果如果要进质检系统通常需要的是结构化记录。把预测结果写成 CSV 台账是我这边的标准动作import csv from pathlib import Path rows [] for result_file in Path(runs/detect/predict/labels).glob(*.txt): img_name result_file.stem for line in result_file.read_text().splitlines(): parts line.split() cls int(parts[0]) conf float(parts[1]) x1, y1, x2, y2 map(float, parts[2:]) rows.append([img_name, cls, round(conf, 3), x1, y1, x2, y2]) with open(quality_log.csv, w, newline) as f: writer csv.writer(f) writer.writerow([image, class_id, conf, x1, y1, x2, y2]) writer.writerows(rows)这个脚本遍历推理输出的标签文件把每张图、每个类、置信度和边界框信息汇总成一张表。后面想做漏检率统计、缺陷分布分析直接用这张表透视就行了。导出和台账都跑通之后整个流程才算闭环。决定把检测结果落成台账之后我再也没有只用results.png判断模型好坏而是每次训练完都强制执行一遍配对检查、导出 ONNX、跑测试集推理、写 CSV 这四个步骤十分钟的例行检查省下的是后面一整天的返工。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

VSCode Markdown编辑器部署全攻略:从个人写作到团队协作 2026/10/1 14:38:05

VSCode Markdown编辑器部署全攻略:从个人写作到团队协作

说实话,我一开始对付Markdown的主力工具并不是VSCode。跟大部分人一样,我最早用的是Typora,后来因为团队协作、多端同步、代码块处理这些现实问题,我把整套写作环境迁到了VSCode上。等真正把这套基于VSCode的Markdown编辑器部署方…

阅读更多 →
GaussDB开发规范实战:从数据库连接到分布式事务的避坑指南 2026/10/1 14:38:05

GaussDB开发规范实战:从数据库连接到分布式事务的避坑指南

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

阅读更多 →
TCP选择响应实战:从select原理到高并发服务端避坑指南 2026/10/1 14:37:58

TCP选择响应实战:从select原理到高并发服务端避坑指南

简介:这份资源是面向计算机网络课程学习者与TCP协议实验实践者的选择响应版本实现包,对应TCP大实验中的可靠传输与选择确认机制,适合正在完成课程设计、准备网络实验答辩或希望深入理解TCP交互流程的学生与开发者。压缩包共24个文件&#xff…

阅读更多 →
Python编码JS解码:ASCILINE跨语言位精确编解码器+DecompressionStream实战指南 2026/10/1 14:37:58

Python编码JS解码:ASCILINE跨语言位精确编解码器+DecompressionStream实战指南

Python编码JS解码:ASCILINE跨语言位精确编解码器DecompressionStream实战指南 【免费下载链接】ASCILINE A high-performance ASCII video rendering engine featuring real-time WebSocket binary streaming and an isolated compiler for serverless static gener…

阅读更多 →
光伏板数据集从LabelImg XML到YOLOv8 TXT格式转换与训练全流程 2026/10/1 14:37:58

光伏板数据集从LabelImg XML到YOLOv8 TXT格式转换与训练全流程

简介:这份光伏板数据集面向从事目标检测与光伏巡检的开发者、学生及研究者,提供可直接用于YOLOv8训练的图像与标注素材,省去从零采集和标注的时间成本。压缩包共377个文件,约66.43MB,包含137张png、120张jpg图片以及12…

阅读更多 →
前端精读周刊:最佳前端 JavaScript 面试题与面试官方法论实战指南 2026/10/1 14:37:58

前端精读周刊:最佳前端 JavaScript 面试题与面试官方法论实战指南

文档技术博客教程 【免费下载链接】weekly 前端精读周刊。帮你理解最前沿、实用的技术。 项目地址: https://gitcode.com/GitHub_Trending/we/weekly 点击查看 免费下载 本文基于 前端精读周刊 第 19 期《精读《最佳前端面试题》及面试官技巧》展开,系统…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉