Appearance
数据集
📷 训练图片获取
📷.1 训练图片采集流程
以游戏/应用检测为例:
- 确定截图方式
- 推荐 ADB 截图(设备原生分辨率 1920×1080)
- 批量采集截图
- 截取几百张游戏画面,覆盖各种场景
- 不同地图、不同时间、不同状态都要有
- 使用标注工具标注目标
- LabelImg 或 Roboflow 标注 bounding box
- 导出为 YOLO 格式,开始训练
📷.2 最佳尺寸:训练图 = 推理时的截图
YOLO 内部会将输入图片统一缩放到模型输入尺寸(如 640×640),所以理论上任何分辨率的图片都能训练和推理。但训练图和推理图的来源方式越一致,检测效果越好
📷.3 图片来源方式
方式一:ADB 截图(推荐用于模拟器/真机场景)👍
通过 adb screencap 或 adb 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.pngADB 截图 优点:
- 获取的是设备原生分辨率(如 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 的硬性约定。