Ultralytics YOLO27:

Интеграция с Labelbox#

Ultralytics Platform напрямую читает экспорт Labelbox в формате NDJSON. Не нужно вставлять ключ, поддерживать соединение или обслуживать скрипт конвертации — экспортируй данные из Labelbox, загрузи файл, и твои аннотации появятся как обычный датасет в Платформе.

Импорт из Labelbox#

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

Импорт датасета Labelbox в Ultralytics 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

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. Для считывания полигоны также должны содержать как минимум три точки.

Часто задаваемые вопросы#

  • Ограничивающие рамки импортируются как датасет для задачи detect, а полигоны — как датасет для задачи segment. Маски сегментации, точки, ломаные линии, связи и классификации пока не считываются, поэтому проект, размеченный только с помощью этих инструментов, импортирует свои изображения без аннотаций.

  • Платформа считывает NDJSON, по одному объекту JSON на строку. Экспорт, сохраненный как единый массив JSON, полностью пропускается. Используй цикл SDK из примера выше или собственную загрузку Export data из Labelbox, которая уже представлена в формате NDJSON.

  • Экспорты из Labelbox ссылаются на изображения по подписанным URL, и эти подписи истекают. Выполни повторный экспорт из Labelbox и загрузи новый файл вскоре после завершения процесса.

  • Нет. Смешанный экспорт импортируется как датасет сегментации, и используются только полигоны. Экспортируй рамки и полигоны как отдельные проекты в Labelbox, если тебе нужны оба типа.

Участники

Комментарии