拓冰建站拓冰建站
首页 / 资讯中心 / 正文

YOLOv8手机屏幕缺陷检测实战:从数据标注到模型部署全方案

简介面向手机屏幕质检场景的YOLOv8-CM缺陷检测可运行源码包适合算法工程师、制造领域开发者以及有一定基础的目标检测学习者。方案针对划痕、亮点等细小缺陷利用一万张图像的数据集进行训练并通过轻量化MobileNetV3主干、通道注意力CA模块和EIoU损失函数在兼顾移动端速度的同时提升检测精度。压缩包共6个文件涵盖Python主程序、依赖清单、示例图片、模型权重及配置文件整体约19.88MB可直接复现训练与预测完整流程。目前已有147人学习下载。资源内附yolov8s.pt预训练权重和样例屏幕图像便于快速验证效果代码结构清晰可在此基础上二次开发或迁移至其他表面缺陷检测任务。描述中的实验数据显示改进模型在mAP0.5、精确率、召回率和FPS等指标上均有提升是工程落地与技术研读的实用参考。 做工业视觉这几年被问到最多的就是“怎么把一个想法快速跑成能上线的检测模型”。今天借一个特别典型的案例来聊用YOLOv8做手机屏幕缺陷检测而且是一套可运行源码的完整方案。手机屏幕制造过程中经常出现划痕、脏污、暗点、凸起等缺陷人工质检容易疲劳、漏检率高所以很多工厂都在找自动化的视觉检测方案。这个项目恰好覆盖了YOLOv8训练自己的数据集、增量训练、模型部署这几个核心环节适合刚接触深度学习目标检测、又想尝试真实工业场景的开发者。我会把数据准备、参数调整、陷阱和排查经验都写清楚尽量让大家少走弯路。1. 项目定位与核心设计思路1.1 为什么选YOLOv8而不是YOLO11或其他模型很多人一上来就问现在YOLO11都出来了还用YOLOv8是不是过时了我的观点是工业项目求稳定不追新。YOLOv8由Ultralytics推出相比以往版本最大的优势是训练、验证、推理、导出全部集成在一条命令里API设计很友好社区生态成熟网上能搜到的资料和案例非常多。YOLO11虽然更新性能也有提升但部署资料、第三方算子支持、踩坑记录都还比不上v8选它做产线项目风险更高。另外YOLOv8自带在COCO上训练好的预训练权重做手机屏幕缺陷检测这种垂直场景直接用预训练权重做增量训练收敛快、需要的标注数据少。这一点在缺陷样本稀缺的工业场景里非常关键。所以我的建议是新项目先用YOLOv8跑通端到端流程如果后续确实有更高的精度或速度需求再迁移到更新的框架也不迟。1.2 手机屏幕缺陷检测的难点与整体思路屏幕缺陷检测不是单纯“拿模型跑一下”那么简单它的难点其实集中在几个地方。第一是缺陷目标小。一条细划痕可能只占二三十个像素在640分辨率的输入图上非常微弱属于典型的小目标检测问题。普通目标检测模型容易把注意力放在大块区域上对细小特征不敏感。第二是对比度低。屏幕材质反光、纹理复杂缺陷与正常区域灰度差异很小人眼都要仔细看模型更难学。第三是类别不平衡。一个工厂可能一天产几千片屏幕真正有缺陷的只有几十片负样本远多于正样本直接训练很容易导致模型偏向于输出“无缺陷”。因此整体设计思路应该是先收集尽可能接近真实产线环境的缺陷图像做规范标注再利用COCO预训练权重做增量训练缩小数据需求量先用YOLOv8n这种小模型把整个流程跑通再根据指标决定是否升级模型或加改进模块。说白了这个项目里模型调参只占三成数据质量占七成后面我会重点展开数据这块。2. 环境配置与数据集准备2.1 五分钟配好YOLOv8环境环境配置是新手最容易卡住的环节其实套路很固定。我自己用的是Python 3.10 PyTorch 2.0 CUDA 11.8的组合在GTX1660Ti 6GB显存上实测非常稳定。不要一上来就装最新的CUDA版本很多情况下新版的PyTorch对老显卡兼容性反而不好。conda create -n yolo python3.10 -y conda activate yolo pip install ultralytics pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118装完验证一下环境是否正常yolo predict modelyolov8n.pt sourcehttps://ultralytics.com/images/bus.jpg如果能在runs/detect/predict下看到输出结果说明环境已经通了。这里要提醒国内网络下载权重可能会慢可以提前把yolov8n.pt下载到本地再把模型路径指到本地文件。2.2 数据集结构YOLO格式必须这样放YOLOv8训练自己数据集时目录结构有严格约定我通常这样组织datasets/phone_screen/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── screen_defect.yaml每张图片对应一个同名txt文件放在labels/train或labels/val下。txt每一行的格式是class_id x_center y_center width height注意这四个坐标值全部要归一化到0~1之间不是像素坐标。比如一张1280x720的图里某个划痕框的中心点落在(320, 180)宽200高4那行数据就是0 0.25 0.25 0.15625 0.00556。标注工具LabelImg、X-AnyLabeling等通常会自动生成这种格式但你要会检查我见过不少新手因为手动改标注意外改了坐标范围导致训练时“All labels empty”。screen_defect.yaml内容如下path: /absolute/path/to/datasets/phone_screen train: images/train val: images/val names: 0: scratch 1: stain 2: dead_pixel 3: bump建议path写绝对路径避免因为相对路径不一致而找不到图片。2.3 缺陷数据标注的实践细节屏幕缺陷标注是决定模型上限的环节这里有几个实操经验值得分享。第一缺陷人眼看着费力标注时一定要把原图局部放大到200%以上再画框。不要为了赶时间大概框一片区域那会让模型学到一堆背景噪声。第二划痕这类细长目标很多人习惯用一个很大的外接框包住其实这会引入太多背景信息导致训练时正样本不纯。理想做法是沿着划痕的实际区域画紧一点的框哪怕框是长条形的。第三标注类别要克制。能合并的缺陷类型尽量合并比如“点状脏污”和“小颗粒”如果从图像上很难区分就归为一类否则类别之间特征重叠会让模型学迷糊。我们的项目里还试过一个招用传统图像处理做预标注。屏幕缺陷在特定光照下会有边缘特征先用Canny算子或阈值分割把可疑区域找出来生成候选框然后让人工在候选框上确认修正。这样标注效率能提高不少而且比从头框更不容易漏掉小目标。3. 训练自己的数据集从命令到调参3.1 增量训练让模型快速适应新场景增量训练简单说就是在一个已经训练好的模型基础上继续训练。对于手机屏幕缺陷这种样本量可能只有几百张的项目强烈建议这么做。因为COCO预训练权重已经学会了大量的边缘、纹理、形状等底层特征这些特征对屏幕缺陷检测同样有效我们只需要让模型在高层语义上适应“划痕”“脏污”这些新类别就行。训练命令非常简单yolo detect train datascreen_defect.yaml modelyolov8n.pt epochs200 imgsz640 batch8 device0这里的modelyolov8n.pt就是加载COCO预训练权重。如果数据量非常充足想从零开始训练把model参数改成yolov8n.yaml即可。但在缺陷检测这种数据量有限的任务里从零训练往往效果差还慢不建议。3.2 几个关键参数到底怎么调imgsz是输入分辨率。640是速度与精度的平衡点但如果你的缺陷特别小可以试960或1280。代价是显存占用和训练时间成倍上升在GTX1660Ti上yolov8n用1280基本只能把batch降到2训练会非常痛苦。我的做法是先用640跑通漏检严重再考虑提高分辨率。batch要跟显存匹配。GTX1660Ti 6GB显存跑yolov8nimgsz640时batch8大概是极限偶尔会有OOM风险降到4比较稳。epochs不用一开始就设500设个100先看曲线趋势如果val loss还在下降就继续加如果已经停住就提前停。patience可以设20模型连续20轮没有改善会自动停止能省不少时间。3.3 用损失曲线和mAP判断模型是否学到位训练结束后runs/detect/train/目录下会生成results.png包含train/box_loss、train/cls_loss、val/box_loss、val/cls_loss以及mAP50、mAP50-95等曲线。很多人只关心mAP其实我习惯先看loss。正常情况是训练和验证的loss都在下降mAP在上升。如果训练loss下降但验证loss不降反升大概率过拟合了这时候应该停掉训练减少epochs或者加强数据增强。如果loss从头到尾都不怎么动先检查学习率是不是太大再看数据标签是不是有错位。屏幕缺陷检测我们一般只看mAP50因为很多小缺陷区域即使位置偏了一点对人工复检影响也不大。mAP50能到0.85以上基本可以进产线试跑了。如果想在本地复现更精细的曲线可以用训练时保存的results.csv自己画import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/detect/train/results.csv) plt.plot(df[epoch], df[train/box_loss], labeltrain_box_loss) plt.plot(df[epoch], df[val/box_loss], labelval_box_loss) plt.xlabel(epoch) plt.ylabel(loss) plt.legend() plt.show()这里注意results.csv的表头名会根据版本不同略有差异建议先用print(df.columns)确认一下。3.4 训练时最常遇到的四个报错报错现象真正原因解决办法CUDA out of memorybatch或imgsz设置过大减小batch或换yolov8n/s小模型All labels empty标注txt文件为空或路径下没有标签检查labels目录确认图片和txt一一对应FileNotFoundError数据集路径用了中文/相对路径目录名和路径全部改成英文/绝对路径NaN loss学习率过高或标注数据存在异常框降低学习率检查标签坐标是否越界4. YOLOv8网络架构解析与针对缺陷的改进4.1 网络结构里哪些点跟屏幕缺陷检测最相关YOLOv8大致可以分成三块Backbone负责提取特征Neck负责多尺度特征融合Head负责最终预测。Backbone用CSPDarknet结构核心组件是C2f模块它通过跨层连接增强梯度流动让深层网络更容易训练。Neck用的是PAN-FPN把高层语义信息往回传给低层提高小目标检测能力。Head是解耦的分类和回归分开预测整体收敛速度更快。这些结构听起来复杂但对屏幕缺陷检测来说最值得关注的是小目标信息主要保存在浅层高分辨率特征图里。如果缺陷很小模型最终在三个尺度特征图的“小目标检测头”上输出的结果会直接影响召回率。所以你调参时优先关注小目标的类别loss不要只盯着总loss。4.2 小目标弱对比度缺陷可选改进方向如果baseline跑完发现小缺陷漏检严重再考虑改进模型结构不要一上来就改网络。比较有效且社区验证过的改进有三个方向。一是引入多头注意力机制MHSA。在不改变主干整体结构的情况下在Backbone最后一层后面加一个MHSA模块可以增强模型对全局上下文的建模能力。对于低对比度缺陷模型更容易把图像不同位置的信息关联起来从而捕捉到微弱的局部差异。我之前在一个划痕检测项目里只加了一层MHSAmAP50涨了2.3个点。二是替换主干网络为ConvNeXt V2。这种结构在ImageNet上表现很好特征提取能力确实更强但代价是计算量变大、显存占用上升。在GTX1660Ti上如果换ConvNeXt V2输入分辨率要适当降低或者换成参数量更小的变体否则推理速度会腰斩。三是增加一个P2高分辨率检测头。让模型在更高分辨率的特征图上做检测对小目标更友好但训练时间也会变长。如果真要改yaml比如加入MHSA的自定义模块需要在ultralytics/nn/modules.py中注册新层然后在yaml里这样引用backbone: - [-1, 1, Conv, [64, 3, 2]] - [-1, 1, Conv, [128, 3, 2]] - [-1, 3, C2f, [128, True]] - [-1, 1, MHSA, [128]] ...这里的MHSA是占位示例实际你需要按模块的输入输出维度写注册代码不能直接把这段yaml拿去跑。我的建议是先把baseline跑出来再逐项尝试改进每次只动一个变量对比mAP和推理速度。如果多个改进叠加出了问题很难定位是谁导致的。4.3 模型大小怎么选GTX1660Ti的实际体验YOLOv8提供了n/s/m/l/x五个版本。在6GB显存的GTX1660Ti上训练阶段我推荐n或s。yolov8n训练速度快适合频繁迭代yolov8s精度略高但显存和耗时增加明显。实际测试中在小样本缺陷数据集上两者mAP差距不会特别大而推理时间s会比n多30%以上。所以如果产线对实时性要求高优先n不够再考虑s不要直接上m或l。5. 模型部署与实战问题排查5.1 导出模型并在推理脚本里跑起来训练完的best.pt可以直接用于科研验证但工业部署通常要转成ONNX或TensorRT。导出命令yolo export modelbest.pt formatonnx imgsz640 dynamicTruedynamicTrue会让输入尺寸变得灵活但推理速度会略受影响。如果产线固定分辨率建议不设dynamic让图固定尺寸换取更快速度。ONNX推理代码可以这样写import cv2 import numpy as np import onnxruntime as ort session ort.InferenceSession(best.onnx, providers[CUDAExecutionProvider, CPUExecutionProvider]) def preprocess(image, input_size640): h, w image.shape[:2] scale input_size / max(h, w) new_w, new_h int(w * scale), int(h * scale) resized cv2.resize(image, (new_w, new_h)) canvas np.full((input_size, input_size, 3), 114, dtypenp.uint8) canvas[:new_h, :new_w] resized blob canvas.astype(np.float32) / 255.0 blob np.transpose(blob, (2, 0, 1))[None] return blob def detect(image): blob preprocess(image) outputs session.run(None, {session.get_inputs()[0].name: blob}) # outputs需要解码和NMS这里省略具体实现 return outputs这段代码只演示了主干流程真正的NMS后处理需要根据YOLOv8的输出去写也可以直接用ultralytics库自带的predict方法做验证但生产环境通常还是要自己接ONNX Runtime或TensorRT因为不需要每次启动都加载整个PyTorch框架内存占用和启动速度都有明显改善。5.2 部署阶段的几个常见坑第一是ONNX输出的后处理问题。YOLOv8的官方导出默认包含NMS和非极大值抑制的一些处理有些版本导出后输出节点不同新手容易搞混。建议先打印session.get_outputs()看看输出shape再决定怎么解析。第二是输入尺寸不一致。训练用640推理为了“更清晰”改成1280会导致特征分布偏移精度反而下降。除非重新训练否则部署分辨率尽量和训练一致。第三是FP16量化。理论上能提速但对小缺陷检测来说精度损失可能很大如果漏检明显就退回FP32。5.3 实战问题速查表现象定位思路处理方法缺陷漏检多标签漏标、模型不足、阈值太高清洗标签换大模型用F1曲线重新选conf阈值良品误检多数据里背景与缺陷相似增加良品负样本提高conf阈值加针对性数据增强loss不下降学习率太高、数据异常降lr检查标签与图片是否错位清洗异常样本推理速度慢模型大、输入大、未量化换小模型降分辨率用TensorRT/FP16小目标检测不到特征图分辨率不足提高imgsz加P2检测头引入注意力机制6. 一些个人经验与避坑清单6.1 数据质量永远大于模型结构这句话我在多个项目里反复验证过。有一个屏幕缺陷数据集最开始标注很粗糙mAP50卡在0.72后来组织了两批人重新标注清掉了一百多张标签错误或图片模糊的样本什么都没改mAP直接跳到0.83。缺陷检测不是算法竞赛先把数据的“脏”去掉比堆模型模块更有效。6.2 从最小可行方案开始不要一步到位上猛料我见过不少新手一上来就搜“YOLOv8引入多头注意力机制MHSA”“YOLOv8替换主干网络ConvNeXt V2”想把所有改进都塞进模型。结果代码报错都排查了一周还没跑出过一个baseline。正确节奏是用yolov8n把训练流程走通确认loss能降、mAP能动再逐步加改进。每次改动用Git记录跑完一个实验就记录一组结果最后用对比数据说话而不是凭感觉觉得改了就更强。最后分享一个小技巧如果数据量太少训练时在yaml里开启mosaic增强可能会生成很多不自然的拼接图缺陷区域被强行为拼接边界切开模型反而容易学坏。我自己在屏幕缺陷项目里会关掉mosaic或者将mosaic概率调到0.5以下用简单的仿射变换、亮度抖动和噪声增强效果往往更好。这个细节你可以在实验里对比验证一下。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门