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

В отличие от 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) запишет вместо этого один массив, Platform пропустит любую строку, не являющуюся JSON-объектом, и импорт не найдет ни одной строки данных. Используй описанный выше цикл или "\n".join(json.dumps(r) for r in rows).
Что импортируется#
Platform самостоятельно распознает формат Labelbox и сопоставляет ограничивающие рамки и полигоны с соответствующим типом задачи YOLO:
| Аннотация Labelbox | Импортировано |
|---|---|
| Ограничивающая рамка | Detect |
| Полигон | Segment |
| Маска сегментации, точка, полилиния, связь, классификация | Пока нет |
Каждый объект name становится именем класса — поэтому аннотация "name": "Dog" импортируется как класс Dog, а не в нижнем регистре как value, — а пиксельные координаты нормализуются по размерам media_attributes в экспорте. Каждое изображение получает имя своего data_row.external_id, а если в экспорте нет внешнего идентификатора, используется имя файла из подписанного URL. Экспорт каталога без аннотаций импортируется как датасет неразмеченных изображений, готовый к разметке в редакторе аннотаций Platform.
Одна строка данных выглядит следующим образом, обрезанная до полей, которые читает платформа:
{
"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 — игнорируется. Эмбеддинги стоит исключить при экспорте: в тестовом экспорте они занимали примерно четыре пятых файла, в то время как на поля, которые реально читает Platform, приходилась лишь пятая часть.
На данный момент считываются только ограничивающие рамки и полигоны, и только из объектных аннотаций — классификации на уровне изображения находятся в других частях экспорта и пропускаются. Проект, размеченный исключительно с помощью инструмента маски сегментации (кисти), точек, полилиний или классификаций, импортирует свои изображения, но без аннотаций, причем ошибки не возникает. Это легко заметить на странице датасета: импортированный датасет, сохранивший метки, отображает количество размеченных объектов и аннотаций рядом с количеством изображений, а потерявший их — не отображает ничего.
Экспорт из Labelbox ссылается на каждое изображение по подписанному URL вместо внедрения пикселей, а срок действия этих подписей истекает. Платформа скачивает изображения по этим URL, предварительно проверяя выборку, поэтому экспорт с полностью устаревшими ссылками завершится ошибкой сразу же с указанием причины — сделай повторный экспорт из Labelbox и загрузи новый файл. Экспорт с частично истекшими ссылками импортирует те изображения, до которых все еще может достучаться, и пропустит остальные, поэтому выполняй загрузку вскоре после экспорта.
Экспорт, содержащий как ограничивающие рамки, так и полигоны, импортируется как датасет сегментов, а датасет сегментов поддерживает только геометрию полигонов — аннотации рамок не используются для обучения и не включаются в экспорт версий. Если нужны оба типа, экспортируй рамки и полигоны как отдельные проекты Labelbox. Кроме того, для чтения полигонов требуется не менее трех точек.