手机屏幕缺陷检测实战:1000张图+VOC/COCO/YOLO三格式+YOLO11三平台一键训练

发布时间:2026/10/11 1:04:35
手机屏幕缺陷检测实战:1000张图+VOC/COCO/YOLO三格式+YOLO11三平台一键训练 简介面向手机屏幕表面缺陷检测的实战型数据集资源适合从事工业质检、液晶屏缺陷识别及目标检测算法落地的开发者与研究人员使用。数据集真实采集多品牌手机屏幕图像覆盖苹果、三星、华为等机型标注Bubble气泡/水滴、Scratch划痕、Hole破洞、Knock磕边、Crack裂纹五类缺陷采用labelimg标注同步提供VOC、COCO、YOLO三种格式标签可直接接入YOLO等主流检测框架训练。资源包为1个PDF文件大小约1.28MB内含数据集基本情况介绍与获取方式说明。随附YOLO11一键训练脚本支持GPU、CPU及MacM芯片多平台方案并给出博主训练结果日志供参考。已有726人学习关注可作为手机屏幕缺陷检测项目或通用工业液晶屏缺陷场景的数据补充帮助读者快速搭建训练流程、验证模型效果并对照日志排查问题。1. 手机屏幕缺陷检测1000 张图、三种标签格式、三平台一键训练到底靠不靠谱产线上手机屏幕的缺陷检测长期是个让人头疼的活。划痕、脏污、亮点、暗点、Mura 色斑、边缘崩缺这些缺陷在反光和纯色背景下对比度极低人眼盯久了容易漏检传统阈值算法又几乎没法覆盖所有缺陷形态。于是越来越多团队转向目标检测方案用 YOLO 系列模型把缺陷框出来再分类。但真正动手时第一个卡住大多数人的不是模型而是数据去哪找带标注的手机屏幕缺陷图标注格式能不能直接喂给 YOLO11只有 CPU 或 Mac 的机器能不能跑通训练这个标题给出的方案正好戳中这三个痛点1000 张手机屏幕表面缺陷图配套 VOC、COCO、YOLO 三种格式标签外加支持 GPU、CPU、Mac 三平台的 YOLO11 一键训练脚本。它解决的是从「拿到数据」到「跑出第一个可用模型」之间那段最劝退的路。适合刚入门目标检测、手头没有现成数据集、又想在真实工业缺陷场景里练手的工程师和学生。下面我把这套东西拆开讲清楚数据怎么用、格式怎么转、脚本怎么跑、坑在哪。2. 手机屏幕缺陷数据集1000 张图够不够三种格式怎么选2.1 1000 张图在工业缺陷检测里是什么量级先说结论1000 张图做手机屏幕缺陷检测属于「能跑通、能验证流程、但别指望直接上产线」的量级。目标检测里有个经验值单类别至少 200 到 500 个标注框才能让模型学到稳定特征多类别则要按最稀疏的类别算。手机屏幕缺陷通常分好几类划痕、脏污、亮点、暗点、Mura 各占一部分1000 张图摊下来每类可能只有一两百个框属于偏紧但可用的水平。这个量级最适合做两件事一是验证整套训练流程能不能跑通二是做基线模型后续再靠现场采集扩充。如果你打算直接拿它训练一个上线模型大概率会翻车——工业缺陷的类内差异极大同一种划痕在不同批次屏幕上的形态可能完全不同1000 张很难覆盖。所以我的建议是把它当「起步数据集」先跑通再谈精度。数据集的目录结构常见做法是这样组织的方便后续脚本读取dataset/ ├── images/ # 1000 张原图jpg 或 png ├── annotations/ # VOC 格式 XML 标注 ├── coco/ # COCO 格式 json └── labels/ # YOLO 格式 txt 标注提示拿到数据集先别急着训练用脚本统计一下每类缺陷的框数量类别严重不均衡的话训练时要么加权采样要么先合并相似类别。2.2 VOC、COCO、YOLO 三种格式的差别与选用这三种格式不是随便给的它们对应不同的训练框架和工具链。VOC 格式是 XML一个图一个文件结构直观适合用 labelImg 这类工具继续改标注COCO 格式是单个 json把所有图的标注塞在一起适合用 pycocotools 做评估也是很多论文和预训练权重的标准格式YOLO 格式是每张图一个 txt每行是类别 中心x 中心y 宽 高全部归一化到 0 到 1是 Ultralytics 系 YOLO 训练直接吃的格式。选哪个取决于你要干什么。用 YOLO11 训练直接用 YOLO 格式最省事想用 COCO 预训练权重做迁移或者跑 mAP 评估COCO 格式更方便想用 labelImg 继续补标注VOC 格式最顺手。三种格式都给了意味着你不用自己写转换脚本省掉了一大块容易出错的活。格式文件形态坐标表示典型用途VOC每图一个 XML左上右下绝对像素labelImg 标注、转换源COCO单个 json左上宽高绝对像素pycocotools 评估、迁移学习YOLO每图一个 txt中心宽高归一化YOLO11 直接训练2.3 从 VOC 转 YOLO转换脚本与四个边界坑虽然数据集号称三种格式都有但实际用的时候经常需要自己再转一遍比如你补标了几张图只有 VOC。下面这个脚本把 VOC 的 XML 转成 YOLO 的 txt逻辑说明和参数说明跟在后面。import os import xml.etree.ElementTree as ET # 类别名到索引的映射必须和训练时的 data.yaml 顺序一致 CLASSES [scratch, stain, bright_spot, dark_spot, mura] def voc_to_yolo(xml_dir, out_dir, img_w, img_h): os.makedirs(out_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_file)) root tree.getroot() # 优先从 XML 里读真实尺寸读不到才用传入的默认值 size root.find(size) w int(size.find(width).text) if size is not None else img_w h int(size.find(height).text) if size is not None else img_h lines [] for obj in root.iter(object): name obj.find(name).text if name not in CLASSES: continue # 跳过未定义类别避免索引越界 cls_id CLASSES.index(name) 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 / w cy (ymin ymax) / 2.0 / h bw (xmax - xmin) / w bh (ymax - ymin) / h lines.append(f{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) out_path os.path.join(out_dir, xml_file.replace(.xml, .txt)) with open(out_path, w) as f: f.write(\n.join(lines)) voc_to_yolo(dataset/annotations, dataset/labels, 1080, 2340)这段代码的关键点有三个。第一CLASSES的顺序必须和训练时data.yaml里的names完全一致顺序错了模型学到的类别就是乱的。第二宽高优先从 XML 的size节点读因为手机屏幕图分辨率不统一用固定值会导致归一化坐标偏移。第三if name not in CLASSES这行是后悔药实际数据里经常混进拼写不一致的类别名不跳过就会在index处直接报错。四个边界坑要特别注意坐标越界xmax 超过图宽会导致归一化后大于 1训练时被过滤掉空标注图会生成空 txtYOLO 会当成负样本如果不想这样要单独处理类别名大小写不一致会被当成两个类XML 里size缺失时用默认分辨率会让所有框偏移。转完建议抽查几张用可视化脚本把框画回原图确认。3. YOLO11 一键训练脚本三平台环境怎么配、命令怎么改3.1 GPU、CPU、Mac 三平台的依赖差异一键训练脚本要同时支持三种平台核心差异在 PyTorch 的安装和训练设备的选择上。GPU 平台NVIDIA 显卡装 CUDA 版 PyTorch训练时device0纯 CPU 平台装 CPU 版 PyTorch训练时devicecpu速度会慢一个数量级Mac 平台分两种Intel 芯片走 CPUApple SiliconM 系列可以走 MPS 加速训练时devicemps。Ultralytics 的 YOLO11 对这三种后端都有支持但 MPS 后端在部分算子上还不完整遇到不支持的算子会自动回退到 CPU所以 Mac 上训练速度介于 GPU 和纯 CPU 之间。环境配置的常见做法是用 conda 建独立环境避免和系统 Python 冲突# 建环境Python 版本选 3.10 兼容性最好 conda create -n yolo11 python3.10 -y conda activate yolo11 # GPU 平台装 CUDA 版cu121 对应 CUDA 12.1 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121 # CPU 或 Mac 平台装默认版即可 pip install torch torchvision # 装 ultralytics pip install ultralytics注意GPU 平台的 CUDA 版本要和驱动匹配驱动太旧装 cu121 会报错先用nvidia-smi看驱动支持的 CUDA 上限再选。3.2 一键训练脚本的写法与关键参数一键脚本的本质是把环境检查、数据配置、训练启动串起来让新手不用记一堆命令。下面这个脚本做了三件事自动判断可用设备、生成 data.yaml、启动训练。import os import torch from ultralytics import YOLO # 自动选设备有 CUDA 用 GPUMac 有 MPS 用 MPS否则 CPU def pick_device(): if torch.cuda.is_available(): return 0 if torch.backends.mps.is_available(): return mps return cpu # 生成 data.yaml路径用绝对路径避免找不到 def write_yaml(root): yaml_path os.path.join(root, data.yaml) content fpath: {os.path.abspath(root)} train: images/train val: images/val names: 0: scratch 1: stain 2: bright_spot 3: dark_spot 4: mura with open(yaml_path, w) as f: f.write(content) return yaml_path if __name__ __main__: root dataset yaml_path write_yaml(root) device pick_device() print(f使用设备: {device}) # 加载 YOLO11 预训练权重n 是最小模型适合小数据集 model YOLO(yolo11n.pt) model.train( datayaml_path, epochs100, # 小数据集 100 轮够用多了容易过拟合 imgsz640, # 手机屏幕缺陷小640 是速度和精度的平衡点 batch16, # CPU 或 Mac 上改成 4 或 8避免爆内存 devicedevice, patience20, # 20 轮没提升就早停省时间 projectruns/screen_defect, nameexp1, )参数说明epochs设 100 是因为 1000 张图属于小数据集轮次太多会过拟合配合patience20早停能自动止损。imgsz640是 YOLO 的默认输入尺寸手机屏幕缺陷往往很小如果发现小缺陷漏检严重可以提到 960 或 1280但显存和速度会明显上升。batch在 GPU 上 16 起步CPU 和 Mac 上必须调小否则内存直接爆。device由脚本自动判断省去手动改的麻烦。3.3 训练启动后看什么loss 曲线与 mAP 的读法训练一启动终端会刷一堆指标新手容易看花眼。真正要盯的就三个box_loss、cls_loss和mAP50。box_loss是边界框回归损失反映框得准不准cls_loss是分类损失反映类别分得对不对mAP50是 IoU 阈值 0.5 下的平均精度是衡量整体效果的核心指标。正常情况是前几十轮 loss 快速下降mAP 快速上升之后趋于平缓。如果box_loss一直不降多半是标注框有问题或者学习率太大如果cls_loss降不下去可能是类别不均衡或者类别名映射错了如果mAP50涨到某个值就卡住不动通常是数据量不够或者缺陷本身太难分。训练完在runs/screen_defect/exp1下会有results.csv用 pandas 读出来画曲线最直观。import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/screen_defect/exp1/results.csv) df.columns df.columns.str.strip() # 列名常带空格先清掉 plt.plot(df[epoch], df[metrics/mAP50(B)], labelmAP50) plt.plot(df[epoch], df[train/box_loss], labelbox_loss) plt.legend() plt.savefig(train_curve.png)提示results.csv的列名在不同 ultralytics 版本里略有差异读之前先print(df.columns)确认别硬编码列名。4. 手机屏幕缺陷检测的避坑与排查5 个真实翻车点4.1 现象训练 loss 正常但 mAP 一直是 0原因通常是类别索引对不上。VOC 转 YOLO 时CLASSES的顺序和data.yaml里names的顺序不一致模型学到的类别和评估时的类别错位mAP 自然算不出来。解决方法是把两处的类别列表打印出来逐行对比确保顺序完全一致。这个坑我踩过不止一次属于最隐蔽也最常见的一类。4.2 现象CPU 或 Mac 上训练直接内存溢出原因是batch沿用了 GPU 的默认值。GPU 有独立显存CPU 和 Mac 用的是系统内存同样 batch 下内存占用可能翻好几倍。解决方法是在脚本里根据设备动态设 batchGPU 用 16CPU 和 Mac 用 4 或 8。如果还爆把imgsz从 640 降到 416 也能缓解。4.3 现象小缺陷亮点、暗点几乎全漏检原因是输入分辨率不够。手机屏幕上的亮点暗点可能只有十几个像素缩到 640 后几乎消失。解决方法有两个一是把imgsz提到 960 或 1280二是用切片推理把大图切成小块分别检测再合并。前者简单但吃资源后者复杂但效果好看你的算力选。4.4 现象模型在训练集上很好验证集一塌糊涂原因是过拟合1000 张图对多类别缺陷来说偏少。解决方法是加数据增强YOLO 默认开了翻转和缩放可以再开 mosaic 和 mixup、加早停、减小模型规模用 yolo11n 而不是 yolo11m。如果验证集本身和训练集分布差异大那要先检查数据划分是不是随机的别把同一批屏幕的图全分到一边。4.5 现象Mac 上 MPS 报算子不支持原因是 MPS 后端对部分算子支持不完整。解决方法是设环境变量PYTORCH_ENABLE_MPS_FALLBACK1让不支持的算子自动回退到 CPU。这会拖慢速度但能跑通。如果还是报错直接切devicecpuMac 上 CPU 训练虽然慢但胜在稳定。5. 把 1000 张图用出 3000 张的效果几个进阶技巧数据集小是常态关键是怎么把小数据用出大效果。第一个技巧是离线增强。YOLO 训练时的在线增强每轮都随机变但有些增强比如针对屏幕缺陷的局部对比度拉伸在线做代价高不如离线先生成一批增强图混进训练集。手机屏幕缺陷对亮度变化敏感做亮度抖动和伽马变换的增强收益比几何变换更大。第二个技巧是迁移学习的层次选择。YOLO11 的预训练权重是在 COCO 上训的COCO 里没有屏幕缺陷但底层边缘和纹理特征是可迁移的。常见做法是冻结 backbone 前几层先训 head等 loss 稳定后再解冻全量微调。Ultralytics 里可以用freeze参数控制冻结层数小数据集上冻结一部分往往比全量微调更稳。第三个技巧是验证集要「像」测试集。很多人随便切 20% 当验证集结果验证集 mAP 很高实际用起来一塌糊涂。手机屏幕缺陷的验证集应该覆盖不同批次、不同光照、不同缺陷严重程度的样本最好按屏幕批次划分而不是随机划分这样验证结果才可信。技巧适用场景预期收益离线亮度增强缺陷对比度低小缺陷召回提升明显分层冻结微调数据量小于 2000过拟合减轻mAP 更稳按批次划分验证集多批次屏幕数据验证结果更接近真实最后说个我自己的习惯每次拿到新数据集先不训练花半小时把标注可视化一遍随机抽 30 张把框画出来看。这一步能提前发现八成以上的标注问题——框偏了、类别错了、漏标了全靠肉眼看出来。等训练跑完再回头查浪费的是几个小时甚至一整天的算力。数据质量永远比模型调参重要这个道理在小数据集上尤其明显。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询