Link to this sectionИнтеграция с Labelbox#
Ultralytics Platform читает экспорт NDJSON из Labelbox напрямую. Не нужно вставлять ключи, поддерживать соединение или сценарии конвертации: экспортируй из Labelbox, загружай файл, и твои разметки появятся как обычный датасет на платформе.
Link to this sectionИмпорт из Labelbox#
- Экспорт из Labelbox. Открой проект разметки или каталог, который хочешь перенести, и перейди на вкладку Data Rows. Выбери All, нажми Export data, укажи нужные поля и подтверди. Экспортируешь из каталога, а не из проекта? Включи параметр Export labels from project и выбери проект, иначе файл придет вообще без аннотаций.
- Скачай файл. Labelbox выполняет экспорт как фоновую задачу. Следи за ней в уведомлениях и по завершении нажми Download, чтобы сохранить файл
.ndjson. - Загрузка на платформу. Создай новый датасет и загрузи файл
.ndjsonлибо вставь прямую ссылку на него. Также можно начать с раздела Settings > Integrations > Labelbox. - Обучение. После завершения обработки отредактируй аннотации и запусти обучение точно так же, как для любого другого датасета платформы.
В отличие от CVAT и Label Studio, здесь не нужно выбирать формат — поддерживается собственный экспорт Labelbox.
Link to this sectionЭкспорт с помощью SDK#
Labelbox также предлагает задачу экспорта в своем Python SDK, что проще для повторяемого конвейера. Передавай задачу потоком и записывай по одному объекту JSON на строку:
import json
import labelbox
client = labelbox.Client(api_key="YOUR_LABELBOX_API_KEY")
export_task = labelbox.ExportTask.get_task(client, "YOUR_EXPORT_TASK_ID")
export_task.wait_till_done() # streaming a task that isn't COMPLETE raises
with open("dataset.ndjson", "w") as f:
f.writelines(json.dumps(data_row.json) + "\n" for data_row in export_task.get_buffered_stream())NDJSON — это один объект JSON на строку. Команда json.dump(list_of_rows, f) записывает единый массив, и платформа пропускает любые строки, не являющиеся объектами JSON, в результате импорт не найдет ни одной строки данных. Используй цикл выше или "\n".join(json.dumps(r) for r in rows).
Link to this sectionЧто импортируется#
Платформа самостоятельно распознает формат Labelbox и сопоставляет ограничивающие рамки и полигоны с соответствующим типом задач YOLO:
| Аннотация Labelbox | Импортировано |
|---|---|
| Ограничивающая рамка | Detect |
| Полигон | Segment |
| Маска сегментации, точка, полилиния, связь, классификация | Пока нет |
Поле name каждого объекта становится именем класса — то есть аннотация "name": "Dog" импортируется как класс Dog, а не его строчное значение value, — а координаты пикселей нормализуются относительно размеров media_attributes в экспорте. Экспорт каталога без аннотаций импортируется как неразмеченный набор изображений, готовый к разметке в редакторе аннотаций платформы.
Одна строка данных выглядит следующим образом, обрезанная до полей, которые читает платформа:
{
"data_row": {
"external_id": "000000000307.jpg",
"row_data": "https://storage.labelbox.com/...?Expires=...&Signature=..."
},
"media_attributes": { "height": 480, "width": 640, "mime_type": "image/jpeg" },
"projects": {
"<project-id>": {
"labels": [
{
"annotations": {
"objects": [
{
"name": "Dog",
"annotation_kind": "ImageBoundingBox",
"bounding_box": { "top": 200.0, "left": 407.0, "height": 172.0, "width": 176.0 }
}
]
}
}
]
}
}
}Все остальное в экспорте — embeddings, metadata_fields, attachments, project_details — игнорируется. Эмбеддинги стоит отключать при экспорте: в тестовом экспорте они занимали около четырех пятых файла, в то время как на поля, которые читает платформа, приходилась лишь пятая часть.
На данный момент считываются только ограничивающие рамки и полигоны, и только из объектных аннотаций — классификации на уровне изображения находятся в других частях экспорта и пропускаются. Проект, размеченный исключительно с помощью инструмента маски сегментации (кисти), точек, полилиний или классификаций, импортирует свои изображения, но без аннотаций, причем ошибки не возникает. Это легко заметить на странице датасета: импортированный датасет, сохранивший метки, отображает количество размеченных объектов и аннотаций рядом с количеством изображений, а потерявший их — не отображает ничего.
Экспорт из Labelbox ссылается на каждое изображение по подписанному URL вместо внедрения пикселей, а срок действия этих подписей истекает. Платформа скачивает изображения по этим URL, предварительно проверяя выборку, поэтому экспорт с полностью устаревшими ссылками завершится ошибкой сразу же с указанием причины — сделай повторный экспорт из Labelbox и загрузи новый файл. Экспорт с частично истекшими ссылками импортирует те изображения, до которых все еще может достучаться, и пропустит остальные, поэтому выполняй загрузку вскоре после экспорта.
Экспорт, содержащий как ограничивающие рамки, так и полигоны, импортируется как датасет сегментов, а датасет сегментов поддерживает только геометрию полигонов — аннотации рамок не используются для обучения и не включаются в экспорт версий. Если нужны оба типа, экспортируй рамки и полигоны как отдельные проекты Labelbox. Кроме того, для чтения полигонов требуется не менее трех точек.