简介YOLO玩手机和人脸区域检测数据集是一份面向目标检测开发者的实战标注数据适合用于课堂行为分析、安防监控等场景下人脸定位与玩手机行为识别。1000多张真实场景jpg图片均经LabelImg精确标注类别为play_phone和face两类分别提供VOC格式xml和YOLO格式txt标签可直接放入YOLOv5、YOLOv8等模型训练。资源共4066个文件其中jpg图片1355张、xml标注1355个、txt标注1356个压缩包仅53.27MB结构清晰便于按目录读取。当前已有1762人学习下载。通过该数据集可快速获得大量带标注的实景样本免去手动标注成本同时可结合配套博文查看检测效果与使用说明适合需要训练玩手机检测模型或做人脸区域识别的开发者和研究者直接复用。 真正开始做“玩手机检测”这个课题时我犯过的第一个错误就是把数据集方案直接定成了“只标手机”。当时想得很简单目标检测嘛模型输出“手机”框不就完事了结果第一次测试就翻车——画面里手机太小、手部遮挡严重、屏幕亮度和环境光混在一起模型要么把水杯当手机要么干脆漏检。硬着头皮迭代了几轮之后我才明白玩手机检测的核心不是在“找手机”而是在“理解人和手机的交互关系”。这时候人脸区域检测的价值就出来了人脸位置能提供人的朝向和注意力上下文手机框结合人脸、人手位置才能判断出“这个人是不是正在低头玩手机”。这篇文章就是基于这个思路的一次完整复盘如何在YOLO框架下整理出一套“玩手机 人脸区域检测”数据集并把它真正训练成可用的检测模型。适合正在做分心行为检测、课堂行为提醒、疲劳驾驶识别或者单纯想自己标注一份目标检测数据集来练手的开发者。内容会覆盖数据采集、标注边界、格式转换、训练参数和实测踩坑尽量把能少走弯路的细节都写出来。1. 这个数据集要解决的不只是“找出手机”很多人一听到“玩手机检测数据集”下意识觉得就是给YOLO喂几千张带“phone”标签的图片。但真正目标检测落地的时候你会发现只标一个手机类别根本不够用。1.1 玩手机检测的本质是“人机交互状态”判断一个人是不是在玩手机其实需要同时满足几个条件人存在、手机存在、手机被人手持或使用、人的注意力大概率在屏幕上。单独输出一个“手机”框模型根本不知道手机是在手上、放在桌面还是揣兜里。如果数据里全部是“手持手机”的正样本模型学到的可能只是“手边有矩形物体”这个低层特征换个场景就失效。所以在这套数据集中我建议至少划分三个基础类别person人体、phone手机、face人脸区域。person 负责提供人和姿态上下文phone 提供目标物face 提供朝向和注意力参考。后面的行为判断比如“这个人是不是在玩手机”可以靠这三个框的空间关系在后处理里算出来而不是强迫检测模型直接输出“playing_phone”这种抽象类别。1.2 人脸区域检测在这里的价值人脸区域检测不是为了让模型去数人脸数量而是为了做人-机空间关系的锚点。一个人如果正在低头看手机他的人脸朝向和手机位置高度相关如果只是拿着手机在打电话脸和手机的位置关系又是另一种模式。在实际项目里人脸区域还会被用来做后续扩展比如人脸关键点、头部姿态估计、注意力方向判断。所以这份数据集里做人脸框标注时不要只标正脸侧脸、低头、戴帽子、戴口罩、逆光、暗光条件下的人脸都要有。否则训练出来的YOLO模型一到真实监控画面里就会被人脸的“稀奇角度”搞懵。1.3 为什么选YOLO做验证YOLO做这类任务的优势很明显一是推理速度快能跑实时视频流二是生态成熟YOLOv8的官方仓库自带训练、验证、导出全套流程数据格式简单改一个yaml就能开跑三是社区案例多遇到问题搜索一下基本都是现成答案。在验证数据集质量这个阶段用YOLO训练一轮的成本极低几个小时后就能从指标和可视化结果里发现问题。2. 数据采集与预处理先从“能出结果”的图池子开始数据集的质量上限取决于采集阶段的多样性。很多新手一上来就找公开数据集拼凑结果图片全是网红自拍视角模型一部署到监控视角就废。我的建议是如果条件允许自己构造一个混合图池子宁可数量少一点也要保证场景跨度够大。2.1 场景清单怎么定玩手机检测最典型的三类部署视角监控俯视/斜俯视视角教室、办公室、会议室、机房人坐在工位或课桌前手机在桌面以下区域被手拿着脸部部分被遮挡平视/近景视角手机前置摄像头、考勤机、闸机、自助终端人脸处于画面中心玩手机时头部下垂车内视角驾驶员手持手机侧脸和手机在方向盘附近光线变化剧烈。这三类视角在标注时要分开建目录管理不要混在一起乱标。每类视角建议至少准备600到1000张底图底图里保证同一张图有1到5个目标对象。如果实在没条件拍摄公开数据集中找素材也可以但一定要按视角分类筛过一遍剔除掉那些构图太单一、目标太居中、清晰度不合适的图片。2.2 图片清洗与基础筛图我的做法是先写一个批量脚本把图片统一成JPG格式长边缩放到1920以内避免超大图在标注工具里卡顿。然后做一轮人工快筛删掉三类废图严重模糊图。如果图片整体的模糊是因为运动模糊而这类模糊本身就是你需要模型抗住的真实场景可以保留一小部分但不要超过总量的5%重复图。同一段时间内的连拍非常相似感知哈希去重后只留一张多目标太密集的图。一张图里塞了十几个手机只会让标注者崩溃而且模型学到的往往是“密集环境下的小目标”这个特定模式对稀疏场景帮助不大。处理完之后把所有图片按场景分目录命名统一成类似scene_lx_axis_001.jpg的方式。这个习惯会帮你在后面写划分脚本时省下大量时间。2.3 测试集中要混入“负样本”和“困难样本”很多做目标检测的人都忽略负样本的重要性。如果所有图里都有手机YOLO会倾向于把任何类手机形状的物体都当成手机。我在测试集里专门放了三类负样本桌面上放着手机但没人碰的图人拿着书本、平板、计算器在看的图完全没有手机但画面里有大量矩形物体键盘、屏幕、画框的图。这些图在训练集里也应该混入一小部分并且不需要标注任何目标生成一个空标签即可。这样模型才能真正学会“看到物体后判断它是不是手机”而不是“看到矩形就兴奋”。3. 标注规范三类框的边界是最容易吵起来的地方标注规范是数据集的核心资产。规范写得好多个标注员标出来的结果才不至于互相打架。我在这套数据集里把规范细成了三类框并且针对“玩手机”这个具体动作做了单独说明。3.1 person、phone、face 各自的边界person框框住人体可见区域头、肩、躯干、手都算在内。如果人只露出上半身就只框上半身。不要为了所谓的“标准”去脑补被遮挡的部分。phone框框住手机可见的机身或屏幕形成的矩形。如果手机只露出一角或者被手遮住超过一半我选择不标phone框因为强行框一个严重遮挡的目标只会给训练增加噪声。face框框住人脸可见的皮肤区域也就是额头发际线到下巴、左耳到右耳的可视范围。侧脸只框可见侧脸低头时露出的是头顶这种我不标face因为YOLO学不到“头顶”这种人脸特征。一个容易踩的坑不要把“头”标成“脸”。如果你戴帽子低头画面里能看到整个后脑勺和帽檐这属于head不属于face。如果数据集里没有head这个类别这种目标就直接放弃标注对模型没坏处。3.2 “玩手机”和“拿手机”怎么区分这是我在标注过程中遇到的最大分歧。刚开始标注员把所有手持手机的图都标成“玩手机”结果模型在人打电话、拿手机导航时也报警。后来我换了个思路数据集里不直接定义“玩手机”这个类别而是把 phone 标出来再单独记录一个状态属性。每个phone框最终会带一个using布尔标记持握手机并且手指有滑动、点击动作或眼睛明显朝向屏幕就算using只是拿着手机举在耳边、插在口袋里只露出一角就算not using。训练时模型输出的只是phone框真正判断“正在玩手机”的逻辑放在后处理phone框 person框距离约束 人脸朝向约束。这样做的好处是把“目标检测”和“状态分类”解耦模型只做自己擅长的事状态判断交给规则或另一个轻量分类器。实测下来误报率明显下降。3.3 遮挡和模糊边缘的处理原则标注的时候经常会碰到“手机只露出一半但能看出是手机”的情况。我的原则是露出面积超过50%且能明确判断是手机就标否则不标。人脸也一样能明确看到半边脸就框半边只露出耳朵和头发就不标。模糊目标如果模糊程度严重到人眼都认不出人工标注出来的框也没有参考意义。这里额外提一个技巧标注工具强烈建议用支持半自动分割追踪的X-AnyLabeling或者LabelImg。视频帧序列如果连续上一帧的框可以直接复制到下一帧微调能省大量时间。所有标注结果先导出成JSON或XML再做格式转换不要人工去改txt手写坐标出错的概率太高。4. 转换成YOLO格式一个脚本解决坐标归一化YOLO的标注格式很简单每个txt文件对应一张图每行是class_id x_center y_center width height坐标都归一化到0到1之间width和height也是归一化后的宽高值。这个格式最大的坑在于如果原坐标是像素值忘记除以图片宽高模型会直接训飞。4.1 JSON或XML转YOLO txt的参考脚本我用LabelImg导出的是Pascal VOC XML用X-AnyLabeling导出的是JSON。无论哪种转换逻辑都是同一套import os from PIL import Image def convert_bbox_to_yolo(x_min, y_min, x_max, y_max, img_w, img_h): x_center (x_min x_max) / 2 / img_w y_center (y_min y_max) / 2 / img_h box_w (x_max - x_min) / img_w box_h (y_max - y_min) / img_h return round(x_center, 6), round(y_center, 6), round(box_w, 6), round(box_h, 6) # 遍历标注文件逐行写入txt # 注意txt文件名必须与图片文件名一致extension改为.txt有个细节要特别提醒如果一张图里没有任何目标也要写一个空txt文件而不是跳过。否则YOLO训练脚本在读取图片时找不到对应标签有时会直接报错有时会把这张图静默跳过导致数据量和预期不一致。4.2 数据划分与 data.yaml划分比例我用的是 8 : 1 : 1即80%训练、10%验证、10%测试。划分时一定要按场景维度切分不要让同一场景的图片同时出现在训练集和测试集里。否则测试指标虚高换到真实场景直接露馅。目录结构大概这样datasets/phone_face_dataset/ ├── train/ │ ├── images/ │ └── labels/ ├── val/ │ ├── images/ │ └── labels/ └── test/ ├── images/ └── labels/data.yaml 内容如下train: datasets/phone_face_dataset/train/images val: datasets/phone_face_dataset/val/images test: datasets/phone_face_dataset/test/images nc: 3 names: [person, phone, face]然后直接用命令开训yolo detect train datadata.yaml modelyolov8s.pt epochs150 imgsz960 batch16 patience20这里我刻意用了imgsz960而不是默认的640原因在下一节说。如果你用的是NVIDIA显卡但显存不够把batch降到8或4也能跑。AMD显卡在这类任务上也能跑就是环境配置路径不太一样但如果你只是验证数据集质量我更建议先用Colab或云端环境把精力花在数据本身。4.3 先训小轮次检查标注质量正式大规模训练前我会先跑一个20轮的快速验证只看两类结果指标验证集损失曲线是否正常下降随机抽几张验证集图片看YOLO可视化出来的预测框是否和标注位置基本一致。如果预测框在正确位置但类别混乱说明标注类别有交叉如果框的位置僵在原处不跟目标走说明标签坐标转换大概率出了bug。这一步能帮你提前发现90%的数据集低级问题别一上来就跑100轮。5. 训练实战小目标、遮挡和误检的应对这套数据集真正难处理的问题发生在训练跑通之后。我总结了三个高频坑和对应的解决办法都是实测里摸出来的。5.1 手机框太小导致漏检在俯视监控画面里一部手机可能只有20x40像素而整张图是1280x720。YOLOv8在640输入下会把小目标压缩到十几个像素特征几乎完全丢失。这也是我建议用imgsz960甚至1280的原因输入分辨率越大小目标的像素占比越高检测效果提升非常明显。代价是显存占用跟着涨。我最常用的组合是yolov8s imgsz960 batch16在12GB显存上勉强跑得动。如果你显存只有8GB可以换成yolov8n或者把batch降到4但效果会打折扣。5.2 人脸和手机的形状太像人脸和手机在低分辨率下都是“小矩形肤色/亮色纹理”YOLO偶尔会把脸当手机把手机当脸。这种情况最有效的解药是在数据里增加“人脸和手机同框”的样本比例让模型学会利用两者的空间关系。比如一个人举着手机自拍画面里同时有脸和手机一个人低着头看手机侧脸轮廓和屏幕同时可见。模型只要见过足够多这种组合天然不会把它们搞混。5.3 书本、键盘、平板造成的误报手机最像的干扰物是书本、平板电脑和键盘。一开始我没有收集这类负样本结果模型在办公桌上疯狂报警。后来我在负样本图里专门拍了大量“人手放在键盘上”“人手翻书”“平板立在桌上”的场景重新训练后误报明显减少。如果你介入不了采集场景退一步的办法是在后处理里加规则手机框必须和person框有交集且手机框中心落在person框下半部分才触发“玩手机”告警。这个规则虽然简单但能过滤掉大量桌面孤立物体的误检。5.4 用混淆矩阵和错误样本迭代数据我每轮训练完都会看验证集的混淆矩阵重点看phone和face之间的串类比例。如果串类超过5%就别急着调模型超参先回去补数据。YOLO架构本身对小目标已经比较友好真正限制效果上限的往往是数据本身。这类迭代做三轮之后模型性能基本能稳定在可接受范围。6. 进一步扩展从单帧检测到行为判断数据集和模型跑通后我实际部署时又做了一层扩展这里分享给你参考。单帧YOLO检测结果在视频流里会存在偶发抖动一帧报警、下一帧正常、再下一帧又报警。解决办法是给每个目标加上跟踪ID比如接一个ByteTrack对连续十帧的using状态做投票。连续多帧都满足交互条件才输出“正在玩手机”的事件。这个后处理逻辑能把误报率再压低一个量级。另外人脸区域检测框还可以继续喂给姿态估计模型比如做人脸关键点检测判断头的俯仰角。一个人连续几秒低头且手机框稳定在手部区域判定为玩手机事件就会非常可靠。这套数据集如果往后继续做我最推荐的扩展方向是按光线条件补充数据强逆光、屏幕高亮、夜间暗光、屏幕蓝光反射到人脸上这些边界条件对玩手机检测的现场表现影响极大。数据不需要一次到位按场景持续补充YOLO模型会越用越顺手。本文还有配套的精品资源点击获取