Интеграция с Labelbox#
Ultralytics Platform напрямую читает экспорт Labelbox в формате NDJSON. Не нужно вставлять ключ, поддерживать соединение или обслуживать скрипт конвертации — экспортируй данные из Labelbox, загрузи файл, и твои аннотации появятся как обычный датасет в Платформе.
Импорт из Labelbox#
- Экспорт из Labelbox. Открой проект разметки или каталог, который хочешь перенести, и перейди на вкладку Data Rows. Выбери All, нажми Export data, укажи нужные поля и подтверди действие. Экспортируешь данные из каталога, а не из проекта? Включи Export labels from project и выбери проект, иначе файл будет полностью без аннотаций.
- Скачивание файла. Labelbox выполняет экспорт в фоновом режиме. Найди его в разделе Notifications и нажми Download, когда он будет готов, чтобы сохранить файл
.ndjson. - Загрузка в Платформу. Создай новый датасет и загрузи файл
.ndjsonили вставь прямую ссылку на него. Также можно начать с раздела Settings > Integrations > Labelbox. - Обучение. После завершения обработки отредактируй аннотации и запусти обучение так же, как для любого другого датасета Платформы.

В отличие от CVAT и Label Studio, выбирать формат не нужно — поддерживается собственный экспорт Labelbox.
Экспорт с помощью 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).
Что импортируется#
Платформа самостоятельно распознаёт формат Labelbox и сопоставляет ограничивающие рамки и полигоны с соответствующим типом задачи YOLO:
| Аннотация Labelbox | Импортируется |
|---|---|
| Ограничивающая рамка | Детекция |
| Полигон | Сегментация |
| Маска сегментации, точка, полилиния, связь, классификация | Пока нет |
Значение name каждого объекта становится именем класса — поэтому аннотация "name": "Dog" импортируется как класс Dog, а не как её строчное значение value; координаты в пикселях нормализуются относительно размеров media_attributes, указанных в экспорте. Каждое изображение получает имя на основе data_row.external_id, а если во внешнем экспорте нет внешнего идентификатора, используется имя файла из подписанного URL. Экспорт каталога без аннотаций импортируется как датасет изображений без разметки, готовый для разметки в редакторе аннотаций Платформы.
Одна строка данных выглядит так, если оставить только поля, которые читает Платформа:
{
"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. Для считывания полигоны также должны содержать как минимум три точки.