Skip to content

数据集

📷 训练图片获取

📷.1 训练图片采集流程

以游戏/应用检测为例:

    1. 确定截图方式
  • 推荐 ADB 截图(设备原生分辨率 1920×1080)
    1. 批量采集截图
  • 截取几百张游戏画面,覆盖各种场景
  • 不同地图、不同时间、不同状态都要有
    1. 使用标注工具标注目标
  • LabelImg 或 Roboflow 标注 bounding box
    1. 导出为 YOLO 格式,开始训练

📷.2 最佳尺寸:训练图 = 推理时的截图

YOLO 内部会将输入图片统一缩放到模型输入尺寸(如 640×640),所以理论上任何分辨率的图片都能训练和推理。但训练图和推理图的来源方式越一致,检测效果越好

📷.3 图片来源方式

方式一:ADB 截图(推荐用于模拟器/真机场景)👍

通过 adb screencapadb exec-out screencap -p 获取设备原生分辨率的截图:

bash
# 截图保存到设备
adb shell screencap -p /sdcard/screenshot.png
adb pull /sdcard/screenshot.png ./screenshot.png

# 直接获取到本地(更快)
adb exec-out screencap -p > screenshot.png

ADB 截图 优点:

  • 获取的是设备原生分辨率(如 1920×1080),不受电脑窗口大小影响
  • 分辨率稳定,换台电脑、调整窗口大小都不影响截图结果
  • 图像更清晰,目标特征更明显,检测效果更好
方式二:窗口截图(截取模拟器/应用窗口)

使用系统 API 或第三方工具截取屏幕上的窗口画面:

注意: 窗口截图的分辨率取决于窗口实际大小。如果模拟器窗口被缩小到 354×273,截图就是 354×273,信息量远小于原生 1920×1080。

python
# Python 示例:使用 pyautogui 截取屏幕区域
import pyautogui
screenshot = pyautogui.screenshot(region=(x, y, width, height))
screenshot.save("screenshot.png")

# 或使用 mss(更快,适合实时场景)
import mss
with mss.mss() as sct:
    monitor = {"top": y, "left": x, "width": width, "height": height}
    img = sct.grab(monitor)
方式三:直接收集图片文件

适用于非实时场景,直接从文件系统收集现有图片:

  • 相机/手机拍摄的照片
  • 网络爬取的图片(注意版权)
  • 公开数据集中的图片
  • 游戏/应用的素材资源

📷.4 批量 ADB 截图脚本示例

python
import subprocess
import time
import os

output_dir = "./screenshots"
os.makedirs(output_dir, exist_ok=True)

for i in range(200):
    filename = os.path.join(output_dir, f"screen_{i:04d}.png")
    subprocess.run(
        f"adb exec-out screencap -p > {filename}",
        shell=True
    )
    print(f"已截取: {filename}")
    time.sleep(2)  # 每 2 秒截一张,根据需要调整间隔

📷.5 采集注意事项

  • 场景多样性:确保截图覆盖各种游戏场景——不同地图、不同怪物组合、不同 UI 状态、白天/夜晚等
  • 目标多样性:同一类目标要包含不同大小、不同位置、部分遮挡等情况
  • 数量建议:每个检测类别至少 100~300 张包含该目标的截图,场景越复杂越需要更多数据
  • 负样本:适当包含一些没有目标的截图(空标签文件),让模型学会区分"无目标"场景
  • 避免重复:连续截图时设置合理间隔,避免大量近似重复的画面(会导致过拟合)
  • 避免 UI 干扰:如果检测的目标是游戏内物体,注意 UI 元素(血条、小地图等)是否会造成干扰,必要时可裁切或在标注时忽略

✏ 标注工具推荐与使用

✏.1 工具对比

工具工具类型支持格式优点缺点推荐度
LabelImg桌面端YOLO / VOC / CreateML轻量免费、直接输出 YOLO 格式仅支持矩形框标注⭐⭐⭐⭐⭐
Roboflow在线平台多种格式在线协作、自动增强、一键导出免费版有数量限制⭐⭐⭐⭐⭐
LabelMe桌面端JSON支持多边形、分割标注需手动转换为 YOLO 格式⭐⭐⭐⭐
CVAT网页端多种格式功能强大、团队协作部署较复杂⭐⭐⭐⭐
Label Studio网页端多种格式通用标注、插件丰富学习成本稍高⭐⭐⭐
推荐方案
  • 个人项目/小数据集 → LabelImg(最简单直接)
  • 团队协作/大数据集 → Roboflow(在线平台,省心省力)
  • 需要分割标注 → LabelMe(多边形标注)

✏.2 Roboflow 在线标注(团队推荐)

  • 访问 https://roboflow.com/ 注册账号
  • 创建项目,选择 Object Detection
  • 上传图片
  • 在线框选标注目标、设定类别
  • 设置训练集/验证集/测试集比例(推荐 70/20/10)
  • 添加数据增强预处理(可选)
  • 导出时选择 YOLOv8 格式(与 YOLO26 兼容),下载数据集

✏.3 LabelImg 安装与使用(小数据集推荐)

✏.4 标注注意事项

  • 框要贴紧目标:不要留太多空白,也不要裁切目标
  • 类别名称统一:同一类目标全程用同一名称,区分大小写
  • 类别粒度按需求定,不是越细越好
    • 类别越多,每个类别需要的训练数据越多,模型学习难度越大
    • 如果只需要知道"这里有个怪物",标一个 monster 就够;如果需要区分怪物种类再细分 monster_a、monster_b
    • 外观差异大的目标才值得分开标(比如近战怪和远程怪长得完全不同);长得很像的硬拆成多类反而会互相混淆降低精度
    • 实际建议:先用粗粒度跑通验证效果,有需要再逐步细分
  • 标注所有目标:一张图中所有属于目标类的物体都要标注,不要遗漏
  • 图片质量:避免严重模糊、过曝、过暗的图片
  • 数据量建议:每个类别至少 100-300 张标注图片,越多越好
  • 多样性:同一类别应包含不同角度、光照、尺寸、背景的样本

🗂 数据集目录结构与配置

🗂.1 标准目录结构

bash
my_dataset/
├── images/
   ├── train/          # 训练集图片
   ├── img001.jpg
   ├── img002.jpg
   └── ...
   └── val/            # 验证集图片
       ├── img101.jpg
       ├── img102.jpg
       └── ...
├── labels/
   ├── train/          # 训练集标签(与图片一一对应)
   ├── img001.txt
   ├── img002.txt
   └── ...
   └── val/            # 验证集标签
       ├── img101.txt
       ├── img102.txt
       └── ...
└── data.yaml           # 数据集配置文件
关键要求:
  • images 和 labels 目录结构必须完全镜像
  • 每个图片文件必须有一个同名的 .txt 标签文件
  • 如果某张图片没有标注目标,对应的 .txt 文件内容为空(文件必须存在)

🗂.2 data.yaml 配置示例(数据集配置文件)

在数据集根目录创建 data.yaml 文件:

yaml
# 数据集路径(使用绝对路径更可靠)
path: /home/user/my_dataset    # 数据集根目录
train: images/train            # 训练集图片路径(相对于 path)
val: images/val                # 验证集图片路径(相对于 path)
test:                          # 测试集(可选,留空)

# 类别数量
nc: 3

# 类别名称(顺序必须与标注 ID 对应:0=cat, 1=dog, 2=bird),也就是 classes.txt 里面什么顺序这里就什么顺序,不要随意列出来
names:
  0: cat
  1: dog
  2: bird
注意事项:
  • path 推荐使用绝对路径,避免路径问题
  • names 中的序号必须与标注文件中的类别 ID 严格对应
  • nc 必须与 names 中的类别数量一致
为什么只为什么只配置 images 路径,不配置 labels?

YOLO 训练脚本内部有一套固定的路径推导规则:读取图片路径后,自动将路径中的 images 替换为 labels、将图片后缀替换为 .txt 来定位标签文件。例如:

  • 图片路径:/home/user/my_dataset/images/train/img001.jpg
  • 标签文件路径:/home/user/my_dataset/labels/train/img001.txt

因此 data.yaml 中不需要(也没有字段)配置 labels 路径,只要你的目录结构保持 images/ 和 labels/ 镜像对应即可。这也解释了为什么 5.1 节中强调「目录结构必须完全镜像」——这不是建议,而是 YOLO 的硬性约定。

京ICP备2024093538号-1