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

小目标手机检测实战:2800张数据集的标注、训练与部署

做安防视觉和边缘部署的同行应该都遇到过这种需求教室里检查学生有没有偷偷玩手机工位上判断员工是否频繁低头看屏幕驾驶员监控里识别分心打电话的行为。需求方通常觉得这就是个最普通的单类目标检测但我从数据采集、标注到训练全程走下来之后真心觉得手机检测这个任务的水远比想象中深。这套2800张YOLO目标检测数据集围绕手机检测场景专门整理覆盖白天/夜间、室内/车内、手持/通话/摆放等常见状态目标普遍是小尺寸、低对比度还伴随遮挡和反光很适合用来做YOLOv5/YOLOv8系列模型的训练基底。这篇文章不打算单纯晒目录而是把数据构成、标注口径、训练参数和实测翻车记录一并写出来想自己从零搞一套手机检测方案的朋友可以参考。1. 手机检测这个需求为什么看起来简单却老翻车1.1 单类目标不等于简单目标很多人下意识觉得检测任务只要类别是单一的把分类头改成1类、缩小anchor范围难度肯定比多类检测低一个量级。但手机检测恰好是个反例类别虽然单一目标尺度和形态却极端不稳定。我统计过这批2800张图里所有手机标注框的分布绝大多数手机实例在640x640输入尺寸下短边只有不到20个像素属于很典型的小目标。目标越小卷积下采样过程中丢失的特征就越多到了检测头那边的有效信息本来就少再加上遮挡难度直接翻倍。另一个问题是类内差异大到离谱手持浏览时是竖屏长方形但角度倾斜、手部遮挡可见部分可能只有整机的1/2甚至1/3通话贴耳时手机只露出屏幕一角很多特征完全被头部和手盖住桌面平放状态下有很强的透视畸变手机在画面里是个梯形屏幕亮起时亮度比熄屏状态高十几倍屏幕内容会完全覆盖机身边框特征夜间场景下屏幕光斑和周围环境光相互干扰模型很容易把路灯光斑也判成手机。这些状态全部被压进同一个类别标签模型本质上是在学习很多种视觉模式都属于手机这件事。如果只看到单类就随便找几百张图片开训出来的模型通常只能检测那种明显竖屏握持的手机换个角度、换个光照就漏得没法用。2800张的意义不在数量本身而在于让模型有足够样本去消化这些形态差异。1.2 主流应用场景对数据有哪些硬性要求实际业务里手机检测主要集中在三个场景每个场景对数据的要求都不一样。第一个是驾驶员分心监控。摄像头一般装在车内后视镜附近广角视野目标距离一到两米手机在整幅画面里偏小行驶过程中光照变化剧烈大逆光、隧道明暗切换、夜间屏幕直射都会出现。第二个是考场、教室的无感监控。相机通常架设在天花板或教室后方俯视角度桌面上的手机非常小而且书本、文具、手臂会和手机形成大量遮挡。第三个是工厂、办公室的合规管理。这类场景目标相对近、像素大但机位多跨角度变化大一旦误报员工体验会很差。这轮场景拆解下来就能理解为什么很多个人从网上随手抓图做出来的手机检测数据集一上真实监控就崩。网上大量手机展示图来自电商和产品评测目标居中、背景干净、光线充足和监控画面里的实际目标差异非常大。所以这套2800张数据的采集目标很明确贴近真实监控视角而不是精致摆拍宁可图像整体偏暗、目标偏小也要保证训练分布接近部署环境。1.3 公开数据的通病与本数据集的定位我也翻过一些公开资源手机检测类数据通常会遇到几个具体问题数量看着多但重复场景占了大半很多是模特手持手机的照片角度固定缺少遮挡和暗光还有一种情况是来自大型车载数据集里面确实有手机类但样本占比少得可怜类别严重不平衡直接用很难训出稳定结果。这套数据把标注口径统一成监控视角下的YOLO格式场景尽量贴近真实业务并保留了少量负样本用于压制误报可以直接接进训练管线不需要再做一轮清洗。2. 2800张数据集的构成逻辑与标注规范2.1 图像来源、分辨率与场景分布数据来源主要分两块一块是在真实场景里用监控视角拍摄的素材另一块是从公开视频帧中筛选出的手机使用强相关画面。分辨率集中在1280x720到1920x1080之间我没有做放大处理而是直接按原始分辨率参与训练这样模型学习到的目标尺度才贴近真实边缘设备看到的画面。场景分布上我简单统计过几个大类场景大致占比说明手持浏览35%站立、行走、坐着看手机各种手部姿势通话贴耳20%单耳贴手机、边走边打、驾驶座接听桌面平放20%办公桌、课桌、餐桌等俯视与侧视角度车内驾驶15%主驾、副驾、后排前挡风与侧窗视角夜间/暗光10%屏幕亮起、路灯下、室内低照度需要说明的是手机壳、平板、遥控器、计算器这类外观近似的物件我没有归入手机类别它们统一被当作背景负样本处理用于压制误报。2.2 YOLO标注格式的五个数值到底怎么填YOLO格式的标注文件是txt文本每行表示一个目标内容为类别ID、归一化中心点x、归一化中心点y、归一化宽、归一化高。举例来说一张1920x1080的图像里某台手机在图像坐标系中的左上角坐标是(520, 300)宽260像素高560像素。中心点的x坐标就是520加上宽度的一半即520 260/2 650中心点的y坐标是300 560/2 580。归一化到图像尺寸后x_center 650 / 1920 0.3385y_center 580 / 1080 0.5370width 260 / 1920 0.1354height 560 / 1080 0.5185对应的那行标注就是0 0.3385 0.5370 0.1354 0.5185归一化坐标的好处是训练时无论把输入图像缩放到640还是1280标注都不用改。这也是YOLO系列框架统一采用这种格式的原因。实际标注时并不需要手算标注工具会自动输出但自己清洗数据时经常要核对数值懂得换算逻辑能省不少事。2.3 数据集划分和目录结构我按大约85:10:5的比例划分为训练集、验证集、测试集具体数量是训练集2380张、验证集280张、测试集140张。有一点很重要划分按场景进行而不是完全随机。同摄像头连续帧如果被同时分进训练集和验证集验证mAP会虚高等到了新场景一下子暴露短板。目录结构很常规YOLO系列训练时直接引用即可phone_detection/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── phone.yaml2.4 负样本也是数据集的重要组成部分很多人做数据集只关注正样本这是误区。手机检测这个任务里屏幕反光、白色卡片、路由器指示灯、遥控器反射区都有可能被模型误吸成手机。我在数据里保留了约8%比例的完全不含手机的负样本图它们的作用不是提供训练目标而是让模型在背景区域学到没有手机的模式。YOLO训练默认启用mosaic增强负样本图会和正样本图随机拼接参与背景特征的构建对抑制误报有明显帮助。3. 标注手机目标最容易翻车的三个细节3.1 边框贴多少才算合格这是个一致性问题标注最核心的坑不是不会标而是标口不一致。不同标注人员对同一台手机框出来的矩形可能一个框住外壳一个只框屏幕一个把手指也带进去。我在实际操作中沉淀下来的标准是标注框紧贴手机设备本身的可见边缘包含屏幕加边框手、充电线、耳机线一律不进入框内如果手大面积挡住屏幕就框可见部分的外接矩形但前提是目标轮廓仍然能明确判断为手机。为什么强调一致性因为训练时模型会学习标注框的分布规律如果有的框松有的框紧回归分支会被噪声干扰最终收敛出来的框不是偏大就是偏小。特别是小目标边框只差两三个像素在低分辨率特征图上可能就整体偏移出目标中心。后来我把这两条写进标注规范还对全部标注做了一遍复核才把质量拉齐。3.2 遮挡、截断和模糊目标的取舍标准COCO官方有个通用原则目标可见面积低于一定比例或严重截断时不标注。但我在手机检测业务里试下来完全照搬会导致大量目标被漏掉因为监控画面里手机经常被手、书本、方向盘挡住。我实际采用的标准是这样的可见面积小于整机面积的1/3不标注当作负样本可见面积大于1/3且轮廓能判断出是手机正常标注目标在画面边缘被截断只要剩余部分能明确辨认就标注完整外接框截断部分按真实手机尺寸合理推定目标严重失焦、动态模糊到看不出是手机不标注。这个标准的逻辑是训练数据里全是完整手机模型在真实遮挡场景就会漏检但如果大量标注1/4大小的碎片模型又会把各种倒影、局部反光都当手机。1/3这个阈值是我拿验证集反复调出来的相对可靠的经验值。3.3 反光、亮屏和镜子里的手机怎么处理夜间亮屏手机其实是比较容易识别的好样本真正麻烦的是屏幕反光。白天在窗边手机屏幕反射出灯光和窗户影像反射区域的面积经常比手机本身还大。这种时候必须坚持一条铁律标注框跟着物理物体边界走而不是跟着视觉亮区走。反光区域哪怕再亮只要是位置在手机外壳之外一律不框。另一个高频翻车点是镜子、玻璃里的手机倒影。我一开始看到镜子里有一部手机就直接标了结果训练出的模型开始对镜子产生手机过敏任何类似手机亮度的反射都会触发误报。后来我统一把倒影当背景只在镜像里的手机明确对应真实空间中的目标时才标注真实目标。3.4 标注质检的常规操作流程我自己的质检流程大致有五步用标注工具导出全部txt后先跑一遍统计脚本看所有框的宽高分布有没有异常点比如宽度大于1、中心点落在图像外等随机抽5%的图像做人眼复核重点看小目标和遮挡目标有没有标歪用一个预训练检测模型跑一遍全部图像把置信度低于0.3的候选框导出人工判断是不是漏标的目标检查txt文件是否有空行、乱码、坐标越界这种问题不清理训练时轻则loss波动重则直接NaN按1/3遮挡原则再跑一遍规则脚本把不合规的标注标记出来人工修正。这个环节很耗费时间但直接决定了后续训练能不能稳定收敛。我见过太多项目栽在标注质量上模型怎么调超参数都不收敛最后发现是标注框坐标越界。4. 用YOLOv8训练实测配置、损失曲线与问题排查4.1 data.yaml配置与模型选型训练前先写数据配置文件YOLOv8会读取这个文件定位图片和标签path: /data/phone_detection train: images/train val: images/val test: images/test names: 0: phone模型选型上我的建议是别一上来就追求最大。YOLOv8n非常轻量适合嵌入式设备但小目标的框回归能力偏弱YOLOv8s是在640输入下性价比较高的选择如果业务允许把输入尺寸拉到1280YOLOv8m及以上的提升会更明显。实际操作中我习惯先跑一版n和一版s做对比看mAP差距和时延差距再决定要不要升级。4.2 训练参数实测与输入尺寸的影响基线训练参数我用了yolov8s、输入尺寸640、epochs 200、batch size 16、优化器SGD、初始学习率0.01。整个训练过程并不是线性上涨的前50轮loss下降很快之后进入平台期100轮后mAP50-95才开始明显爬升到第150轮后基本稳定。小目标检测有一个非常直接的经验与其花大量时间调学习率、改anchor不如先把输入尺寸拉大。我同样数据集、同样参数把训练输入从640提高到1280mAP50-95从0.612提升到0.731这个涨幅远超调其他超参数带来的收益。代价也很明显显存占用翻倍以上batch size从16降到8训练时间拉长近一倍但如果线上设备能承受推理时延这个投入非常划算。4.3 训练中遇到的三个典型问题第一个是BN层崩溃。YOLOv8训练早期偶发表现为loss突然暴涨、mAP归零。我的排查思路是先看batch size是否太小、初始学习率是否过大。在调试阶段我把batch size从16降到8后更容易触发调回16并用官方提供的自动学习率策略后就稳定了。第二个是loss出现NaN。排查到最后基本都是标注文件的问题要么某个坐标值超出[0,1]要么txt里出现了空行或缺失类别ID。我写了个简易Python校验脚本遍历所有txt检查每行的数值范围再和对应图片的尺寸做一次交叉验证把异常文件直接定位出来。第三个更隐蔽验证集mAP不错但用真实监控视频一测就漏检严重。这个不是训练参数问题而是数据划分问题——连续视频帧被随机分进训练集和验证集模型已经见过几乎一样的画面了。按场景重新划分后验证分数会下降一些但反而更接近真实水平之后的调优才有意义。5. 测试集表现、误报分析与部署优化5.1 同一套测试集下几个模型的实测对比我用统一的140张测试集跑过几个配置指标大概如下模型输入尺寸mAP50mAP50-95单张推理耗时GPU模型体积YOLOv8n6400.9130.612约2.1ms6.2MBYOLOv8s6400.9470.655约3.8ms22.5MBYOLOv8s12800.9710.731约9.6ms22.5MBYOLOv8m12800.9780.762约15.4ms52.4MB这里的耗时只能反映相对差异具体FPS取决于部署设备的算力不能直接跨硬件对比。从结果可以明显看出输入尺寸的杠杆比换更大模型更直接。5.2 实测中的典型误报与漏检案例拿YOLOv8s 640这一版来分析漏检主要集中在三种情况手机被手完全握成拳头、只有指尖露出一小条边手机熄屏且背景深色导致对比度极低目标距离超过三米、画面中只有不到十几个像素。后面两种说到底还是小目标问题和模型容量直接相关。误报则集中在以下类别桌面上的白色计算器和遥控器强光照射下产生的高光反射板亮屏平板等尺寸明显不同的设备镜子和玻璃中的反射影像。对镜面误报我在推理端加了一道可选的修正规则人脸检测框和手机框同时出现且空间关系不合理时降低手机框的置信度。这个规则不一定适合所有场景但在办公和教室监控里比较有效可以作为后处理开关按需打开。5.3 部署侧的三招优化第一招是推理时适当增大输入尺寸。训练用1280就推理也用1280如果训练只用640推理端也可以先试960视觉模型对附近输入尺寸有一定的鲁棒性不一定需要重新训练。第二招是针对超小目标做切片推理。OpenMMLab的SAHI这类工具可以把大图切成多个重叠块分别推理后再按NMS合并。监控画面分辨率通常不低切片推理对远处小目标提升非常明显。缺点是重叠区域会重复计算FPS下降实际部署时可以对小目标区域单独启用切片。第三招是NMS参数调整。YOLOv8默认的IoU阈值是0.7在目标密集的场景里紧挨着的多台手机可能被合并成一个框。适当把NMS阈值降到0.5能减少重叠目标的丢失代价是误检框也会多一些需要结合具体场景试。在部署最后阶段很多人会想直接用INT8量化来提速。对普通物体检测量化后精度损失一般可接受但对小目标检测量化对像素级特征的破坏比较明显mAP50-95可能掉好几个点。我的建议是先量化再跑一遍完整测试集观察mAP变化如果下降超过3-5个点就保留FP16推理或者把输入尺寸拉高来弥补。最后再分享一个实操习惯手机目标检测模型的迭代一定要保留一份业务负样本集。每次模型上线后把真实环境里误报的截图攒下来下一轮训练时混进负样本里重新调优。我在初期版本就是这样第一轮模型镜面误报严重加入一批准负样本后误报率下降了不止一个级别。数据集的价值不只是第一次训练它更是一个会持续生长的资产。
分享:

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

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