
简介这份手机识别数据集面向计算机视觉初学者与目标检测开发者用于训练和验证手机类目标的检测模型可服务于课堂实验、课程设计或算法预研等场景。资源包共收录2000个文件其中1997张jpg原始图片与3个json标注文件压缩包约82.97MB图片覆盖多种拍摄角度与光照条件下的手机目标json文件采用coco格式可直接对接主流检测框架的数据加载流程省去自行标注与格式转换的环节。目前已有725人学习下载说明该数据集在实际训练任务中具备一定参考价值。读者可借助这批真实场景图片快速搭建训练集与验证集结合coco标注完成模型微调、精度评估与可视化分析也可用于数据增强、类别平衡等实验对比为手机识别相关项目提供开箱即用的数据基础。1. 手机识别数据集到底能干什么2628 张原始图片 COCO JSON 标注的真实定位很多人第一次拿到「手机识别数据集2628 张原始图片支持 coco json 格式的标注」这类资源时第一反应是打开压缩包数图片然后卡在下一步这玩意儿到底能训什么我踩过的坑是把它当成通用目标检测数据集直接丢给 YOLOv8结果 mAP 卡在 0.4 上不去排查半天才发现标注类别和我的业务场景根本对不上。手机识别这个任务本质是让模型在画面里定位出手机这个目标输出边界框和类别常见落地场景包括考场/会议室手机检测、驾驶场景分心行为识别、零售门店陈列合规检查、二手回收平台的机型初筛。2628 张这个量级不算大属于典型的小样本微调规模适合做迁移学习而不是从零训练。COCO JSON 是这套数据最大的价值点——它意味着你可以直接对接 pycocotools、MMDetection、Detectron2、YOLOv8 这一整条工具链省掉自己写解析器的功夫。适合谁适合手上有明确手机检测需求、想快速验证方案可行性的算法工程师也适合刚入门目标检测、想拿一份标注规范的数据练手的新人。不适合指望靠它训出工业级通用模型的人2628 张撑不起那个野心。2. 拆开 COCO JSON2628 张图片的标注结构长什么样2.1 COCO JSON 的四个顶层字段与手机检测的对应关系COCO 格式的标注文件是一个大 JSON顶层通常有images、annotations、categories、info四个字段。images记录每张图的 id、文件名、宽高annotations是核心每条包含image_id、category_id、bbox、area、iscrowdcategories定义类别 id 和名称手机识别数据集里通常就一个phone或mobile_phone类别info是元信息可有可无。理解这个结构的关键在于bbox的格式——COCO 用的是[x, y, width, height]原点是左上角这和 YOLO 的[x_center, y_center, w, h]归一化格式完全不同转换时最容易在这里翻车。下面这段代码用来快速体检一份 COCO JSON确认字段完整性和类别分布。import json from collections import Counter with open(annotations/instances.json, r, encodingutf-8) as f: coco json.load(f) # 顶层字段检查 for key in [images, annotations, categories]: print(key, -, len(coco.get(key, []))) # 类别分布 cat_map {c[id]: c[name] for c in coco[categories]} counter Counter(cat_map[a[category_id]] for a in coco[annotations]) print(类别分布:, counter) # 抽查一条标注的 bbox 格式 sample coco[annotations][0] print(bbox 示例:, sample[bbox], area:, sample.get(area))这段代码先确认三个必需字段存在且非空再用Counter统计每个类别的标注数量最后打印一条 bbox 看格式。参数上要注意category_id在 COCO 里是从 1 开始的不是 0很多转换脚本默认从 0 开始导致类别错位。如果annotations数量远小于images数量乘以平均目标数说明有图片没标注需要单独筛出来。2.2 用 pycocotools 验证标注合法性光看字段不够COCO 标注里常见的隐性问题是 bbox 越界、宽高为负、area和bbox对不上。pycocotools 是官方验证工具直接调它的 API 能一次性暴露这些问题。from pycocotools.coco import COCO coco COCO(annotations/instances.json) img_ids coco.getImgIds() print(图片总数:, len(img_ids)) bad [] for ann in coco.dataset[annotations]: x, y, w, h ann[bbox] img coco.imgs[ann[image_id]] if w 0 or h 0: bad.append((ann[id], 宽高非正)) elif x w img[width] or y h img[height]: bad.append((ann[id], 越界)) elif abs(ann.get(area, 0) - w * h) 1: bad.append((ann[id], area 不匹配)) print(异常标注数:, len(bad)) print(bad[:10])getImgIds()返回所有图片 id遍历annotations时用coco.imgs反查图片宽高做越界判断。area理论上等于w * h但有些标注工具会算成多边形面积允许 1 像素的误差。跑完如果异常数超过总数的 1%建议先清洗再训练否则这些脏标注会持续拉低 mAP而且很难从 loss 曲线上看出来。2.3 从 COCO 转 YOLO 格式的完整脚本如果你打算用 YOLOv8 训练必须把 COCO 转成 YOLO 的 txt 格式。转换的核心是坐标归一化和目录结构重组。import json, os from pathlib import Path coco json.load(open(annotations/instances.json, encodingutf-8)) out_img Path(dataset/images/train) out_lbl Path(dataset/labels/train) out_img.mkdir(parentsTrue, exist_okTrue) out_lbl.mkdir(parentsTrue, exist_okTrue) # 建立 image_id - 图片信息 的索引 img_index {img[id]: img for img in coco[images]} # 按 image_id 聚合标注 from collections import defaultdict ann_by_img defaultdict(list) for ann in coco[annotations]: ann_by_img[ann[image_id]].append(ann) for img_id, img in img_index.items(): W, H img[width], img[height] lines [] for ann in ann_by_img[img_id]: x, y, w, h ann[bbox] # COCO 左上角 - YOLO 中心点归一化 cx (x w / 2) / W cy (y h / 2) / H nw, nh w / W, h / H cls ann[category_id] - 1 # YOLO 类别从 0 开始 lines.append(f{cls} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}) # 写 label 文件文件名与图片同名 stem Path(img[file_name]).stem (out_lbl / f{stem}.txt).write_text(\n.join(lines), encodingutf-8) # 图片拷贝或软链接到目标目录 src Path(raw_images) / img[file_name] if src.exists(): os.link(src, out_img / img[file_name]) if not (out_img / img[file_name]).exists() else None转换逻辑分三步先建image_id到图片信息的索引再按image_id聚合标注最后逐图计算归一化坐标并写 txt。category_id - 1是必须的因为 COCO 从 1 开始而 YOLO 从 0 开始。os.link用硬链接避免拷贝 2628 张图占用额外磁盘Windows 上如果报错就换成shutil.copy。写完检查一下 labels 目录的文件数是否和 images 一致不一致说明有图片没有对应标注。3. 用这份数据集训练从环境到第一个 baseline3.1 环境准备与数据配置文件YOLOv8 是目前上手最快的选择一条命令装完。数据配置文件phone.yaml要写清路径和类别。# phone.yaml path: ./dataset train: images/train val: images/val nc: 1 names: [phone]path是数据集根目录train和val是相对路径。nc是类别数手机识别数据集通常就是 1。names要和转换时的类别顺序一致。划分验证集时建议按 8:2 切2628 张里留 500 张左右做验证别用训练集当验证集自欺欺人。3.2 训练命令与关键参数怎么设yolo detect train \ dataphone.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/phone \ namebaselinemodelyolov8n.pt用预训练权重做迁移学习小数据集千万别从yolov8n.yaml从零训。imgsz640是默认值如果原始图片分辨率远大于 640可以试 960 但显存要够。batch16在 8G 显存上跑 640 尺寸基本安全爆显存就降到 8。lr00.01是初始学习率微调场景可以降到 0.001 更稳。patience20表示 20 轮没提升就早停小数据集很容易过拟合这个参数是后悔药。训练完看runs/phone/baseline/results.csv重点盯metrics/mAP50-95和val/box_loss两条曲线。3.3 推理验证与结果解读yolo detect predict \ modelruns/phone/baseline/weights/best.pt \ sourcetest_images/ \ conf0.25 \ saveTrueconf0.25是置信度阈值手机检测场景如果误检多就提到 0.4漏检多就降到 0.15。saveTrue会把画框结果存到runs/detect/predict。2628 张数据训出来的 baselinemAP50 通常在 0.75 到 0.9 之间如果低于 0.6先回去查标注质量和类别映射别急着调模型。4. 避坑与排查手机识别数据集训练中最容易翻车的 5 个点4.1 现象训练 loss 正常下降但 mAP 一直是 0原因类别 id 映射错位。COCO 的category_id从 1 开始转换脚本如果没减 1YOLO 会认为类别是 1 而nc1只认类别 0所有标注被当成背景。解决转换后打开任意一个 label txt确认第一列是 0 而不是 1。4.2 现象验证集 mAP 比训练集低一大截原因训练集和验证集划分时没有打乱或者同一场景的图片被分到了两边导致分布不一致。解决划分前先shuffle如果数据里有明显的场景分组比如不同光照、不同背景按组划分而不是按图划分。4.3 现象模型把手机壳、平板、遥控器也框成手机原因2628 张里负样本不足模型没学到手机的判别性特征。解决在训练集里加入不含手机的纯背景图或者加入手机壳、平板这类易混目标的负样本图让模型学会区分。YOLOv8 支持把没有标注的图片放进训练集label 文件留空即可。4.4 现象小目标手机检测效果极差原因原始图片里手机占画面比例很小缩放到 640 后目标只剩几十像素。解决把imgsz提到 960 或 1280或者用切片推理SAHI把大图切块检测。另一个办法是在数据增强里关掉mosaicmosaic 会把四张图拼一起进一步缩小目标。4.5 现象训练到后期 val loss 开始上升原因过拟合。2628 张对 YOLOv8n 来说偏少模型容量相对数据量偏大。解决开dropout、加weight_decay、用更强的数据增强hsv_h、hsv_s、degrees、translate或者换更小的模型。早停patience设小一点比如 15。5. 把 2628 张用到极致小样本下的增强策略与半自动标注闭环2628 张的瓶颈不在模型而在数据多样性。我一般会做两件事一是用已训好的 baseline 对未标注图片做预标注人工只做修正形成半自动标注闭环二是针对手机检测的特定难点做定向增强。预标注用 YOLOv8 的predict输出 COCO JSON再导入 CVAT 或 Label Studio 修正修正后的数据回流训练集迭代两到三轮通常能把 mAP 再拉 5 到 10 个点。yolo detect predict \ modelruns/phone/baseline/weights/best.pt \ sourceunlabeled_images/ \ conf0.15 \ save_txtTrue \ save_confTrue \ formatcococonf0.15故意放低让模型多召回一些候选框宁可多标不可漏标人工修正时删框比画框快。save_txtTrue输出 YOLO 格式formatcoco输出 COCO JSON按你的标注工具选。定向增强方面手机检测的难点集中在反光屏幕、手持遮挡、小目标、暗光。针对这四类在phone.yaml同级加一个增强配置增强参数建议值针对的难点hsv_v0.5暗光、过曝hsv_s0.7屏幕反光导致的色彩偏移degrees10手持角度变化translate0.1目标位置偏移scale0.5小目标尺度变化mosaic0.5降低拼接强度保护小目标mixup0.1轻微混叠提升泛化验证增强是否有效别只看最终 mAP要分场景看。把验证集按光照、目标大小、遮挡程度打标签分别算 mAP哪一类低就针对性加。我自己的习惯是每轮训练完把results.csv和上一轮对比只保留验证集上真正提升的改动避免玄学调参。小数据集训练最忌讳一次改一堆参数最后不知道哪个起了作用。希望帮到你。本文还有配套的精品资源点击获取