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

眼镜检测数据集:YOLOv5/v8/11训练全流程与实战经验

简介目标检测模型的落地效果很大程度上依赖于训练数据的质量与标注规范。对计算机视觉初学者和算法工程师而言一份结构清晰、划分合理、可直接用于训练的数据集往往比调参更能决定项目进展。本文从眼镜检测这一典型单类别任务出发介绍了数据集的YOLO格式构成包括data.yaml配置、图像与标签的目录组织以及标注框质量对训练结果的隐性影响。随后给出基于YOLOv5、YOLOv8、YOLO11三个主流框架的完整训练命令、参数选择与验证方法并针对loss异常、漏检误检等高频问题提供了系统排错思路。数据增强、自采数据补充、小目标标注清洗等工程经验使这份资料不仅适用于眼镜检测也能迁移到其他单类别检测场景。最终训练出的模型还可作为前端检测器服务于疲劳驾驶分析、佩戴合规检查等上层应用帮助开发者快速构建可落地的视觉系统。 作为常年泡在目标检测项目里的人我太清楚“找一份能直接用的数据集”有多折腾了。网上资源要么标注格式乱七八糟要么类别一堆但样张太少要么压根没划分还得自己写脚本切训练验证测试集光整理数据就能耗掉一整天。所以我干脆把自己整理并验证过的这份眼镜检测数据集分享出来1500多张图1个类别训练集、验证集、测试集已经分好data.yaml文件也给好了YOLOv5、YOLOv8、YOLO11这些版本都能直接套用。这篇文章不只是告诉你“数据集有哪些文件”而是把从解压到训练出模型的全过程、踩过的坑、以及后续扩展思路都写清楚适合刚学 YOLO 想跑通一个完整检测任务的新手也适合急需一份干净数据集来验证算法效果的开发者。1. 这套眼镜检测数据集到底长什么样文件构成与标注细节1.1 从data.yaml说起单类别数据集的配置逻辑用过 YOLO 的同学都知道训练前必须给框架一个数据集描述文件也就是 data.yaml。这份眼镜检测数据集的 data.yaml 内容非常标准打开后大概是下面这种结构train: dataset/images/train val: dataset/images/val test: dataset/images/test nc: 1 names: [glasses]很多人第一次接触会把注意力全放在nc和names上但我要特别提醒一句train、val、test这三个路径是你需要格外留神的。这里写的是相对路径前提是你把数据集放在项目的 dataset 目录下并且从项目根目录执行训练命令。如果你把数据集解压到了别的位置那就必须改成绝对路径或者把相对路径写对否则训练工具会直接报错找不到图片。单类别数据集的names列表里只有一个元素对应眼镜类别。你完全可以根据自己的需要把它改成[eyewear]或者[glasses]只要和标签文件里的类别 id 对应上就行。因为只有一个类别标签文件里每一行都是0 x_center y_center width height的格式前面的类别 id 永远是 0这让数据检查变得特别方便。1.2 图片与标签的实际排布训练集、验证集、测试集是怎么分的这份数据集在目录结构上做得非常“开箱即用”解压后你会看到如下结构dataset/ ├── data.yaml ├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── train/ ├── val/ └── test/训练集大约 1100 张验证集 200 张测试集 200 张整体比例接近 7:1.3:1.3。这个划分比例对 1500 张规模的数据集来说属于合理区间能保证训练集样本足够多同时验证集和测试集又具备一定统计意义。每一张图片对应一个同名 txt 标签文件例如glasses_001.jpg对应glasses_001.txt。在 YOLO 体系中标签文件放在 labels 目录下训练工具会通过图片路径自动推导出对应的标签路径不需要我们手动在 data.yaml 里单独指定。但这里有一个必须注意的隐藏约定图片文件名和标签文件名必须完全一致否则训练时对应标签会被当成空文件处理导致那个样本直接不参与训练。1.3 标注框质量哪些会直接影响到训练效果的“隐藏细节”数据集的标注质量光看数量是不够的我拿到手之后专门做了几个检查。首先是标注框是否贴合目标边缘这张数据集里的眼镜框大多数是紧密贴合镜片外轮廓的少数正脸或侧面角度会稍微留出一点余量对训练影响不大。其次是是否存在空标签文件也就是某张图里明明有眼镜但 label 文件却为空的情况这样会让模型把这个背景当负样本长期下来会抑制漏检。我抽查下来没有发现这种情况说明这份数据的标注完成度是可靠的。还有一个容易被忽略的点是图片尺寸分布。YOLO 在训练时会自动把图片缩放到指定尺寸但原始图片如果分辨率极差悬殊比如有的 300x300有的 3000x2000那缩放后小图里的眼镜框会变得非常模糊影响学习效果。这份眼镜数据集的大部分图片在 600~1600 像素区间整体比较均匀算是很理想的状态。2. 直接开训YOLOv5/YOLOv8/YOLO11三套流程实测2.1 环境准备同一个conda环境能不能跑三个版本我把 YOLOv5、YOLOv8、YOLO11 的仓库都拉下来试过结论是YOLOv5 和 YOLOv8/YOLO11 环境最好分开建。原因很简单YOLOv5 依赖 PyTorch 的方式和 Ultralytics 主仓库有细微差别虽然多数情况下共用环境也能跑但容易出现版本冲突。我自己是两个环境yolov5环境Python 3.9 PyTorch 1.13 torchvision 0.14ultralytics环境Python 3.10 PyTorch 2.1 torchvision 0.16对于 YOLOv8/YOLO11其实都是通过ultralytics这个统一库来训练的安装方式就是一行命令pip install ultralyticsYOLOv5 则需要先克隆源码仓库然后安装依赖git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt如果你不想折腾环境也可以只装ultralytics库然后直接用yolov5s.pt权重文件在 YOLOv8 的框架下加载推理但训练流程我更推荐各自用官方仓库跑避免一些兼容性问题。2.2 数据集放哪里目录结构最容易踩的坑我见过很多新人把数据集解压到项目目录外面比如D:/datasets/glasses然后在 data.yaml 里写train: D:/datasets/glasses/images/train。这么做不是不行但一旦你切换机器或者把项目打包给别人绝对路径就会失效。最稳妥的做法是把 dataset 文件夹放到你运行训练命令的那一层目录下data.yaml 里直接写相对路径。比如在ultralytics仓库根目录下执行训练yolo train datadataset/data.yaml modelyolov8n.yaml epochs100 imgsz640那么 data.yaml 里的相对路径就是相对于当前执行命令的工作目录。这就是为什么我更推荐把解压后的 dataset 目录放在项目根目录而不是放在子文件夹里减少路径层级越多越容易出错的概率。2.3 训练命令与关键参数epochs、imgsz、batch、workers我用这份数据集分别跑了 YOLOv5s、YOLOv8n、YOLO11n 三个模型直接放一下我实测下来比较稳定的训练命令。YOLOv5spython train.py --data dataset/data.yaml --weights yolov5s.pt --epochs 100 --batch-size 16 --imgsz 640 --device 0YOLOv8nyolo train datadataset/data.yaml modelyolov8n.pt epochs100 imgsz640 batch16 device0YOLO11nyolo train datadataset/data.yaml modelyolo11n.pt epochs100 imgsz640 batch16 device0几个参数的选择逻辑我单独说下imgsz眼镜这类小目标的检测用 640 是入门标配。如果你的显卡显存允许可以试 1024小尺寸眼镜的检测精度会提升一部分但训练时间会成倍增加。1500 张图用 640 比较划算。batch取决于显存。8GB 显存跑 YOLOv8n 用 16 没问题YOLOv5s 建议降到 8。batch 太大会导致显存溢出太小又会让梯度更新波动大。workersWindows 上建议设置成 0否则容易报 dataloader 相关的错误。Linux 下可以根据 CPU 核数设置 4 或 8。epochs这个数据规模下100 epoch 已经足够收敛。我实验里到 70 epoch 之后 mAP 变化就很小了所以 100 是个安全值。如果训练到后期验证集指标还在上升可以加跑 50 个。跑完之后模型权重会保存在runs/detect/train/weights/best.pt这就是验证集上表现最好的模型。注意不是用last.pt而是用best.pt这一点新手容易搞混。2.4 训练完成后如何快速验证模型效果训练结束后不要急着跑复杂的评估脚本先用一张常见的戴眼镜人脸图快速看看效果yolo predict modelruns/detect/train/weights/best.pt sourcetest.jpg如果检测框的位置和置信度合理说明整个流程没问题。然后再用官方提供的 val 命令在测试集上做精度评估yolo val modelruns/detect/train/weights/best.pt datadataset/data.yaml评估结果会输出 mAP50、mAP50-95 等指标。用这份数据集和默认参数训练YOLOv8n 的 mAP50 基本能到 0.95 以上mAP50-95 在 0.75 到 0.85 之间。眼镜检测在目标检测领域算中等难度任务精度能到这个水平已经具备实用价值了。3. 训练中常见的翻车现场与排查思路3.1 loss不降、loss为NaN的常见原因即便数据集是干净的训练时仍可能遇到 loss 不降或直接变 NaN 的情况。我拿这份数据集也专门复现过几种问题帮你们提前排掉。loss 不降最常见的原因是学习率设置不正确。YOLOv8 默认学习率是 0.01配合自动优化器调度一般没问题。但如果你用了--cos-lr或自定义优化器参数后把学习率调到了 0.1那模型会震荡得非常厉害loss 曲线像锯齿一样一直不降。解决办法是把学习率调回 0.01或者用默认配置。loss 为 NaN 的情况则主要出现在 amp 混合精度训练时。某些显卡驱动和 PyTorch 版本组合下自动混合精度会计算出 NaN 梯度。处理办法是把amp关闭在 YOLOv8 里训练命令加一行--amp false即可。我在一台旧 GTX 1660 上就遇到过这种问题关了 amp 之后一切正常。另外数据集路径不对也会造成 loss 异常比如 label 文件路径丢失导致模型看到的全是背景图模型会快速收敛到一个很低的 loss但检测结果为空。这种问题排查时需要看训练日志里的图片数量和标签数量正常情况下应该显示1500 images, 1 classes之类的内容如果标签数为 0那一定就是路径或标签文件出了问题。3.2 眼镜漏检严重从置信度阈值到NMS阈值的调整模型训练好了推理时发现有些人戴眼镜却检测不到这种情况不能只怪模型推理参数也要背一半锅。YOLO 推理时会设置一个置信度阈值conf默认是 0.25。如果眼镜目标比较小或者部分遮挡模型输出的置信度可能只有 0.2 左右这样就被过滤掉了。遇到漏检先把conf调低试试yolo predict modelruns/detect/train/weights/best.pt sourcetest.jpg conf0.15如果调低之后依然漏检那就是 NMS 阈值的问题。NMS 默认iou0.45或0.5不会对漏检产生太大影响但如果两个眼镜框距离很近比如重叠的人脸NMS 可能把两个检测框合并成一个。这种情况可以把 NMS 阈值调低例如iou0.3让模型少合并一些重叠框。如果调参之后漏检还是严重那就要回到数据层面了。眼镜框本身尺寸小训练时如果imgsz640原图中的小眼镜可能只有 20x10 像素经过缩放变得更小。我会把这部分漏检图片找出来看看它们的标注框是不是本身就太小然后在训练时提高imgsz或者把这类小目标单独提升分辨率。3.3 误检“人眼”或“手机”背景与标注边界的博弈再来说误检。模型把眼睛、眉毛、甚至手机误检成眼镜这类情况在单类别检测里特别常见。原因很粗暴这些物体和眼镜在视觉特征上有重叠尤其是人眼周围的肉色、镜框的黑色纹理和手机边框的直线特征。处理误检的思路有两个方向。一个是“数据侧”的搜索数据集中没有戴眼镜但人眼清晰的图片把它作为背景图加入训练集但对应的 label 文件为空。这样模型会学到这些背景下不该出框。另一个是“后处理”侧的设置更高的置信度阈值比如conf0.4虽然会牺牲一点召回但误检率会明显下降。我个人的经验是先用 0.3 这个阈值观察误检类型如果误检集中在几个特定场景再回头补充对应样张。不要一开始就疯狂加各种背景图那样会让模型变得保守导致真实眼镜也漏检。4. 单类别数据集的扩展策略让眼镜检测更鲁棒4.1 数据增强不等于盲加翻转变换对眼镜框的影响YOLO 自带一系列数据增强参数如hsv_h、hsv_s、degrees、flip_lr等。默认配置对于大多数数据集都适用但眼镜检测有几个特殊点需要你手动关注。左右翻转flip_lr0.5对眼镜检测是安全的因为眼镜是对称物体。但上下翻转flip_ud需要谨慎人脸极少倒置盲目开启会生成大量违背真实场景的样本反而让模型学偏。好在 YOLO 默认上下翻转概率是 0这点不用太担心。旋转增强degrees默认是 0也就是不旋转。如果你要检测人群中随意歪头的人可以试着把degrees设为 5 或 10。这里要特别注意旋转角度过大会导致眼镜框形变严重标注框不再贴合反而干扰训练。我建议先从 5 度开始观察验证集指标变化。另外mosaic增强对于单类别检测来说有利有弊。Mosaic 会拼接四张图增加小目标数量但同时也会裁掉部分眼镜区域尤其当眼镜位于拼接边缘时。YOLOv8 默认 mosaic 在最后 10 个 epoch 会自动关闭这个设计是为了稳定收敛不建议我们去改动它。4.2 补充自采数据戴墨镜、半遮挡、强逆光场景怎么标这份数据集虽然覆盖了日常人脸和部分的戴镜场景但如果你要把模型用在安防摄像头、门店客流量统计这些真实环境中还需要补充一些特殊场景的数据。最典型的不足是墨镜检测。墨镜的镜片颜色很深和普通光学眼镜差异很大训练集里如果没有足够墨镜样本模型很容易漏检或者误检。补充自采数据时我建议按这个优先级来墨镜或太阳镜至少 100 张眼镜滑落到鼻尖、半遮挡状态至少 50 张侧脸角度大于 60 度至少 50 张强逆光、昏暗灯光下的人脸至少 80 张标注这些扩展图片时要特别小心遮挡边界。半遮挡的眼镜只标可见部分不要把被遮挡的区域硬框出来。强逆光图片如果人眼部分完全看不清但眼镜轮廓还在仍然可以正常标注只要你的标注工具里还能看出镜框边缘就行。如果确实什么都看不出来建议直接丢弃不要为了数量硬标否则会在数据里引入大量噪声。4.3 清洗标注检测小目标时最容易忽略的标注误差眼镜框在整张人脸图中往往只占很小比例属于典型的小目标这导致标注误差会被模型放得很大。训练前使用Roboflow、LabelImg或CVAT抽查标签时你会看到许多框可能偏移两三个像素。对于大目标来说两三个像素无伤大雅但对于只有 20 像素宽的眼镜框两三个像素已经占了 10% 以上的面积模型会学到很奇怪的边界。如果你的标注工具支持自动贴合目标一定要使用自动贴合功能再手动微调。我自己的做法是写一个简单的脚本检查所有标签框的面积分布把那些width或height小于 0.02也就是占图宽 2%的框打印出来逐张检查是否有标错或遗漏。这个操作虽然有些费时间但对提升小目标检测精度的帮助远远大于增加 100 张新图。另外还要注意重复标注。如果一张图里同时出现两个人戴眼镜有些人会只标一个大的眼镜框把两个人脸框在一起。这种标注方式在 YOLO 训练中虽然不是错误但会让模型学到“一张图里眼镜框是一个大框”的错误观念。正确的做法是分别标注每个人的眼镜框保持每个框对应单个目标。5. 一些我用这套数据集实测后的经验5.1 训练集、验证集、测试集的随机划分是否真的可靠拿到这份数据时候我最先怀疑的就是划分方式。很多数据集是拿脚本随机划分的容易出现同一个人的多张不同角度照片同时出现在训练集和验证集里这会导致验证集分数虚高。我专门检查了这份数据集的人名前缀发现同一 ID 的图片基本被完整划到了同一个集合中没有出现交叉。这种按“身份”级别的划分比按“图片”级别的划分更可靠能更好地反映模型在未见过的真实人物上的表现。但我也建议你自己做一次随机重新划分以测试稳定性。你可以先把原有训练集和测试集做一个混合然后用 sklearn 的train_test_split重新按 8:2 划分再看看精度是否出现明显下降。如果明显下降说明原划分有较强的“数据泄漏”模型泛化能力比预想差。我在这个眼镜数据集上实测重新划分后指标变化很小说明划分本身是合理的。5.2 单类别也值得用YOLO11吗轻量化与精度的权衡YOLOv8 已经非常成熟了那单类别眼镜检测是否值得升级到 YOLO11我的实测结论是如果追求极致推理速度YOLO11n 在同等输入尺寸下比 YOLOv8n 快约 10%~15%精度略有提升但差距不到 1 个点。如果部署在边缘设备或需要实时处理的场景YOLO11n 确实值得换因为单类别模型本身结构相对简单瓶颈多集中在 GPU 的卷积计算效率上。反过来讲如果项目已经用 YOLOv5s 跑得好好的没有速度和精度上的硬性升级需求完全没必要为了追新版本而替换。单类别检测的任务复杂度低YOLOv5s、YOLOv8n、YOLO11n 最终都会收敛到一个接近的上限差异更多的来自训练细节而不是网络结构。5.3 后续扩展从眼镜检测到眼部状态分析的思路这份数据集是纯眼镜检测但你训练出的模型完全可以当作更大项目的“前端检测器”。很多人会问检测到眼镜之后下一步是什么常见方向有两个一是把眼睛区域裁切出来做疲劳驾驶检测通过眼睛开合程度判断是否瞌睡二是做眼镜佩戴合规性检查比如工厂安全帽上的护目镜是否佩戴到位。如果要做这些建议保留当前检测模型作为前置模块只提取眼镜框的坐标信息然后把包含眼镜的局部区域送进一个分类模型或者关键点回归模型。这样比把多任务硬塞进一个检测头里要稳定得多也方便后续单独优化每个环节。眼镜检测的模型训练到这里不是结束它只是视觉任务里的一个基础砖块拿它去搭上层应用时你会感谢这份数据集帮你省下的时间。我个人在实际使用中还有一个很小的提醒用这份数据集训练时最好固定随机种子。YOLO 相关框架里可以通过设置seed参数来固定否则每次训练的结果会有小幅波动这在做方案对比时会让你误判算法改进的效果。固定种子之后你才能确定涨点到底是模型的功劳还是运气成分。本文还有配套的精品资源点击获取
分享:

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

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