资讯动态

基于YOLOv5的玩手机检测实战:数据集、训练调参与部署

发布时间:2026/9/8 15:57:03 来源:尧图企业网站定制
简介YOLOv5玩手机检测模型与近万张真实场景标注数据打包在一起面向需要快速落地该类行为识别的人工智能开发者与安防、课堂管理等应用场景提供可直接推理的权重和用于训练验证的完整数据。模型内置yolov5s-phone.pt与yolov5n-phone.pt两种规格平均精度可达90%以上数据集图片为jpg格式同时提供VOC与YOLO两类标签按文件夹分好类别统一为phone场景丰富适合直接接入YOLOv5-6.0流程训练或微调。资源包共163个文件以Python脚本、yaml/yml配置、jpg/png图像、pt权重、csv训练记录为主脚本负责训练与推理配置项声明数据路径和模型参数csv文件记录训练指标另附交互式示例与工程化配置压缩包整体321MB目录结构清晰。目前已有1290人学习/下载适合目标检测初学者参考数据组织方式也适合有基础者直接使用模型完成识别项目或扩展自己的数据集。 先回答一个被问过很多次的问题玩手机检测能不能用YOLOv5做能而且这是当前落地性价比最高的方案之一。yolov5-6.0-phone-1022.zip这套资源包含一万张带标注的手机检测图片专门用来训练“人正在使用手机”这个目标。为了让不同阶段的读者都能直接上手我会按“数据集长什么样、环境怎么搭、训练怎么跑、效果怎么调、模型怎么部署”这条线完整讲一遍中间穿插我在实际复跑时踩过的坑和验证过的参数。如果你正卡在毕设选型、工地或考场行为分析项目、或者只是想自己训练一个能用的目标检测模型这份资源都能省掉大量整理数据的时间。文件名里的1022没必要过度解读就是资源整理时的版本编号和类别数、网络结构没什么关系。1. 玩手机检测的需求拆解这不是普通的目标检测任务1.1 典型落地场景和需求共性玩手机检测最常见的地方我接触到的集中在四类。工地和矿区的安全监控工人站在脚手架、运行设备旁边低头看手机是非常典型的高危行为这类项目往往要求摄像头自动抓拍并推送给安全员。第二类是驾驶员状态监测公交车、货运车辆、地铁司机在驾驶过程中手持手机打电话或刷消息交管和企业安全部门需要系统自动识别。第三类是课堂和考场纪律管理学生低头玩手机的频率比想象中高很多但这类项目预算相对有限对实时性要求也没那么极致。第四类是工厂产线和办公室管理员工在工位上长时间刷手机影响效率和良率需要软性提醒。这些场景有一个共同点摄像头视角固定而且大多是从上往下或斜向俯拍。人离镜头有一定距离手机在画面里往往只占几十个像素。如果采集的数据和现场视角差异太大模型精度会断崖式下降。这也是为什么我一直强调拿到现成数据集后最好能补拍一小批现场图片做微调而不是直接拿去上线。1.2 COCO通用模型为什么不够用很多人第一反应是“YOLOv5自带COCO预训练权重COCO里本来就有cell phone这个类直接用不就行了”我一开始也这么想但实际跑下来发现差距很大。COCO数据集确实标注了手机但它标注的是“图像中有一个手机”并不会标注“这个人正在使用手机这个行为”。监控画面里手机可能握在手里、插在口袋里、放在桌上模型都能检测出来可业务方要的是“有没有人在玩手机”这个语义COCO给不了。另一个问题是目标尺寸。COCO里的手机目标普遍偏大而监控画面里的手机是典型的小目标直接拿预训练权重推理漏检非常严重。就算你退一步同时检测person和cell phone再用IoU判断人和手机是否重合也会遇到一堆边界情况手机和人的检测框边缘略微相交算不算玩手机手机握在手里但人没看屏幕算不算这类逻辑写起来又臭又长效果还不稳定。所以更务实的路线是把“玩手机”这件事直接定义成检测目标。数据集只标注一个phone类标注框覆盖人手持手机、低头看手机、手机贴耳打电话这些状态。模型学习到的是“人在使用手机”这个复合语义后处理只需判断检测框数量和置信度业务逻辑立刻变简单了。2. phone-1022数据集解析一万张图像如何喂给YOLOv52.1 解压后的目录结构与YOLO标注格式拿到压缩包后先别急着训练建议把目录结构摸清楚。这套数据集按YOLOv5 6.0的工程习惯整理解压后是这样一个骨架yolov5-6.0-phone-1022/ ├── datasets/ │ └── phone-1022/ │ ├── images/ │ │ ├── train/ # 8000张 │ │ ├── val/ # 1500张 │ │ └── test/ # 500张 │ └── labels/ │ ├── train/ │ ├── val/ │ └── test/ ├── data/ │ └── phone.yaml └── README.txtimages目录下是jpg图片labels目录下是相同文件名的txt标注文件。每个txt的一行对应一个目标框格式是class x_center y_center width height五个值都用图片宽高做了归一化取值在0到1之间。比如某一行是0 0.582031 0.472656 0.078125 0.205469意思就是类别0phone框中心点在相对坐标(0.582, 0.473)处宽约占整图7.8%高约占20.5%。整个数据集只有一个类别类别名就叫phone。这种单类设计对训练来说最省心不用考虑类别不平衡也基本不会出现类别混淆问题。如果你后续想区分“手持手机”和“正在看手机”两种状态那就需要重新标一套双类数据我这里不展开。2.2 数据划分、来源构成与质量检查一张图里可能同时出现多个人玩手机所以标注框数量不是等于图片数而是远多于一万个。数据来源大致有三部分公开数据集里和手机使用相关的图像筛选、模拟场景拍摄、还有一部分是公开网络图片清洗后保留下来的。整个库已经做过去重和低质量过滤但我不建议直接相信任何数据集训练前花十分钟做一次体检很有必要。检查脚本可以写得很简单from pathlib import Path label_dir Path(datasets/phone-1022/labels/train) empty_files [] bad_lines [] for f in label_dir.glob(*.txt): lines [line for line in f.read_text().strip().splitlines() if line] if not lines: empty_files.append(f.name) continue for line in lines: parts line.split() if len(parts) ! 5: bad_lines.append((f.name, line)) continue cls, x, y, w, h map(float, parts) if not (0 x 1 and 0 y 1 and 0 w 1 and 0 h 1): bad_lines.append((f.name, line))跑完后重点看两类结果空标注文件数和坐标越界行数。空文件说明这张图没有任何手机目标留着当负样本可以但数量别太多坐标越界通常是标注工具导出问题会导致训练时loss异常。我拿到这套数据后检查过一遍没有发现明显越界空标注也很少整体质量对训练来说是够用的。另外建议抽几十张图用opencv把标注框画出来肉眼过一遍。重点看不低于640分辨率的画面里小手机目标的标注是否贴边。YOLO格式的框如果标得过大把人的手和袖子整个包进去了模型学到的特征就会有偏差。这种问题脚本很难查只能靠目检。3. 从环境搭建到训练跑通YOLOv5 6.0实操全过程3.1 环境版本与依赖安装YOLOv5 6.0对PyTorch版本没有特别苛刻的要求我建议Python 3.8或3.9PyTorch 1.8以上CUDA 11.x这套组合最稳。装环境时不要手动一个个pip包去装直接拉官方仓库再装requirements.txt就行。git clone -b v6.0 https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt如果你用GPU训练先确认PyTorch版本和CUDA驱动匹配。有一个细节很多人忽略如果电脑上装了多个CUDA版本PyTorch的CUDA Runtime和驱动不一致训练时会出现“CUDA unavailable”。这时先用python -c import torch; print(torch.cuda.is_available())验证一下再往下走。显存不够的话也能用CPU训练但一万张图片跑100轮会非常慢不推荐。预训练权重我放在项目根目录的weights文件夹下yolov5s.pt是首选。6.0版的权重版本号和仓库分支要对应如果你用的是master分支却拿了旧权重运气好可能报错运气不好会静默训练出奇怪的结果。3.2 数据集配置与训练命令把解压出来的datasets目录放进yolov5项目根目录然后编辑data/phone.yaml内容如下train: datasets/phone-1022/images/train val: datasets/phone-1022/images/val test: datasets/phone-1022/images/test nc: 1 names: [phone]这里最容易出错的是路径。YOLOv5里data.yaml的路径是相对于项目根目录的不是相对于yaml文件所在目录。如果路径写错训练时会出现“AssertionError: train: No labels in ...”第一反应先检查路径别急着调模型参数。另外labels目录不需要写进yamlYOLOv5会自己根据images路径去找同级labels目录所以images和labels两个父目录名字必须一致比如images/train对应labels/train这个对应关系错了训练会直接跳过所有图片。训练命令我实际跑通的是这一条python train.py --data data/phone.yaml --weights weights/yolov5s.pt --img 640 --batch 16 --epochs 100 --device 0--img 640是指输入图像短边缩放到640手机属于小目标不建议再往下调到320否则细节损失会非常明显。batch 16在12GB显存左右能跑如果你的卡只有8GB把batch降到8同时观察GPU利用率。训练过程中会生成很多中间日志不用频繁盯着终端关键看runs/train/exp目录下的results.png和每轮结束输出的指标表。3.3 首次训练如何判断是否正常跑起来后第一个要确认的是有没有真的在读数据。终端会出现train和val的进度条如果进度条走得极快很可能数据集路径配错、模型实际上在空跑。正常情况下一万张图、batch 16一个epoch应该是几百个step时间以分钟计。第二个要看的是loss曲线。前几个epoch的box_loss和obj_loss会有波动但整体趋势必须向下。mAP在前几个epoch为0很正常因为这时候模型还在学基础特征到后面会突然跳上去。用COCO预训练权重做迁移学习一般到30到50轮就能看到mAP0.5冲到0.85以上如果训练结束还在0.5附近打转那就是特征没学好需要回到参数调整那一步。训练结束后best.pt保存在runs/train/exp/weights下评价指标里重点看mAP0.5。对单类手机检测来说一个合理目标是mAP0.5达到0.9以上mAP0.5:0.95至少0.6以上。低于这个水平实际用起来漏检会很频繁。4. 损失不降、mAP上不去训练调优与问题复盘4.1 从yolov5s到yolov5l分辨率、批大小与精度的权衡我习惯先用yolov5s做基准跑通全流程后再决定要不要上大模型。yolov5s推理快、显存占用低适合快速验证数据和参数设置有没有问题。如果你发现精度差一口气优先换yolov5m而不是直接跳到l。大模型的精度收益在小目标场景下没有想象中明显但推理耗时和显存占用会成倍增加工期紧张时很不划算。输入分辨率是另一个更值得调的参数。手机目标小640分辨率下可能只占十几个像素特征很弱。显存足够的前提下试试--img 1280 --batch 8重新训练一个短周期对比验证集mAP。我用类似数据集做过对比从640升到1280mAP0.5能提升3到5个百分点但训练时间大约是原来的三倍。如果只是做毕设演示640足够如果是真正部署到摄像头端建议根据现场图像的手机像素尺寸决定是否升级。批大小对训练稳定性的影响比很多人以为的要小。同一个数据集batch 8和batch 16最终mAP差距通常不到1个点。但batch太小会带来BN统计不稳定导致训练震荡。我的经验是不管显存多大batch不要低于8能上16就上16。4.2 超参数与数据增强的实际影响YOLOv5 6.0默认使用hyp.scratch-low.yaml里面mosaic、随机仿射、HSV扰动都是开着的对一万张规模的数据集来说数据增强足够一般不需要自己造轮子。默认设置下模型就能学到比较鲁棒的特征但是有一个参数值得手动调一调。anchors也就是锚框。YOLOv5在训练前会自动计算训练集的anchor尺寸这一步正常不需要干预。但手机目标的尺寸分布和COCO差异很大如果自动计算的anchor结果不理想可以关闭自动重算用k-means在训练集上手动聚类出更适合小目标的anchor尺寸。具体做法是保留模型配置里的原始anchor但把--noautoanchor加上然后再观察。这个操作在训练数据集中目标大小两极分化时很有用手机检测这个场景下我建议做一次对比实验。另外一个容易踩坑的是学习率。默认lr0是0.01如果训练过程中loss出现大幅震荡或者前几轮就变成nan大概率是学习率过高尤其当你换了大模型、大batch之后。把训练命令里加上--cos-lr可以缓解后期波动或者把hyp文件里的lr0改成0.005再跑。先排除学习率问题再考虑是不是数据问题。4.3 常见训练异常的排查链我把实际过程中遇到过的异常整理成一个排查表按出现频率排下来现象最常见原因第一步检查训练开始即报“No labels in...”data.yaml路径错误或images/labels目录不对应检查train路径确认同名txt是否在labels目录loss稳步不降学习率过低/数据集路径正确但标注内容为空检查空标注文件占比调高lr0loss为nan学习率过高/梯度爆炸/存在损坏图片降低lr删掉损坏jpg加--cos-lr训练正常但mAP为0标签类别索引与names不一致确认txt第一列是0并且nc1mAP上不去且过拟合数据增强太少/训练集和验证集分布不一致检查验证集是否混入了训练集图片验证集效果差但训练集很好过拟合增加数据增强加大训练集用更强的预训练模型还有一个我特别想提醒的点检查数据集是否“泄漏”。train和val目录里的图片如果存在重复模型会把图片记住val指标虚高部署到新场景直接现原形。第一次跑通后可以随机抽几张val图片用best.pt检测看看实际效果和mAP是否匹配。数据泄漏的问题在现成数据集里比想象中常见我拿到每个数据集都会做一遍重复图片筛查。5. 从模型到业务推理部署与真实场景的踩坑点5.1 用detect.py快速验证模型效果训练完先别急着写业务代码用官方detect脚本做一次直观验证python detect.py --weights runs/train/exp/weights/best.pt --source datasets/phone-1022/images/val --conf 0.25--conf 0.25是检测置信度阈值。对手机检测这种小目标任务我建议阈值不要设太高0.25左右比0.5实用。原因很简单手机目标小、能被模型捕获到的特征少模型预测时天然会比大目标“犹豫”把阈值调到0.5以上会漏掉大量真实目标。宁可在后处理阶段加规则过滤也不要一开始就框得太死。detect.py的输出图片会把检测框画出来我每次都会挑一批不同光线和视角的图片看视觉结果。重点关注三类错误把圆形的表盘、反光水杯误检成手机人手里拿着手机但没亮屏的场景有没有漏检多人同时出现的画面里后排小目标手机是否被遗漏。这三类是手机检测最常见的失败模式。5.2 导出ONNX并部署到边缘设备验证没问题后把模型导出成部署格式。最常见的是ONNX跨平台兼容性好CPU和GPU都能跑python export.py --weights runs/train/exp/weights/best.pt --include onnx --opset 12导出成功后用ONNX Runtime加载模型写推理接口这一步可以脱离PyTorch环境部署到没有GPU的机器上。如果目标是NVIDIA Jetson系列可以在设备上直接用TensorRT导出engine格式推理速度能比ONNX再快不少。导出engine时的batch size要按实际需求设动态batch在TensorRT里写起来烦固定batch对多数摄像头场景已经够了。这几年也常有人问树莓派这类设备能不能部署。我实际试过树莓派5用ONNX Runtime CPU跑yolov5s输入分辨率降到320并开启多线程勉强能到实时或准实时的水平。如果你要部署到这种低功耗设备第一件事就是把输入分辨率压下来第二个是把模型替换成ncnn或量化后的INT8模型。但注意分辨率降下来之后远处的小手机目标会漏得很惨所以边缘设备更适合做近景定点监测不建议做整个车间的全景扫描。5.3 真实场景落地中的几个细节数据集里如果大量是平视角度拍摄的图片而现场摄像头是高处俯拍会存在明显的域差异直接部署表现会打折扣。我的做法是先跑一版现场数据把误检比较多的图片挑出来再结合原有数据集做增量微调。通常补几百张现场图就能把俯视场景的漏检率压下来。这是整个流程里最不可跳过的环节数据集再大也替代不了。夜间和逆光场景是另一个大坑。手机屏幕在黑暗中是一个亮斑周围人脸和环境几乎不可见模型会把台灯、电子屏幕甚至白色水杯误判成手机。如果现场有夜间需求一定要额外收集夜间数据单靠白天数据集很难覆盖。单帧检测结果的抖动也需要处理。摄像头画面里一个人低头看手机模型可能在第1帧检测到、第2帧漏掉、第3帧又检测到。直接按单帧报警会产生大量无效告警。我常用的方案是做一个简单的连续帧计数检测框在连续N帧中累计出现超过阈值才触发报警。N的大小看场景容忍度工地安全这种宁可多报的场景N取3到5帧考场纪律这种最好N取10帧以上避免学生只是调整坐姿就触发误报。最后说一个容易被忽略但很重要的点玩手机检测涉及对个人的行为识别在公共区域部署这类系统时要提前评估隐私合规和告知义务数据采集和标注环节也需要获得相应授权。技术能解决的问题远远不是项目里的全部。这次用YOLOv5 6.0把玩手机检测从数据集到部署完整跑了一遍我最大的体会是模型本身不复杂真正的门槛在数据与场景的匹配度。拿到yolov5-6.0-phone-1022.zip这样的资源包先不要急着追求高mAP踏踏实实把数据检查、路径配置、现场微调这几步做扎实效果往往比盲目调参好得多。如果你手头正好有类似场景的摄像头建议先跑一版再补一批现场数据做增量训练这个流程走通之后你会发现这类行为检测项目其实都差不多。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价