YOLO 数据集获取与制作指南
更新: 2026/3/2 字数: 0 字 时长: 0 分钟
数据集获取方式
免费公开数据集网站
Roboflow https://roboflow.com
Google Open Images https://storage.googleapis.com/openimages/web/index.html
COCO 官方数据集 https://cocodataset.org
成品数据集购买
- 淘宝
- 咸鱼
📌 注意事项:
- 常见问题:格式不统一
- 很多数据集不是 YOLO 标准格式,需要自行转换
付费代标注服务
- 各大企业标注平台(百度、阿里、京东等)
- 自由职业标注(淘宝、猪八戒、QQ群)
📌 优点:效率高 📌 缺点:成本较高
素材采集方法
手机截图(手动采集)
直接通过系统截图保存素材,用于少量数据采集或补充样本。
手机自动化循环截图
👉 每秒截图一次,共截图 100 次
// 申请截图权限
$images.requestScreenCapture();
var saveDir = "/sdcard/yolo_images/";
files.createWithDirs(saveDir);
toastLog("2 秒后开始截图");
sleep(2000);
for (var i = 1; i <= 100; i++) {
var name = "img_" + ("0000" + i).slice(-4) + ".png";
var path = saveDir + name;
captureScreen(path);
console.log("已保存:" + path);
sleep(1000); // 每秒一张
}
toastLog("截图采集完成!");手机录屏转图片
操作步骤:
- 打开 Bot.js Pro 推理工具
- 选择视频源(本地视频或录屏文件)
- 随便选择一个模型(仅用于触发推理)
- 勾选 保存源帧
- 点击开始推理
- 推理完成后点击保存
📌 系统会自动将视频拆分为连续图片帧
Python 视频转图片(Windows 示例)
功能说明:
- 在
.py文件同级目录创建images/文件夹 - 输出图片名称格式:
视频名_0001.jpg
视频名_0002.jpg
...新建文件:video_to_images.py
# coding:utf-8
# 作者 :Bot.js
# 开发时间:2025/10/26 下午4:34
import cv2
import os
import time
def video_to_images(video_path, output_dir=None, frame_interval=1, start_frame=0, max_frames=None):
"""
视频转图片工具(支持中文路径)
"""
# 获取视频文件名
video_name = os.path.splitext(os.path.basename(video_path))[0]
# 设置输出目录
if output_dir is None:
base_dir = os.path.dirname(os.path.abspath(__file__))
output_dir = os.path.join(base_dir, "images", video_name)
os.makedirs(output_dir, exist_ok=True)
# ------------------ 中文路径处理核心 ------------------
# 方法:先用 np.fromfile 读取为二进制,再用 cv2.imdecode 解码
cap = None
try:
# 尝试1:直接打开(如果cv2版本支持中文)
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
# 尝试2:使用 cv2.CAP_FFMPEG 后端
cap = cv2.VideoCapture(video_path, cv2.CAP_FFMPEG)
if not cap.isOpened():
# 尝试3:如果还不行,退出并给出提示
print(f"❌ OpenCV 无法直接打开含中文路径的视频")
print(f"💡 建议将视频文件重命名为纯英文名(如 car.mp4)")
return False
except Exception as e:
print(f"❌ 打开视频失败: {e}")
return False
# ----------------------------------------------------
# 获取视频信息
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
duration = total_frames / fps if fps > 0 else 0
# 跳转到起始帧
if start_frame > 0:
cap.set(cv2.CAP_PROP_POS_FRAMES, start_frame)
print(f"🎬 视频信息:")
print(f" - 文件: {os.path.basename(video_path)}")
print(f" - 分辨率: {width} x {height}")
print(f" - 总帧数: {total_frames}")
print(f" - FPS: {fps:.2f}")
print(f" - 时长: {duration:.2f}秒")
print(f" - 输出目录: {output_dir}")
print("-" * 60)
index = 0
saved_count = 0
start_time = time.time()
while True:
ret, frame = cap.read()
if not ret:
break
if index % frame_interval == 0:
img_name = f"{video_name}_{saved_count + 1:04d}.jpg"
img_path = os.path.join(output_dir, img_name)
# ------------------ 保存中文路径图片 ------------------
# 使用 cv2.imencode + np.tofile 解决中文路径问题
success, encoded_img = cv2.imencode('.jpg', frame)
if success:
encoded_img.tofile(img_path) # 直接写入二进制,支持中文
saved_count += 1
# ----------------------------------------------------
# 打印进度
if saved_count % 20 == 0 or saved_count == 1:
current_frame = start_frame + index
progress = (current_frame / total_frames) * 100
elapsed = time.time() - start_time
speed = saved_count / elapsed if elapsed > 0 else 0
print(f"⏳ 进度: {current_frame:6d}/{total_frames} 帧 ({progress:5.1f}%) | "
f"已保存: {saved_count:4d} 张 | 速度: {speed:.1f} 张/秒")
index += 1
if max_frames and saved_count >= max_frames:
break
cap.release()
elapsed = time.time() - start_time
print("-" * 60)
print(f"✅ 转换完成!")
print(f" - 处理帧数: {index} 帧")
print(f" - 成功保存: {saved_count} 张图片")
print(f" - 耗时: {elapsed:.2f} 秒")
print(f" - 平均速度: {saved_count / elapsed:.1f} 张/秒")
print(f" - 输出目录: {output_dir}")
return True
if __name__ == "__main__":
video_to_images(
video_path=r"G:\website\yolo\ultralytics-8.3.163\test\videos\01汽车.mp4", # 视频文件路径(支持中文)
frame_interval=1, # 帧间隔:1=全部帧,2=隔一帧取一张,以此类推
start_frame=0, # 起始帧索引(0表示从第1帧开始)
max_frames=None # 最大转换帧数(None=转换全部,100=只转前100帧)
)标注工具
Labelme
轻量级图像标注工具,适用于 YOLO 数据制作,新手推荐。
开源地址: https://github.com/wkentaro/labelme
支持:
- 矩形标注(目标检测)
- 多边形标注(实例分割)
- 原生保存为 JSON 格式,需转换为 YOLO
.txt格式
使用说明:
- 目标检测 → 使用矩形工具
- 实例分割 → 使用多边形工具
- 姿态估计 / 关键点 → 使用矩形工具 + 创建点(点必须位于矩形框内)
中文旧版下载(Windows): https://1823071502.v.123pan.cn/1823071502/public/yolo/labelme32Chinese.zip
下载后解压得到 labelme32Chinese.exe,双击运行即可。
注意事项:
- 关闭 与图像数据一起保存
- 开启 自动保存
anylabeling
👉 anylabeling 是目前比较完整、易用、支持任务最全的一款开源工具。
开源地址:https://github.com/vietanhdev/anylabeling
anylabeling 非常适合用于 YOLO 系列模型数据标注,支持以下任务:
- 目标检测(Detect)
- 实例分割(Segment)
- 旋转框检测(OBB / Rotated)
- 姿态估计(Pose / Keypoints)
下载方式
版本下载页:https://github.com/vietanhdev/anylabeling/releases
推荐直接下载 Release 版本:
Windows: https://github.com/vietanhdev/anylabeling/releases/download/v0.4.29/AnyLabeling-Windows-CPU-x64.exe
macOS: https://github.com/vietanhdev/anylabeling/releases/download/v0.4.29/AnyLabeling-macOS-CPU.zip
⚠ 首次使用 AI 模型时需要联网下载权重(来源 GitHub,如下载较慢可自行加速)。
X-AnyLabeling
👉 X-AnyLabeling 是目前比较完整、易用、支持任务最全的一款开源工具。
开源地址:https://github.com/CVHub520/X-AnyLabeling/
X-AnyLabeling 非常适合用于 YOLO 系列模型数据标注,支持以下任务:
- 目标检测(Detect)
- 实例分割(Segment)
- 旋转框检测(OBB / Rotated)
- 姿态估计(Pose / Keypoints)
下载方式
版本下载页:https://github.com/CVHub520/X-AnyLabeling/releases
推荐直接下载 Release 版本:
Windows: https://github.com/CVHub520/X-AnyLabeling/releases/download/v3.3.9/X-AnyLabeling-CPU.exe
macOS: https://github.com/CVHub520/X-AnyLabeling/releases/download/v3.3.9/X-AnyLabeling-macOS.dmg
⚠ 首次使用 AI 模型时需要联网下载权重(来源 GitHub,如下载较慢可自行加速)。
内置 AI 自动标注
- 集成 30+ 预训练模型
- 支持自动检测、自动分割
- 可大幅减少人工标注时间
使用方式:
点击界面左侧 AI 图标 选择模型(如 Segment Anything) 即可进行自动标注
标注数据集
目标检测
使用 Labelme 标注
视频教程待补充……
实例分割
使用 X-AnyLabeling 标注
视频教程待补充……
图像分类
图像分类任务采用 按文件夹区分类别 的数据组织方式,无需额外标注文件,具体参阅图像分类任务数据集规范。
视频教程待补充……
姿态估计
关键点检测(人体、物体)
使用 Labelme 标注
视频教程待补充……
旋转框检测
带角度的目标检测(航拍、文本等)
使用 X-AnyLabeling 标注 创建旋转框标注目标,选中后按z键左旋转 按v键右旋转
视频教程待补充……
生成 YOLO 数据集
本步骤将 Labelme / X-AnyLabeling 生成的 JSON 标注数据,转换为可直接用于 YOLO 训练的标准数据集格式,并自动完成数据集结构构建与配置文件生成。
转换过程包括以下内容:
标注格式转换 将 JSON 标注转换为 YOLO 归一化的 TXT 标注格式。每个目标占一行,格式如下:
目标检测:
[class_id, x_center, y_center, width, height]实例分割:
[class_id, x1, y1, x2, y2, x3, y3, ...]姿态估计:
[class_id, x_center, y_center, width, height, x1, y1, v1, x2, y2, v2, ...]- 关键点以
(x, y, v)三元组的形式表示,其中v表示可见性(0=未标注,1=遮挡,2=可见)。
- 关键点以
旋转框检测:
[class_id, x1, y1, x2, y2, x3, y3, x4, y4]- 四个角点按顺时针顺序定义,表示定向边界框,所有坐标已归一化(0~1)。
自动划分数据集 按设定比例自动划分数据集:
train:训练集val:验证集test:测试集
构建标准目录结构 生成符合 YOLO 标准的文件夹结构,包含图片文件夹和标注文件夹。
生成 YOLO 配置文件 自动生成
data.yaml文件,包含:- 数据集路径
- 训练/验证/测试集路径
- 类别名称(
names)
目标检测
将 Labelme 标注转换为 YOLO 目标检测数据集格式。
# 待补充实例分割
将 X-AnyLabeling 标注转换为 YOLO 实例分割数据集格式。
# 待补充姿态估计
将 Labelme 标注转换为 YOLO 姿态估计数据集格式。
# 待补充旋转框检测
将 X-AnyLabeling 标注转换为 YOLO 旋转框检测数据集格式。
# 待补充YOLO 数据集规范
在本章节中,我们将介绍 YOLO 数据集的标准组织结构。根据不同的任务需求,数据集的目录结构有所不同,主要分为两大类:
此外,每个任务都需要一个 data.yaml 配置文件,它包含了数据集的路径、训练/验证/测试集的子目录信息,以及类别映射等信息。以下是各类任务的数据集目录结构和配置说明。
检测与标注任务
适用于所有需要坐标标注的任务,包括:
- 目标检测
- 实例分割
- 旋转框检测
- 姿态估计
标准结构
dataset/
├── train/
│ ├── images/
│ │ ├── 001.jpg
│ │ ├── 002.jpg
│ │ └── ...
│ └── labels/
│ ├── 001.txt
│ ├── 002.txt
│ └── ...
├── val/
│ ├── images/
│ │ ├── 001.jpg
│ │ ├── 002.jpg
│ │ └── ...
│ └── labels/
│ ├── 001.txt
│ ├── 002.txt
│ └── ...
├── test/ # 可选
│ ├── images/
│ │ ├── 001.jpg
│ │ ├── 002.jpg
│ │ └── ...
│ └── labels/
│ ├── 001.txt
│ ├── 002.txt
│ └── ...
└── data.yaml说明:
images/存放图片文件。labels/存放每张图片对应的.txt标注文件,文件内容遵循 YOLO 格式。- 图片文件和标注文件必须同名,且它们的扩展名必须分别为
.jpg(或.png等)和.txt。
这表示在 train/ 子目录下,图片 001.jpg 和对应的标注文件 001.txt 必须同名,并分别放在 images/ 和 labels/ 子目录中。
简化结构
dataset/
├── images/
│ ├── train/
│ │ ├── 001.jpg
│ │ ├── 002.jpg
│ │ └── ...
│ ├── val/
│ │ ├── 001.jpg
│ │ ├── 002.jpg
│ │ └── ...
│ └── test/ # 可选
│ ├── 001.jpg
│ ├── 002.jpg
│ └── ...
├── labels/
│ ├── train/
│ │ ├── 001.txt
│ │ ├── 002.txt
│ │ └── ...
│ ├── val/
│ │ ├── 001.txt
│ │ ├── 002.txt
│ │ └── ...
│ └── test/ # 可选
│ ├── 001.txt
│ ├── 002.txt
│ └── ...
└── data.yaml说明:
dataset/是数据集的根目录。images/目录下存放图片文件,按train/、val/和test/子目录组织。labels/目录下存放与图片对应的.txt标注文件,文件结构与images/保持一致,标注文件内容遵循 YOLO 格式。data.yaml配置文件位于根目录,包含数据集路径、训练/验证/测试集的子目录信息,以及类别映射等。
图像分类任务
图像分类任务 不需要 labels 文件夹。
类别由文件夹名称自动识别。
dataset/
├── train/ # 训练集(占比70%-80%)
│ ├── cat/ # 猫类图片
│ │ ├── 001.jpg
│ │ ├── 002.jpg
│ │ └── ...
│ ├── dog/ # 狗类图片
│ │ ├── 001.jpg
│ │ ├── 002.jpg
│ │ └── ...
│ └── car/ # 车类图片
│ ├── 001.jpg
│ ├── 002.jpg
│ └── ...
├── val/ # 验证集(占比10%-15%)
│ ├── cat/
│ │ ├── 001.jpg
│ │ ├── 002.jpg
│ │ └── ...
│ ├── dog/
│ │ ├── 001.jpg
│ │ ├── 002.jpg
│ │ └── ...
│ └── car/
│ ├── 001.jpg
│ ├── 002.jpg
│ └── ...
├── test/ # 测试集(占比10%-15%)可选
│ ├── cat/
│ │ ├── 001.jpg
│ │ ├── 002.jpg
│ │ └── ...
│ ├── dog/
│ │ ├── 001.jpg
│ │ ├── 002.jpg
│ │ └── ...
│ └── car/
│ ├── 001.jpg
│ ├── 002.jpg
│ └── ...
└── data.yaml说明
- 每个类别一个文件夹
- 文件夹名 = 类别名
- 文件夹内直接放图片
- 不需要
.txt标注文件 data.yaml文件格式参阅 图像分类的 YAML
data.yaml
YOLO 数据集的配置文件,包含数据集路径、训练/验证/测试集子目录以及类别映射。根据任务类型,配置格式略有不同。
目标检测、实例分割、旋转框检测的 YAML
这三类任务的 YAML 格式相同,共用以下配置:
标准目录结构 下的 YAML 示例:
path: coco8 # 数据集根目录
train: train/images # 训练集图片路径(相对于 path)
val: val/images # 验证集图片路径(相对于 path)
test: test/images # 测试集图片路径,可选(相对于 path)
names: # 类别映射
0: cat
1: dog
2: person参数说明:
path:数据集根目录,存放train、val、test等子目录 可以是:- 数据集文件夹名称(如
coco8,表示在默认datasets/目录下) - 绝对路径(如
G:\xxx\datasets\coco8) - 相对路径(相对于当前运行命令的工作目录)
- 数据集文件夹名称(如
train:训练集图片路径(相对于path),如train/images。YOLO 会自动去对应labels文件夹寻找同名.txt文件。val:验证集图片路径(相对于path),如val/images。test:测试集图片路径(相对于path),可选,如test/images。names:类别映射,格式为id: 类别名称。- 检测任务必填。
- 分类任务可省略,但强烈建议填写以保证类别 ID 稳定,避免后续新增类别导致 ID 变化。
简化结构 下的 YAML 示例:
path: coco8 # 数据集根目录
train: images/train # 训练集图片路径(相对于 path)
val: images/val # 验证集图片路径(相对于 path)
test: images/test # 测试集图片路径,可选(相对于 path)
names: # 类别映射
0: cat
1: dog
2: person图像分类的 YAML
path: coco8-cls # 数据集根目录
train: train # 训练集路径(相对于 path)
val: val # 验证集路径(相对于 path)
test: test # 测试集路径,可选(相对于 path)
names: # 类别映射
0: tench
1: goldfish
2: great white shark参数说明:
path、train、val、test:含义同上。names:类别映射。分类任务可省略,但强烈建议填写以保证类别 ID 稳定。
姿态估计的 YAML:
# YOLO 姿态估计数据集配置示例
path: coco8-pose # 数据集根目录
train: train/images # 训练集图片路径(相对于 path)
val: val/images # 验证集图片路径(相对于 path)
test: test/images # 测试集图片路径,可选(相对于 path)
# 关键点信息
kpt_shape: [17, 3] # 每个关键点数量及维度,17 个关键点,每个点包含 (x, y, visible)
flip_idx: [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15]
# 翻转图像时关键点对应索引,用于数据增强
# 类别信息
names: # 类别映射
0: person
# 每个类别的关键点名称
kpt_names:
0:
- nose
- left_eye
- right_eye
- left_ear
- right_ear
- left_shoulder
- right_shoulder
- left_elbow
- right_elbow
- left_wrist
- right_wrist
- left_hip
- right_hip
- left_knee
- right_knee
- left_ankle
- right_ankle参数说明
path、train、val、test:含义同检测任务。kpt_shape:每个关键点的数量及维度[num_keypoints, num_dims],用于姿态估计训练。flip_idx:图像水平翻转时关键点的索引映射,用于数据增强。names:类别映射,格式id: 类别名称。- 姿态估计通常只有一个类别
person,但也可以扩展多类别。
- 姿态估计通常只有一个类别
kpt_names:每个类别的关键点名称列表,用于训练和可视化,kpt_shape与kpt_names必须一一对应,保证训练时关键点索引正确。
实战建议
- ✔ 优先使用真实场景数据
- ✔ 图像比例尽量接近训练
imgsz - ✔ 数据少而精,不要大量低质量样本
- ✔ 标注必须规范、准确
