Переглянути як Markdown

Датасети

Датасет LibreYOLO задається файлом YAML із кореневим каталогом, частинами та назвами класів. Усе інше, зокрема розташування файлів міток, виводиться з цього файлу за домовленістю.

Передавання датасету до train

Параметр data= приймає шлях до YAML або назву конфігурації, що постачається з пакетом.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # Працює вбудована назва, відносний або абсолютний шлях.model.train(data="coco8.yaml", epochs=10)
CLI
libreyolo train model=LibreYOLO9s.pt data=coco8.yaml epochs=10

Назва розв'язується у фіксованому порядку: наявний абсолютний шлях, потім указана назва відносно робочого каталогу, далі та сама назва з доданим .yaml, а потім каталог вбудованих конфігурацій. Якщо збігів немає, у повідомленні про помилку перелічуються всі перевірені каталоги та вбудовані конфігурації.

Вбудовані конфігурації

Пакет містить тринадцять конфігурацій датасетів у каталозі libreyolo/config/datasets/.

КонфігураціяЗадачаПримітки
coco8.yamldetect8 зображень, завантаження за прямим URL
coco128.yamldetect128 зображень
coco1000.yamldetect800 train, 200 val
coco5000.yamldetect4000 train, 1000 val
coco.yamldetectповний COCO 2017
coco-val-only.yamldetectлише val2017
coco8-pose.yamlpose8 зображень, ключові точки COCO-17
coco-pose.yamlposeключові точки COCO 2017
ade20k.yamlsemantic150 класів
cityscapes.yamlsemantic19 класів, завантаження вручну
cocostuff.yamlsemantic182 класи, завантаження вручну
gopro.yamlrestoreпари для усунення розмиття
sr8.yamlrestoreпари для підвищення роздільної здатності

Лише coco8.yaml і coco128.yaml містять прямий URL завантаження. Решта або містять блок завантаження Python, що потребує описаної нижче явної згоди, або очікують, що дані вже є на диску.

Розташування датасету на диску

Ключ path у YAML задає кореневий каталог датасету. Абсолютний path використовується без змін. Відносний шлях спочатку шукається в каталозі датасетів, а потім поруч із самим файлом YAML. Датасет, який потрібно завантажити, розміщується в каталозі датасетів.

Цим каталогом є ~/datasets, а змінна середовища LIBREYOLO_DATASETS_DIR може перевизначити його. Окремого файлу налаштувань для цього немає.

Ключі YAML

yaml
path: my-dataset        # кореневий каталог датасету
train: images/train     # обов'язково для навчання
val: images/val         # обов'язково для валідації
test: images/test       # необов'язково
nc: 3                   # необов'язково; має відповідати names
names:
  0: person
  1: helmet
  2: vest
download: https://example.com/my-dataset.zip   # необов'язково

Кожен із ключів train, val і test приймає каталог зображень, файл .txt з одним шляхом до зображення в кожному рядку або список, що поєднує обидва варіанти. Рядки списку .txt можуть бути відносними, тоді вони розв'язуються відносно власного каталогу файлу списку, а рядки, що починаються з #, пропускаються.

names може бути списком або відображенням із цілочисловими ключами. Ключ nc необов'язковий; якщо наявні обидва ключі та їхні значення не узгоджуються, doctor повідомляє про помилку.

Структура каталогів і файли міток

Виявлення, сегментація, поза й орієнтовані рамки використовують одну структуру. Шлях до мітки виводиться зі шляху до зображення заміною компонента каталогу images на labels і розширення на .txt:

my-dataset/
  images/train/0001.jpg   ->   labels/train/0001.txt
  images/val/0002.jpg     ->   labels/val/0002.txt

Замінюється лише цілий компонент шляху images, тому каталог із назвою images_old залишається без змін.

Рядок виявлення містить п'ять полів, усі нормалізовані до [0, 1] відносно ширини й висоти початкового зображення:

<class_id> <cx> <cy> <w> <h>

Відсутній або порожній файл міток означає, що на зображенні немає об'єктів. Воно навчається як фон без породження помилки. Рядок із понад п'ятьма полями читається як полігон, а його рамкою стає межа полігона, тому експорт сегментації, використаний для навчання виявлення, завантажується без заперечень. Doctor повідомляє, скільки рядків було оброблено цим шляхом.

Інші задачі

Сегментація зберігає ту саму структуру з рядками полігонів <class_id> <x1> <y1> ... <xN> <yN>, що містять щонайменше три точки. Рядок виявлення з п'ятьма полями також приймається й означає прямокутний екземпляр.

Для пози до YAML додаються kpt_shape: [K, D] і необов'язкова перестановка flip_idx. Кожен рядок містить точно 5 + K * D полів: рамку, а потім K ключових точок у формі x y або x y v, де видимість дорівнює 0, 1 або 2.

Орієнтовані рамки використовують точно дев'ять полів: клас і чотири кутові точки в нормалізованих координатах. Кут у файлі не зберігається.

Семантична сегментація поєднує кожне зображення з одноканальною маскою такої самої роздільної здатності, знайденою заміною images на masks_dir (типово masks). Значення пікселя 255 означає ігнорування. Під час завантаження label_mapping перетворює початкові ідентифікатори на навчальні.

Класифікація використовує дерево ImageFolder замість файлів міток, де каталоги train/ і val/ містять по одному каталогу на клас. Відображення класу на індекс визначається відсортованим порядком назв каталогів.

Відновлення поєднує погіршені вхідні дані з чистою ціллю такої самої роздільної здатності через input_dir і target_dir. Для глибини, нормалей поверхні та країв кожне зображення так само поєднується зі щільною картою через власний ключ каталогу.

Повний контракт для кожної задачі, зокрема угоди про масштаб глибини та кодування PNG з ідентифікаторами паноптичних сегментів, наведено у docs/dataset_schema.md в репозиторії бібліотеки.

Нативний COCO JSON

Файл анотацій COCO JSON можна використовувати безпосередньо. Додайте відображення annotations, після чого шлях частини стане кореневим каталогом зображень:

yaml
path: my-dataset
train: images/train
val: images/val
annotations:
  train: annotations/train.json
  val: annotations/val.json

Якщо наявний ключ names, назви категорій JSON мають відповідати йому, а names визначає ідентифікатори міток, які передбачає модель. Без names ідентифікатори категорій COCO сортуються й щільно відображаються на 0..N-1.

Цей шлях очікує по одному каталогу зображень на частину. Список шляхів або список зображень .txt породжує помилку замість непомітного завантаження іншого набору.

Автоматичне завантаження

Датасет вважається наявним, коли його шлях train або val розв'язується в непорожній каталог або наявний файл. Якщо цього не сталося, а YAML містить ключ download, його значення визначає подальшу дію.

URL http або https завантажується, а архів zip розпаковується до кореневого каталогу датасету. Будь-яке інше значення розглядається як вбудований скрипт Python і запускається лише за allow_download_scripts=True. Без цього скрипт пропускається з попередженням, а навчання продовжується з наявними на диску даними.

bash
libreyolo train model=LibreYOLO9s.pt data=coco.yaml allow_download_scripts=true

Прапорець дозволяє виконання коду, а не доступ до мережі. Завантаження за URL виконується за будь-яких умов; дозвіл потрібен саме блокам download: |. Коли прапорець увімкнено, CLI виводить попередження, а doctor ніколи не вмикає його.

Перевірка датасету перед навчанням

Команда libreyolo doctor читає датасет виявлення й повідомляє про проблеми до залучення GPU. За наявності помилок вона завершується з кодом 1, тому придатна як шлюз CI.

Перевірити датасет
libreyolo doctor my-dataset.yaml
Вважати попередження помилкою в CI
libreyolo doctor my-dataset.yaml strict=true json=true
Пропустити декодування зображень
# Читає лише мітки й YAML. Перевірки пошкоджень, дублікатів і витоків між# частинами потребують пікселів, тому їх пропущено.libreyolo doctor my-dataset.yaml fast=true
Python
from libreyolo import doctor report = doctor.diagnose("my-dataset.yaml", imgsz=640) for finding in report.findings:    print(finding.severity.value, finding.check_id, finding.message) raise SystemExit(report.exit_code(strict=False))

Перевірки поділяються на шість сімейств:

СімействоЩо шукає
configвідсутній names, невідповідність nc і names, відсутні чи порожні частини, дублікати назв класів
filesзображення без файлу міток, мітки без зображення, відсутні зображення зі списку частини, збіги основ назв
labelsнеправильно сформовані рядки, ідентифікатори класів поза [0, nc), координати поза [0, 1], рамки нульової площі, надто малі чи великі рамки, дублікати рамок, побайтово однакові файли міток
balanceкласи без екземплярів або з малою їх кількістю, коефіцієнт дисбалансу класів, класи лише в одній частині, частка фонових зображень
imagesфайли, що не декодуються, поворот EXIF, незвичні структури каналів, однорідні зображення, точні й близькі дублікати
splitsте саме або майже ідентичне зображення у двох частинах

--only і --skip приймають ідентифікатор перевірки або префікс сімейства, тому skip=images,labels.tiny_object є дійсним. --fast відкидає кожну перевірку, що потребує декодування пікселів, тобто сімейства images і splits.

Варто знати дві особливості. --strict робить попередження причиною ненульового коду завершення так само, як і помилки. Крім того, doctor підтримує лише датасети виявлення: датасет пози, сегментації або орієнтованих рамок відхиляється з повідомленням про розпізнаний тип, а не перевіряється за неправильним контрактом.

Пов'язані матеріали

Перевірено з LibreYOLO v1.5.0.