眼镜检测数据集:YOLOv5/v8/11训练全流程与实战经验
2026/8/26 10:41:28 网站建设 项目流程

简介:目标检测模型的落地效果,很大程度上依赖于训练数据的质量与标注规范。对计算机视觉初学者和算法工程师而言,一份结构清晰、划分合理、可直接用于训练的数据集,往往比调参更能决定项目进展。本文从眼镜检测这一典型单类别任务出发,介绍了数据集的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']

很多人第一次接触会把注意力全放在ncnames上,但我要特别提醒一句:trainvaltest这三个路径是你需要格外留神的。这里写的是相对路径,前提是你把数据集放在项目的 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.14
  • ultralytics环境:Python 3.10 + PyTorch 2.1 + torchvision 0.16

对于 YOLOv8/YOLO11,其实都是通过ultralytics这个统一库来训练的,安装方式就是一行命令:

pip install ultralytics

YOLOv5 则需要先克隆源码仓库,然后安装依赖:

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 data=dataset/data.yaml model=yolov8n.yaml epochs=100 imgsz=640

那么 data.yaml 里的相对路径就是相对于当前执行命令的工作目录。这就是为什么我更推荐把解压后的 dataset 目录放在项目根目录,而不是放在子文件夹里,减少路径层级越多越容易出错的概率。

2.3 训练命令与关键参数(epochs、imgsz、batch、workers)

我用这份数据集分别跑了 YOLOv5s、YOLOv8n、YOLO11n 三个模型,直接放一下我实测下来比较稳定的训练命令。

YOLOv5s:

python train.py --data dataset/data.yaml --weights yolov5s.pt --epochs 100 --batch-size 16 --imgsz 640 --device 0

YOLOv8n:

yolo train data=dataset/data.yaml model=yolov8n.pt epochs=100 imgsz=640 batch=16 device=0

YOLO11n:

yolo train data=dataset/data.yaml model=yolo11n.pt epochs=100 imgsz=640 batch=16 device=0

几个参数的选择逻辑,我单独说下:

  • imgsz:眼镜这类小目标的检测,用 640 是入门标配。如果你的显卡显存允许,可以试 1024,小尺寸眼镜的检测精度会提升一部分,但训练时间会成倍增加。1500 张图用 640 比较划算。
  • batch:取决于显存。8GB 显存跑 YOLOv8n 用 16 没问题,YOLOv5s 建议降到 8。batch 太大会导致显存溢出,太小又会让梯度更新波动大。
  • workers:Windows 上建议设置成 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 model=runs/detect/train/weights/best.pt source=test.jpg

如果检测框的位置和置信度合理,说明整个流程没问题。然后再用官方提供的 val 命令在测试集上做精度评估:

yolo val model=runs/detect/train/weights/best.pt data=dataset/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 model=runs/detect/train/weights/best.pt source=test.jpg conf=0.15

如果调低之后依然漏检,那就是 NMS 阈值的问题。NMS 默认iou=0.450.5,不会对漏检产生太大影响,但如果两个眼镜框距离很近,比如重叠的人脸,NMS 可能把两个检测框合并成一个。这种情况可以把 NMS 阈值调低,例如iou=0.3,让模型少合并一些重叠框。

如果调参之后漏检还是严重,那就要回到数据层面了。眼镜框本身尺寸小,训练时如果imgsz=640,原图中的小眼镜可能只有 20x10 像素,经过缩放变得更小。我会把这部分漏检图片找出来,看看它们的标注框是不是本身就太小,然后在训练时提高imgsz或者把这类小目标单独提升分辨率。

3.3 误检“人眼”或“手机”:背景与标注边界的博弈

再来说误检。模型把眼睛、眉毛、甚至手机误检成眼镜,这类情况在单类别检测里特别常见。原因很粗暴:这些物体和眼镜在视觉特征上有重叠,尤其是人眼周围的肉色、镜框的黑色纹理和手机边框的直线特征。

处理误检的思路有两个方向。一个是“数据侧”的:搜索数据集中没有戴眼镜但人眼清晰的图片,把它作为背景图加入训练集,但对应的 label 文件为空。这样模型会学到这些背景下不该出框。另一个是“后处理”侧的:设置更高的置信度阈值,比如conf=0.4,虽然会牺牲一点召回,但误检率会明显下降。

我个人的经验是:先用 0.3 这个阈值观察误检类型,如果误检集中在几个特定场景,再回头补充对应样张。不要一开始就疯狂加各种背景图,那样会让模型变得保守,导致真实眼镜也漏检。

4. 单类别数据集的扩展策略:让眼镜检测更鲁棒

4.1 数据增强不等于盲加:翻转变换对眼镜框的影响

YOLO 自带一系列数据增强参数,如hsv_hhsv_sdegreesflip_lr等。默认配置对于大多数数据集都适用,但眼镜检测有几个特殊点需要你手动关注。

左右翻转flip_lr=0.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 清洗标注:检测小目标时最容易忽略的标注误差

眼镜框在整张人脸图中往往只占很小比例,属于典型的小目标,这导致标注误差会被模型放得很大。训练前使用RoboflowLabelImgCVAT抽查标签时,你会看到许多框可能偏移两三个像素。对于大目标来说,两三个像素无伤大雅;但对于只有 20 像素宽的眼镜框,两三个像素已经占了 10% 以上的面积,模型会学到很奇怪的边界。

如果你的标注工具支持自动贴合目标,一定要使用自动贴合功能再手动微调。我自己的做法是写一个简单的脚本检查所有标签框的面积分布,把那些widthheight小于 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参数来固定,否则每次训练的结果会有小幅波动,这在做方案对比时会让你误判算法改进的效果。固定种子之后,你才能确定涨点到底是模型的功劳,还是运气成分。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询