跳转到内容

YOLO 数据集获取与制作指南

更新: 2026/3/2 字数: 0 字 时长: 0 分钟


数据集获取方式

免费公开数据集网站


成品数据集购买

  • 淘宝
  • 咸鱼

📌 注意事项:

  • 常见问题:格式不统一
  • 很多数据集不是 YOLO 标准格式,需要自行转换

付费代标注服务

  • 各大企业标注平台(百度、阿里、京东等)
  • 自由职业标注(淘宝、猪八戒、QQ群)

📌 优点:效率高 📌 缺点:成本较高


素材采集方法

手机截图(手动采集)

直接通过系统截图保存素材,用于少量数据采集或补充样本。


手机自动化循环截图

👉 每秒截图一次,共截图 100 次

js

// 申请截图权限
$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("截图采集完成!");

手机录屏转图片

操作步骤:

  1. 打开 Bot.js Pro 推理工具
  2. 选择视频源(本地视频或录屏文件)
  3. 随便选择一个模型(仅用于触发推理)
  4. 勾选 保存源帧
  5. 点击开始推理
  6. 推理完成后点击保存

📌 系统会自动将视频拆分为连续图片帧


Python 视频转图片(Windows 示例)

功能说明:

  • .py 文件同级目录创建 images/ 文件夹
  • 输出图片名称格式:
视频名_0001.jpg
视频名_0002.jpg
...

新建文件:video_to_images.py

python
# 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 版本:

⚠ 首次使用 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 版本:

⚠ 首次使用 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 目标检测数据集格式。

python
# 待补充

实例分割

X-AnyLabeling 标注转换为 YOLO 实例分割数据集格式。

python
# 待补充

姿态估计

Labelme 标注转换为 YOLO 姿态估计数据集格式。

python
# 待补充

旋转框检测

X-AnyLabeling 标注转换为 YOLO 旋转框检测数据集格式。

python
# 待补充

YOLO 数据集规范

在本章节中,我们将介绍 YOLO 数据集的标准组织结构。根据不同的任务需求,数据集的目录结构有所不同,主要分为两大类:

  • 检测与标注任务:需要 labels 文件夹,包含坐标标注(含目标检测、实例分割、旋转框检测、姿态估计)。
  • 图像分类任务:不需要 labels 文件夹,分类任务通过文件夹名称来识别类别。

此外,每个任务都需要一个 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 示例:

yaml
path: coco8                     # 数据集根目录
train: train/images             # 训练集图片路径(相对于 path)
val: val/images                 # 验证集图片路径(相对于 path)
test: test/images               # 测试集图片路径,可选(相对于 path)

names:                          # 类别映射
  0: cat
  1: dog
  2: person

参数说明:

  • path:数据集根目录,存放 trainvaltest 等子目录 可以是:
    • 数据集文件夹名称(如 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 示例:

yaml
path: coco8                     # 数据集根目录
train: images/train             # 训练集图片路径(相对于 path)
val: images/val                 # 验证集图片路径(相对于 path)
test: images/test               # 测试集图片路径,可选(相对于 path)

names:                          # 类别映射
  0: cat
  1: dog
  2: person

图像分类的 YAML

yaml
path: coco8-cls                          # 数据集根目录
train: train                            # 训练集路径(相对于 path)
val: val                                # 验证集路径(相对于 path)
test: test                              # 测试集路径,可选(相对于 path)

names:                                  # 类别映射
  0: tench
  1: goldfish
  2: great white shark

参数说明:

  • pathtrainvaltest:含义同上。
  • names:类别映射。分类任务可省略,但强烈建议填写以保证类别 ID 稳定。

姿态估计的 YAML:

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

参数说明

  • pathtrainvaltest:含义同检测任务。

  • kpt_shape:每个关键点的数量及维度 [num_keypoints, num_dims],用于姿态估计训练。

  • flip_idx:图像水平翻转时关键点的索引映射,用于数据增强。

  • names:类别映射,格式 id: 类别名称

    • 姿态估计通常只有一个类别 person,但也可以扩展多类别。
  • kpt_names:每个类别的关键点名称列表,用于训练和可视化, kpt_shapekpt_names 必须一一对应,保证训练时关键点索引正确。


实战建议

  • ✔ 优先使用真实场景数据
  • ✔ 图像比例尽量接近训练 imgsz
  • ✔ 数据少而精,不要大量低质量样本
  • ✔ 标注必须规范、准确