Безопасность корпоративного уровня: Соответствует стандартам ISO 27001 и SOC 2 Type I.

Link to this sectionИнтеграция с Labelbox#

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

Link to this sectionИмпорт из Labelbox#

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

В отличие от 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

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. Кроме того, для чтения полигонов требуется не менее трех точек.

Участники

Комментарии