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

资讯详情

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

手机屏幕缺陷检测数据集与YOLO11训练实战:1000张图三种标签格式一键跑通

手机屏幕缺陷检测数据集与YOLO11训练实战:1000张图三种标签格式一键跑通 简介这份资源面向从事工业视觉与目标检测的开发者提供手机屏幕表面缺陷检测数据集可用于手机屏幕质检项目也可作为液晶屏等通用工业缺陷场景的数据补充。数据真实采集自苹果、三星、华为等多款机型屏幕标注涵盖气泡/水滴、划痕、破洞、磕边、裂纹五类缺陷采用labelimg标注质量较高。资源包内含1个PDF文件约1.28MBPDF中说明数据集基本情况与获取方式数据集本身托管于百度网盘。标签同时提供VOC、COCO、YOLO三种主流格式可直接投入YOLO等算法训练另附YOLO11一键训练脚本支持GPU、CPU及Mac芯片多平台方案并给出训练结果日志供参考。目前已有725人学习适合需要快速搭建缺陷检测基线、验证模型效果或扩充工业数据集的读者。1. 手机屏幕表面缺陷检测数据集1000 张图、三种标签格式与 YOLO11 一键训练的真实落地路径手机屏幕出厂前的表面缺陷检测是消费电子制造里最典型的视觉质检场景之一。划痕、气泡、脏污、亮点、暗点、崩边这些缺陷尺寸小、对比度低、形态随机靠人眼在产线节拍下盯屏幕漏检和疲劳几乎是必然。很多团队想用目标检测模型替代人工卡住的第一步不是模型结构而是数据去哪找一批带精确标注的手机屏幕缺陷图怎么把标注转成 YOLO11 能直接吃的格式又怎么在只有 CPU 的笔记本、Mac 或者一张消费级 GPU 上把训练跑起来。这个标题对应的正是这样一套组合1000 张手机屏幕表面缺陷图配 VOC、COCO、YOLO 三种格式标签外加一个能在 GPU、CPU、Mac 三平台一键启动的 YOLO11 训练脚本。它解决的是从「有数据」到「模型能跑出第一版权重」之间那段最容易被低估的工程距离。适合做产线质检的算法工程师、带学生做目标检测课题的高校研究者以及手头只有一台 Mac 或普通 PC、想先把流程跑通再谈调优的独立开发者。下面按数据、格式、训练、排错、进阶的顺序把这条路走一遍。2. 手机屏幕缺陷数据集1000 张图里到底有什么为什么这个量级够用2.1 缺陷类别与标注粒度决定了模型上限手机屏幕表面缺陷检测数据集的核心价值不在图片数量而在标注粒度和类别定义是否贴合产线判据。1000 张图如果覆盖了划痕、气泡、脏污、亮点、暗点、崩边这几类主要缺陷并且每类都有足够多的形态变化那么对于 YOLO11 这种单阶段检测器来说已经能训出一个可用的基线。常见做法是每类缺陷至少保证 150 到 250 个实例长尾类别靠数据增强补而不是靠堆无标注的图。标注粒度上缺陷用矩形框还是多边形直接决定后续能不能做面积判级。如果产线只关心「有没有缺陷、在哪」矩形框足够如果要按缺陷面积分等级就得用分割标注再转成检测框。这个数据集给的是检测标注所以定位在「发现并框出缺陷」不做像素级判级。标注工具方面目标检测常用标注工具里 LabelImg 出 VOC XML、Labelme 出 JSON、CVAT 和 Roboflow 可以直出多种格式。这个数据集已经预置了 VOC、COCO、YOLO 三种格式省掉了自己转换的麻烦但理解三种格式的差异仍然必要因为训练脚本吃的是 YOLO 格式而很多公开评测和可视化工具吃的是 COCO 或 VOC。2.2 三种标签格式的字段对照与选用场景VOC、COCO、YOLO 三种格式不是简单的换皮它们的坐标表达、类别组织和文件组织方式都不同。下面这张表把关键差异列清楚后面转换和排错都靠它。维度VOC (XML)COCO (JSON)YOLO (TXT)坐标形式左上右下绝对像素 xmin,ymin,xmax,ymax左上角加宽高的绝对像素 [x,y,w,h]归一化中心点加宽高 cx,cy,w,h类别表达每框内 name 字符串categories 数组加 category_id每行首列 class_id 整数文件组织每图一个 XML全数据集一个 JSON每图一个 TXT与图片同名典型用途传统检测框架、部分评测脚本通用评测、可视化、多任务YOLO 系列训练坐标精度整数像素浮点像素浮点归一化 0 到 1选用逻辑很直接训练 YOLO11 用 YOLO 格式要把结果丢进 COCO 评测或者做可视化对比用 COCO要兼容老代码或某些标注复核流程用 VOC。三种格式同时提供意味着你不用在格式转换上反复试错但转换脚本的边界坑仍然要知道下一章会讲。2.3 数据划分与防泄漏1000 张图不能全部拿来训练。常见做法是按 8:1:1 划分训练、验证、测试也就是 800 训练、100 验证、100 测试。这里有个血泪经验划分必须按「屏幕批次」或「拍摄时段」来分而不是随机打散。同一块屏幕的多次拍摄、同一批次屏幕的相似缺陷如果同时出现在训练集和验证集验证指标会虚高上线就翻车。如果数据集没有提供批次信息退而求其次按图片文件名前缀或拍摄时间做分组划分保证同一组的图只进一个集合。这个细节在 1000 张这种小数据集上尤其致命因为模型很容易记住训练集里的具体缺陷纹理。提示拿到数据集后先做一次类别实例统计确认没有某一类只有个位数实例。长尾类别要么合并要么在训练时用类别权重补偿。3. 从 VOC/COCO/YOLO 到 YOLO11 可训练目录转换脚本与四个边界坑3.1 YOLO11 训练目录的标准结构YOLO11 训练时对目录结构有固定预期图片和标签分开放且标签路径由图片路径推导。标准结构如下dataset/ images/ train/ val/ test/ labels/ train/ val/ test/ data.yamldata.yaml 里写清 train、val、test 的路径和类别名。注意 YOLO 格式的标签文件名必须和图片文件名一致只是扩展名从 .jpg 变成 .txt。如果数据集给的是 VOC 或 COCO需要先转成这个结构。下面给一个把 VOC XML 转成 YOLO TXT 的脚本这是最常见的转换起点。import os import xml.etree.ElementTree as ET # 类别名到 id 的映射顺序必须和 data.yaml 里的 names 一致 classes [scratch, bubble, stain, bright_spot, dark_spot, edge_broken] class_map {name: i for i, name in enumerate(classes)} def voc_to_yolo(xml_path, img_w, img_h, out_txt): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.findall(object): name obj.find(name).text.strip() if name not in class_map: continue # 跳过未定义类别避免训练时报 class id 越界 bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # 归一化中心点和宽高 cx (xmin xmax) / 2.0 / img_w cy (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h # 裁剪到 0 到 1防止越界框导致训练异常 cx, cy min(max(cx, 0), 1), min(max(cy, 0), 1) w, h min(max(w, 0), 1), min(max(h, 0), 1) lines.append(f{class_map[name]} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}) with open(out_txt, w) as f: f.write(\n.join(lines))这段脚本的逻辑是读 XML取每个 object 的类别和框按图片宽高归一化写成 YOLO 的一行一框。参数上classes 列表的顺序就是最终 class_id 的顺序必须和 data.yaml 的 names 完全一致否则模型学到的类别会错位。img_w 和 img_h 必须用图片真实尺寸不能想当然用 1920x1080手机屏幕图的分辨率往往不统一。裁剪到 0 到 1 是后悔药防止个别标注越界导致训练时坐标异常。3.2 COCO 转 YOLO 的坐标陷阱COCO 的 bbox 是 [x, y, w, h]绝对像素左上角起点。转 YOLO 时容易犯的错是把 w、h 当成右下角坐标。正确做法是# coco bbox: [x_min, y_min, width, height] x_min, y_min, bw, bh ann[bbox] cx (x_min bw / 2) / img_w cy (y_min bh / 2) / img_h w bw / img_w h bh / img_h参数说明img_w、img_h 从 COCO 的 images 字段里取不要从文件名猜。COCO 的 category_id 往往不是从 0 连续排列转 YOLO 前要建一个 category_id 到 0 起始连续 id 的映射否则 class_id 会出现空洞YOLO11 读取时可能报错或静默错类。3.3 转换后的自检三个必须跑的校验转换完不要直接开训先跑三个校验。第一统计每个类别的实例数确认没有类别为零。第二随机抽 20 张图用脚本把 YOLO 框画回图片上肉眼看框是否贴合缺陷。第三检查是否有图片没有对应标签文件或者标签文件为空。空标签在 YOLO 里表示负样本如果本意不是负样本就是转换漏了。下面这段校验代码可以直接用import os from collections import Counter label_dir dataset/labels/train counter Counter() empty [] for fn in os.listdir(label_dir): if not fn.endswith(.txt): continue with open(os.path.join(label_dir, fn)) as f: lines [l for l in f.read().splitlines() if l.strip()] if not lines: empty.append(fn) for l in lines: counter[int(l.split()[0])] 1 print(类别实例数:, dict(counter)) print(空标签文件:, empty)逻辑说明遍历标签目录统计每个 class_id 出现次数同时记录空文件。参数上label_dir 换成你的实际路径。如果某个类别实例数明显偏少考虑数据增强或合并类别如果空标签很多检查是不是转换时图片路径和 XML 没对上。3.4 data.yaml 的写法与路径坑data.yaml 是 YOLO11 训练的入口配置写错路径是最常见的翻车点。推荐用绝对路径或相对于训练脚本的路径不要用相对于 data.yaml 的路径因为不同版本对相对路径的解析基准不一致。path: /abs/path/to/dataset train: images/train val: images/val test: images/test names: 0: scratch 1: bubble 2: stain 3: bright_spot 4: dark_spot 5: edge_broken参数说明path 是数据集根目录train、val、test 是相对 path 的子路径。names 的键必须从 0 连续和标签里的 class_id 对应。如果训练时报「Label class x exceeds nc」就是 names 数量和标签里的最大 class_id 不匹配。4. YOLO11 一键训练脚本GPU、CPU、Mac 三平台怎么跑通4.1 环境配置的最小依赖与三平台差异YOLO11 的环境配置在不同平台上差异主要在 PyTorch 的安装方式。GPU 平台装 CUDA 版 torchCPU 平台装 CPU 版Mac 装 MPS 版。常见做法是用 ultralytics 包它会带一部分依赖但 torch 建议单独按平台装。下面给三平台的安装命令。# GPU (CUDA 12.x) 平台 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121 pip install ultralytics # 纯 CPU 平台 pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu pip install ultralytics # Mac (Apple Silicon, MPS) pip install torch torchvision pip install ultralytics参数说明CUDA 版本要和驱动匹配cu121 对应 CUDA 12.1装错会报 no kernel image。Mac 上 torch 默认带 MPS 支持不需要额外 index-url。ultralytics 版本建议固定避免自动升级带来 API 变化。Windows 安装 YOLO11 时路径里的反斜杠和空格是常见坑建议把数据集放在无空格路径下。4.2 一键训练脚本的写法与关键参数所谓一键训练本质是把设备选择、数据配置、超参封装成一个脚本让同一份代码在三种平台上都能跑。下面是一个可复用的训练脚本。import torch from ultralytics import YOLO def pick_device(): if torch.cuda.is_available(): return 0 # 第一张 GPU if torch.backends.mps.is_available(): return mps # Apple Silicon return cpu # 兜底 def train(): device pick_device() model YOLO(yolo11n.pt) # n 版最轻适合先跑通 model.train( datadataset/data.yaml, epochs100, imgsz640, batch16 if device ! cpu else 4, devicedevice, workers4 if device ! cpu else 2, patience20, projectruns/screen_defect, nameyolo11n_baseline, ) if __name__ __main__: train()逻辑说明pick_device 按 CUDA、MPS、CPU 的顺序探测保证同一脚本三平台都能跑。参数上imgsz640 是 YOLO11 的常用输入尺寸手机屏幕缺陷偏小如果显存够可以提到 960 或 1280小目标召回会明显改善。batch 在 CPU 上必须调小否则内存爆掉。patience20 表示 20 轮无提升就早停小数据集上防止过拟合。project 和 name 决定权重保存路径。4.3 三平台实测的耗时与显存边界同一份数据在三种平台上的表现差异很大下面这张表是常见量级的参考具体数值随硬件变化。平台设备单轮耗时约batch 建议备注GPURTX 3060 12G10 到 20 秒16可开 AMP 混合精度GPURTX 40903 到 6 秒32imgsz 可上 1280CPU8 核 16 线程3 到 6 分钟4建议先跑 10 轮验证流程MacM2 Pro40 到 90 秒8MPS 对部分算子支持有限参数说明CPU 上训练 100 轮可能要几小时建议先用 epochs10 跑通全流程确认数据和标签没问题再上完整轮数。Mac 的 MPS 后端在某些 YOLO11 算子上会回退到 CPU速度不稳定如果报 MPS 相关错误直接切 cpu 更稳。GPU 上如果显存不足优先降 batch再降 imgsz不要一上来就改模型结构。4.4 训练启动后的观察点训练开始后重点看三个输出损失曲线、mAP50、mAP50-95。手机屏幕缺陷检测里mAP50 通常能到 0.7 以上算可用mAP50-95 因为小目标定位精度限制往往偏低不要只盯后者。如果训练损失下降但验证 mAP 不涨大概率是过拟合或数据泄漏回到 2.3 检查划分。如果损失震荡剧烈先把 batch 调大或学习率调小。YOLO11 的后处理里置信度阈值和 NMS IoU 阈值对最终检出影响很大训练完在验证集上扫一遍这两个参数比盲目加轮数有效。5. 手机屏幕缺陷检测训练的避坑与排查五条踩坑记录5.1 现象训练报 Label class exceeds nc原因data.yaml 里的 names 数量少于标签文件里出现的最大 class_id。常见于 VOC 转 YOLO 时类别映射表漏了某一类或者 COCO 的 category_id 没重映射成连续 id。解决跑 3.3 的统计脚本看最大 class_id 是多少把 names 补到对应数量并确认每个 id 都有名字。不要靠改标签里的 id 去迁就 names那样会错类。5.2 现象mAP 很高但实际推理漏检严重原因验证集和训练集来自同一批次或同一拍摄条件模型记住了背景纹理而非缺陷特征。1000 张图的小数据集上这种虚高非常普遍。解决按批次或时段重新划分保证验证集里的屏幕和训练集不重叠。如果数据集没有批次信息用图片的 EXIF 拍摄时间或文件名前缀做分组。重新划分后 mAP 可能掉 10 到 20 个点但那个数字才是真实的。5.3 现象CPU 训练到一半内存溢出被 kill原因batch 或 workers 设太大CPU 训练时数据加载和模型计算共享内存workers 过多会成倍占用。解决CPU 平台把 batch 降到 4 或 2workers 降到 2imgsz 从 640 降到 512 先跑通。如果还爆用 cacheFalse 关闭数据缓存。Mac 上同理MPS 虽然用统一内存但大 batch 一样会触发内存压力。5.4 现象小缺陷亮点、暗点几乎检不出原因小目标在 640 输入下经过多次下采样后特征几乎消失YOLO11 的 P3 层对小目标已经吃力。解决优先提高 imgsz 到 960 或 1280这是最直接有效的手段。其次可以在数据增强里减少缩放类增强避免小缺陷被进一步缩小。如果还不行考虑切片推理把大图切成小块分别检测再合并代价是推理变慢。YOLO11 小目标增强模块属于改进方向但在 1000 张这个量级先把输入尺寸和增强策略调对收益比改结构大。5.5 现象Mac 上训练报 MPS backend 相关错误原因YOLO11 的部分算子在 MPS 后端没有实现或者 PyTorch 版本和 MPS 支持不匹配。解决先把 device 切到 cpu 确认流程能跑通再回头排查 MPS。常见做法是升级 PyTorch 到较新版本或者设置环境变量禁用某些融合算子。如果时间紧Mac 上直接用 CPU 训练小轮数做流程验证完整训练放到 GPU 机器上这是最省心的分工。6. 把 1000 张图用透小数据集上的增强策略与验证技巧1000 张图在目标检测里属于小数据集模型很容易过拟合所以增强策略和验证方法比模型选型更关键。我一般会先用 YOLO11n 跑一个基线确认流程通了再决定要不要换更大的模型。增强上手机屏幕缺陷适合用亮度对比度扰动、轻微旋转、高斯噪声和模糊因为这些贴近产线光照和镜头差异。不适合用大幅度的透视变换和水平翻转屏幕缺陷的形态和位置有方向性翻过来就不像真实缺陷了。Mosaic 增强在 YOLO11 里默认开启小数据集上它能显著提升泛化但要注意它会让小缺陷更小如果亮点暗点检不出先把 mosaic 关掉对比一下。验证技巧上除了看 mAP我习惯做两件事。一是按类别分别看 PR 曲线找出哪个类别拖后腿而不是只看总体。二是把验证集的预测结果画出来人工过一遍漏检和误检分类整理成「尺寸太小」「对比度太低」「标注不一致」几类再针对性处理。下面这段代码可以把验证集预测画出来保存方便人工复核。from ultralytics import YOLO model YOLO(runs/screen_defect/yolo11n_baseline/weights/best.pt) results model.predict( sourcedataset/images/val, imgsz960, conf0.25, # 置信度阈值先低一点看召回 iou0.5, # NMS IoU 阈值 saveTrue, # 保存画框后的图 projectruns/vis, nameval_pred, )逻辑说明用训练好的 best.pt 在验证集上推理conf 设低一点是为了看漏检如果低阈值下还漏说明模型确实没学到。iou 控制重叠框合并缺陷密集时适当调高。saveTrue 会把画框结果存到 runs/vis/val_pred人工过一遍比盯数字有用。参数上imgsz 要和训练时一致或更高训练 640 推理 960 通常能提召回但速度会降。还有一个容易被忽略的点标注一致性。1000 张图如果多人标注框的松紧标准可能不统一模型学到的边界会模糊。我一般会抽 50 张图做一次标注复核统一「框到缺陷边缘还是留一点余量」的标准再重新训一版对比。这个动作花不了多少时间但往往比调超参涨点更明显。最后说个习惯每次训练完把 data.yaml、训练命令、关键超参和最终指标记在一个文本文件里和权重放一起。小数据集上实验迭代快没有记录两周后就忘了哪版是怎么来的。这个方案值不值得做取决于你的缺陷类别是否稳定、标注能否持续产出如果产线缺陷类型经常变先把数据闭环建起来比一次训到 0.9 更重要。希望帮到你。本文还有配套的精品资源点击获取
返回列表