Ultralytics YOLO27: 加入候补名单。
Get Started
使用 Ultralytics Platform 构建·构建数据集·课程 2/10
课程中级

添加并准备数据

上传前在本地检查数据集,有计划地抽取视频帧,并确保平台数据集首次就能达到 Ready 状态。

最省钱的数据集问题,是在上传前就发现的问题。Pascal VOC 标签会被静默跳过,小于 28 像素的图像会被拒绝,而 30 分钟的视频最终只会变成 100 帧,其中大多数还是空场景。本课会介绍两分钟的上传前检查、有目的的视频抽帧,以及如何读取平台的处理状态信号,确保你的训练数据完整到位。

学习成果

你可以对本地数据集执行上传前检查,将长视频抽帧至值得标注的画面,并创建带有 Ready 徽标的平台数据集。

快速通道
如果你已经熟悉相关内容,以下是简要版。
  1. 执行上传前检查:统计各拆分中的图像和标签数量,检查过小或过大的图像、不支持的文件以及 VOC 标签。

  2. 在 Annotate 中,点击 New Dataset;选择来源、任务类型和 Private 可见性。

  3. 请自行预先抽取长视频的帧:平台每段视频最多保留 100 帧。

  4. 查看 Errors 和 Charts 选项卡,然后点击徽标,直到显示 Ready。

实践操作

创建数据集#

Ultralytics Platform 个人资料页面,显示 Datasets 选项卡、数据集卡片和 New Dataset 按钮

在侧边栏中打开 Annotate 并点击 New Dataset。对话框会要求你选择来源、名称、任务类型、可选许可证、人脸模糊处理选项和可见性:

Ultralytics Platform 新建数据集对话框,包含 Upload、URL、Cloud 和 On Premise 来源选项卡、列出可接受格式和大小限制的上传拖放区域,以及任务类型、许可证、人脸模糊处理和可见性控件

来源适用场景计划
上传文件位于你的电脑上:图像、视频、压缩包或 NDJSON 导出文件全部
URL存在公开的 .zip、.tar、.tar.gz、.tgz 或 .ndjson 链接;平台会在服务器端下载文件全部
云端数据已存储在 Google Cloud Storage、Amazon S3 或 Azure Blob Storage 中,并且应继续保留在那里Pro、Enterprise
本地部署像素数据绝不能离开你的设备Enterprise

决策规则:本课程请上传一份副本。云端和本地部署数据集会将像素数据保留在平台之外,因此无法使用智能标注、聚类、克隆和版本快照功能。

任务类型决定会显示哪些工具和模型。平台支持 Ultralytics YOLO 的全部七种任务:

任务标注方式
检测矩形框,或使用 SAM 和 YOLO 智能标注
分割多边形,或使用 SAM 和 YOLO 智能标注
语义分割多边形,或使用 SAM 和 YOLO 智能标注;可直接导入 PNG 掩码
姿态估计使用内置或自定义骨架标注关键点;使用 YOLO 姿态模型进行智能标注
OBB定向框,或使用 SAM 和 YOLO 智能标注
分类在侧边栏中选择类别
深度不绘制:上传带有配对深度图的图像(仅支持上传或 URL)

示例:上传前检查数据集#

Platform 接受 JPEG、PNG、WebP、BMP、TIFF、HEIC、AVIF、JP2、DNG 和 MPO 图像,文件大小不超过 50 MB,短边至少为 28 px;并可读取 YOLO、COCO、LabelMe、Ultralytics 或 Labelbox NDJSON,以及语义 PNG 掩码标签。系统会检测 Pascal VOC XML,但不会导入。本脚本会根据这些规则检查本地 YOLO 数据集,这里使用的是公开的医用药丸数据集:

from collections import Counter
from pathlib import Path

from PIL import Image

from ultralytics.data.utils import check_det_dataset

ACCEPTED = {".jpg", ".jpeg", ".png", ".webp", ".bmp", ".tif", ".tiff", ".heic", ".avif", ".jp2", ".dng", ".mpo"}
data = check_det_dataset("medical-pills.yaml")  # your local dataset YAML
root = Path(data["path"])

problems = Counter()
for split in ("train", "val", "test"):
    if not data.get(split):
        continue
    files = [p for p in Path(data[split]).rglob("*") if p.is_file()]
    images = [p for p in files if p.suffix.lower() in ACCEPTED]
    labeled = 0
    for img in images:
        label = Path(str(img).replace("images", "labels")).with_suffix(".txt")
        labeled += label.exists() and label.stat().st_size > 0
        if min(Image.open(img).size) < 28:
            problems["under 28 px (rejected)"] += 1
        if img.stat().st_size > 50 * 1024**2:
            problems["over 50 MB (rejected)"] += 1
    problems["unsupported files (skipped)"] += len(files) - len(images)
    print(f"{split:<5} {len(images):>4} images, {labeled:>4} labeled, {len(images) - labeled:>3} background")
problems["Pascal VOC .xml labels (not imported)"] += len(list(root.rglob("*.xml")))
print("classes:", data["names"])
print("problems:", {k: v for k, v in problems.items() if v} or "none")
train   92 images,   92 labeled,   0 background
val     23 images,   23 labeled,   0 background
classes: {0: 'pill'}
problems: none

输出说明:

  • 各数据集拆分的数量。 train/、val/ 和 test/ 文件夹中的图像上传后会保留对应的数据集拆分,因此这些数量就是 Platform 上显示的数量。如果没有 val 这一行,Platform 就会为你随机划分验证集(见下方的注意事项)。
  • 背景图像(没有标签文件)适量使用没有问题;它们能让模型学会“这里什么都没有”的样子。背景图像有数百张时,通常意味着标签导出失败。
  • problems: none 表示每张图像都会被处理。这里显示的任何数量,都代表文件将进入 Errors 选项卡或根本不会上传成功。

将数据集文件夹及其 data.yaml 打包成 ZIP,然后把压缩包拖到图库中。Platform 会自动检测格式,只存储一次相同图像;如果上传内容与数据集中已有图像冲突,Platform 会询问你要跳过、同时保留还是替换。

示例:在 Platform 处理视频前先抽帧#

Platform 会以每秒 1 帧的频率抽取每段视频,最多保留 100 帧;对于超过 100 秒的片段,会增大抽帧间隔:

片段时长保留帧数间隔
60 秒601 秒
100 秒1001 秒
30 分钟(30 fps 下共 54,000 帧)10018 秒

这适合快速查看,却不适用于大多数真实项目:一段 30 分钟的轮班录像会变成 100 帧,而且大多是空荡荡的通道。请自行抽取长视频的帧,然后上传这些帧:

均匀抽帧只需 FFmpeg:

mkdir -p frames
ffmpeg -i source.mp4 -vf fps=1 frames/%06d.jpg

如需按事件抽帧,可以让预训练的 Ultralytics YOLO 模型只保留包含目标对象的帧:

from pathlib import Path

import cv2

from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # or your latest fine-tune
out = Path("frames")
out.mkdir(exist_ok=True)

source = "https://github.com/ultralytics/assets/releases/download/v0.0.0/solutions_ci_demo.mp4"
seen = kept = 0
for i, result in enumerate(model.predict(source, stream=True, vid_stride=5, classes=[0], conf=0.5, verbose=False)):
    seen += 1
    if len(result.boxes):  # keep only frames where a person was detected
        cv2.imwrite(str(out / f"frame_{i:05d}.jpg"), result.orig_img)
        kept += 1
print(f"Kept {kept} of {seen} sampled frames")
Kept 12 of 12 sampled frames

vid_stride=5 会每隔五帧查看一次,classes=[0] 会将检测范围限制为人,conf=0.5 会忽略置信度较低的预测。这个繁忙的演示片段中,每个抽取的帧都有人;而在大部分场景空荡荡的录像中,保留帧的比例会大幅下降,你的标注费用也会随之降低。逐步调高 vid_stride,直到相邻的保留帧不再看起来一模一样。

解读 Platform 的处理状态#

上传后,Platform 会验证并规范化数据(超过 4,096 px 的图像会调整尺寸)、生成缩略图、解析标签并计算统计信息。请检查以下三个位置:

Ultralytics Platform 数据集页面,打开了 Errors 选项卡,横幅显示有 1 张图像处理失败,表格行显示“无法读取图像文件”以及修复提示

  • 只有文件处理失败时才会出现 Errors 选项卡:其中会列出损坏文件、不支持的格式、尺寸小于 28 px 的图像,以及 CMYK 和索引颜色模式的图像,并为每项提供修复提示。请重新导出或重新上传这些文件。
  • Charts 选项卡会显示数据集拆分分布、主要类别、图像尺寸、文件大小、标注位置、框的尺寸以及每张图像中的对象数量。请留意出现频率极低的类别、尺寸过小的图像,或集中在某个角落的框。
  • 处理完成且数据集中至少有一张 train 图像、一张 val 或 test 图像,以及一张带标签的图像后,数据集标题中的徽章会显示 Ready。点击 Not Ready 查看缺少哪项条件。

Ultralytics Platform 医用药丸数据集的 Charts 选项卡,显示拆分分布和主要类别环形图,以及图像尺寸和图像文件大小直方图

从公开数据集开始#

Ultralytics Platform 的 Clone Dataset 对话框,显示公开施工 PPE 数据集,以及新名称、URL 别名、说明、任务类型、许可证和可见性开关字段

还没有数据?探索页面列出了官方和社区数据集。克隆数据集会将图像、标注和类别复制到你的工作区,占用你的存储空间,并默认保留源数据集的公开可见性;如果你要添加任何敏感内容,请在对话框中关闭可见性开关。

常见问题#

Pascal VOC 标签悄无声息地消失

症状:上传成功,但所有图像都没有标签。解决方法:Platform 能检测到 Pascal VOC XML,但不会导入。请先转换为 YOLO .txt 标签或 COCO JSON;上传前检查会统计 .xml 文件,让你在上传前发现这个问题。

自动验证集划分会导致视频帧泄漏

症状:验证 mAP 很高,部署后的模型表现却不佳。解决方法:如果上传时未选择划分方式,且 val 为空,Platform 会随机将约 20% 的训练图像移到 val。对于视频帧,这会让几乎相同的相邻帧分散到两个划分中。请上传到按视频或摄像头划分的 train/ 和 val/ 文件夹(课程 4)。

找不到标注工具

症状:你找不到多边形工具或关键点工具。解决方法:工具由任务类型决定。请在数据集页眉中更改任务类型;每张图像都会存储各任务的标签,因此切换任务只会隐藏其他任务的标签,不会删除它们。

试试看

在你自己的数据集(或医用药丸数据集)上运行 preflight.py,并修复它报告的所有问题。然后创建一个私有 Platform 数据集,上传该数据集和一段视频;查看图库前,先根据表格预测视频会生成多少帧。

完成条件
满足以下所有条件,即表示你已完成本课程。
  • preflight.py 会在你上传的数据集上报告 problems: none。

  • 图库中的图像数量等于你的图像数量加上你预测的视频帧数。

  • 数据集标题显示 Ready,或者你已准确记下缺少哪项条件。

显示解答

医用药丸数据集加一段 4 分钟线扫相机视频的示例答案。上传前检查:92 张训练图像和 23 张验证图像,均带标签,没有问题。视频:时长 240 秒,超过 100 秒,因此间隔增至 ceil(240 / 100) = 3 秒,Platform 会保留 80 帧(0 秒、3 秒、……、237 秒各一帧)。图库中的预期图像数量:92 + 23 + 80 = 195 张。视频帧会以无标签状态进入图库筛选器中选定的数据集拆分;因此,拖入视频前请选择训练集,以免这些帧进入验证集。训练集、验证集和带标签图像都存在,因此徽章显示 Ready。如果你只上传了视频,徽章会显示 Not Ready:目前还没有带标签的图像。

接下来做什么

接下来,你将使用模型预标注图像,并衡量不同置信度阈值会带来多少审核工作。

登录以保存学习进度