YOLO Vision 2026:

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

Участники

Комментарии