Ultralytics YOLO27: Встать в лист ожидания.
Get Started
Создание решений на Ultralytics Platform·Создай датасет·Урок 2/10
Уроксредний

Добавь и подготовь данные

Проверь локальный датасет перед загрузкой, продуманно выбери кадры из видео и добейся, чтобы датасет на платформе с первой попытки получил статус Ready.

Ошибка в датасете обходится дешевле всего, если обнаружить её до загрузки. Метки Pascal VOC незаметно пропускаются, изображения размером меньше 28 пикселей отклоняются, а из 30-минутного видео получается всего 100 кадров, большинство из которых показывают пустую сцену. В этом уроке ты выполнишь двухминутную проверку перед загрузкой, целенаправленно выберешь кадры из видео и изучишь сигналы обработки на платформе, чтобы твои обучающие данные поступили полностью.

Результат

Ты умеешь проверять локальный датасет перед загрузкой, сокращать длинное видео до кадров, достойных разметки, и создавать датасет на платформе, отмеченный значком Ready.

Ускоренное прохождение
Если ты уже освоился, вот краткая версия.
  1. Проведи проверку перед загрузкой: посчитай изображения и метки в каждом разделе, найди слишком маленькие или большие изображения и неподдерживаемые файлы, проверь метки VOC.

  2. В Annotate нажми New Dataset; выбери источник, тип задачи и приватную видимость.

  3. Заранее выбери кадры из длинных видео: платформа сохраняет не более 100 кадров на видео.

  4. Открой вкладки Errors и Charts, затем нажимай на значок, пока он не покажет Ready.

Практические занятия

Создай датасет#

Страница профиля Ultralytics Platform: вкладка Datasets с карточками датасетов и кнопкой New Dataset

Открой Annotate на боковой панели и нажми New Dataset. В диалоге нужно указать источник, название, тип задачи, необязательную лицензию, размытие лиц и видимость:

Диалог New Dataset в Ultralytics Platform: вкладки источников Upload, URL, Cloud и On Premise, область загрузки с перечнем поддерживаемых форматов и ограничений по размеру, а также элементы управления Task Type, License, Blur faces и Visibility

ИсточникКогда использоватьПлан
ЗагрузкаФайлы находятся на твоём компьютере: изображения, видео, архивы или экспорты NDJSONВсе разделы
URLЕсть общедоступная ссылка .zip, .tar, .tar.gz, .tgz или .ndjson; платформа скачивает данные на серверВсе разделы
ОблакоДанные уже хранятся в Google Cloud Storage, Amazon S3 или Azure Blob Storage и должны остаться тамPro, Enterprise
Локальное развёртываниеДанные изображений ни при каких условиях не должны покидать твои устройстваEnterprise

Правило принятия решения: для этого курса загрузи копию. Для датасетов из Cloud и On Premise данные изображений остаются вне платформы, поэтому умная аннотация, кластеризация, клонирование и снимки версий для них недоступны.

Тип задачи определяет, какие инструменты и модели будут доступны. Платформа поддерживает все семь задач Ultralytics YOLO:

ЗадачаКак размечать
ДетекцияПрямоугольник либо умная аннотация с помощью SAM и YOLO
СегментацияПолигон либо умная аннотация с помощью SAM и YOLO
Семантическая сегментацияПолигон либо умная аннотация с помощью SAM и YOLO; маски PNG импортируются напрямую
Оценка позыКлючевые точки на встроенных или пользовательских скелетах; модели YOLO для оценки позы обеспечивают умную аннотацию
OBBОриентированный прямоугольник либо умная аннотация с помощью SAM и YOLO
КлассификацияВыбор класса на боковой панели
ГлубинаБез рисунков: загрузи изображения с соответствующими картами глубины (только загрузка или URL)

Пример: проверь датасет перед загрузкой#

Платформа принимает изображения JPEG, PNG, WebP, BMP, TIFF, HEIC, AVIF, JP2, DNG и MPO размером до 50 МБ и не менее 28 пикселей по короткой стороне, а также распознаёт метки форматов YOLO, COCO, LabelMe, Ultralytics или Labelbox NDJSON и семантические PNG-маски. Файлы Pascal VOC XML распознаются, но не импортируются. Этот скрипт проверяет локальный датасет YOLO на соответствие этим правилам; в примере используется общедоступный датасет medical pills:

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/ сохранят принадлежность к этой выборке при загрузке — именно эти числа отобразит Платформа. Если строки val нет, Платформа случайным образом создаст для тебя валидационную выборку (см. ниже, в разделе о подводных камнях).
  • Фоновые изображения (без файла с метками) допустимы в умеренном количестве: они помогают модели понять, как выглядит «здесь ничего нет». Если их сотни, скорее всего, метки не экспортировались.
  • problems: none означает, что обработка изображений не завершена. Здесь указано количество файлов, которые попадут на вкладку Errors или не будут загружены вовсе.

Заархивируй папку датасета вместе с data.yaml и перетащи архив в галерею. Платформа автоматически определит формат, сохранит одинаковые изображения только один раз и при конфликте с уже имеющимися в датасете изображениями предложит Пропустить, Оставить оба или Заменить.

Пример: проверь видео перед обработкой на Платформе#

Платформа выбирает из каждого видео по одному кадру в секунду и сохраняет не более 100 кадров. Для роликов длиннее 100 секунд интервал увеличивается:

Длительность роликаСохранено кадровИнтервал
60 секунд601 секунда
100 секунд1001 секунда
30 минут (54 000 кадров при 30 кадрах/с)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, пока соседние сохранённые кадры не перестанут выглядеть одинаково.

Как читать сигналы обработки на Платформе#

После загрузки Платформа проверяет и нормализует данные (изображения больше 4 096 пикселей уменьшаются), создаёт миниатюры, обрабатывает метки и вычисляет статистику. Проверь три места:

Страница датасета Ultralytics Platform с открытой вкладкой Errors: баннер сообщает, что не удалось обработать 1 изображение, а в строке таблицы указано Unable to read image file и рекомендация по исправлению

  • Вкладка Errors появляется только при ошибках обработки файлов: повреждённых файлах, неподдерживаемых форматах, изображениях меньше 28 пикселей, а также изображениях в режимах CMYK и индексированных цветов. Для каждой ошибки есть подсказка по исправлению. Экспортируй эти файлы заново или загрузи их повторно.
  • На вкладке Charts показаны распределение по выборкам, наиболее распространённые классы, размеры изображений и файлов, расположение аннотаций, размеры рамок и количество объектов на изображение. Обрати внимание на редко встречающиеся классы, крошечные изображения и рамки, сгруппированные в одном углу.
  • Значок в заголовке датасета показывает Ready после завершения обработки, если в датасете есть хотя бы одно изображение из train, одно изображение из val или test и одно изображение с меткой. Нажми Not Ready, чтобы узнать, какое условие не выполнено.

Вкладка Charts в Ultralytics Platform для датасета medical-pills: кольцевые диаграммы Split Distribution и Top Classes, а также гистограммы Image Dimensions и Image File Size

Начни с общедоступного датасета#

Диалог Clone Dataset в Ultralytics Platform для общедоступного датасета по средствам индивидуальной защиты на стройке: поля для нового имени, URL-слага, описания, типа задачи и лицензии, а также переключатель видимости

Пока нет данных? На странице Explore перечислены официальные датасеты и датасеты сообщества. Функция Clone Dataset копирует изображения, аннотации и классы в твою рабочую область, учитывает их в объёме хранилища и по умолчанию сохраняет общедоступность исходного датасета. Поэтому, если ты собираешься добавить конфиденциальные данные, переключи соответствующий параметр в диалоге.

Подводные камни#

Метки Pascal VOC исчезают без предупреждения

Симптом: загрузка завершается успешно, но все изображения оказываются без меток. Решение: Platform обнаруживает файлы Pascal VOC XML и не импортирует их. Сначала преобразуй их в метки YOLO .txt или JSON COCO; предварительная проверка перед загрузкой подсчитывает файлы .xml, чтобы ты заметил проблему до загрузки.

Автоматическое разделение на обучающую и валидационную выборки распределяет кадры одного видео по обеим выборкам

Симптом: mAP на валидации отличный, а развёрнутая модель работает плохо. Решение: если при загрузке без выбранного разделения папка val пуста, Platform случайным образом переносит около 20% обучающих изображений в val. Для видеокадров в результате почти одинаковые соседние кадры оказываются в обеих выборках. Вместо этого загружай данные в папки train/ и val/, разделив их по видео или камерам (урок 4).

Инструменты аннотирования отсутствуют

Симптом: ты не можешь найти инструмент для полигонов или ключевых точек. Решение: набор инструментов определяется типом задачи. Измени тип в заголовке датасета; для каждого изображения хранятся метки всех задач, поэтому при переключении метки других задач скрываются, а не удаляются.

Попробовать

Запусти preflight.py на своём датасете (или на medical pills) и исправь все обнаруженные проблемы. Затем создай на Платформе приватный датасет, загрузи его и одно видео. До проверки галереи спрогнозируй по таблице, сколько кадров будет извлечено из видео.

Критерии готовности
Урок считается завершённым, если выполнены все условия ниже.
  • preflight.py сообщает problems: none для загруженного датасета.

  • В галерее отображается общее количество изображений: исходные изображения плюс спрогнозированные кадры из видео.

  • В заголовке датасета отображается Ready либо ты точно записал, какое условие не выполнено.

Показать решение

Пример решения: датасет medical pills и 4-минутное видео с линейной камеры. Проверка перед загрузкой: 92 изображения для обучения и 23 для валидации, все размечены, проблем нет. Длительность видео — 240 секунд, это больше 100 секунд, поэтому интервал увеличивается до ceil(240 / 100) = 3 секунд, а Платформа сохраняет 80 кадров (по одному в 0 с, 3 с, …, 237 с). Ожидаемое количество изображений в галерее: 92 + 23 + 80 = 195. Кадры из видео загружаются без меток в выборку, выбранную фильтром галереи. Чтобы они не попали в валидационную выборку, выбери Train перед загрузкой видео. Значок показывает Ready, поскольку в датасете есть изображения для обучения, для валидации и с метками. Если бы ты загрузил только видео, значок показывал бы Not Ready: размеченных изображений ещё нет.

Что дальше

Далее ты автоматически разметишь изображения моделью и оценишь, сколько работы по проверке создаёт каждый порог уверенности.

Войди, чтобы сохранять прогресс