YOLO Vision 2026:

Labelbox 통합#

Ultralytics Platform은 Labelbox NDJSON 내보내기 파일을 직접 읽습니다. 붙여넣을 키도, 계속 유지해야 할 연결도, 관리해야 할 변환 스크립트도 필요하지 않습니다. Labelbox에서 내보내고 파일을 업로드하면 레이블이 일반 Platform 데이터셋으로 도착합니다.

Labelbox에서 가져오기#

  1. Labelbox에서 내보내기. 가져오려는 라벨링 프로젝트 또는 카탈로그를 열고 Data Rows 탭으로 이동합니다. All을 선택하고 Export data를 클릭한 다음 포함할 필드를 선택하고 확인합니다. 프로젝트가 아닌 Catalog에서 내보내시나요? Export labels from project를 활성화하고 프로젝트를 선택해야 합니다. 그렇지 않으면 파일에 주석이 전혀 포함되지 않습니다.
  2. 파일 다운로드. Labelbox는 내보내기를 백그라운드 작업으로 실행합니다. Notifications에서 작업을 확인하고 완료되면 Download를 클릭하여 .ndjson 파일을 저장합니다.
  3. Platform에 업로드. 새 데이터셋을 만들고 .ndjson 파일을 업로드하거나 파일의 직접 링크를 붙여넣습니다. Settings > Integrations > Labelbox에서 시작할 수도 있습니다.
  4. 학습. 처리가 완료되면 다른 Platform 데이터셋과 동일하게 주석을 편집하고 학습을 진행합니다.

Ultralytics Platform Labelbox Dataset Import

CVATLabel 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())
JSON 배열이 아닌 NDJSON 작성

NDJSON은 줄마다 JSON 객체 하나를 포함합니다. json.dump(list_of_rows, f)은 대신 단일 배열을 작성하며, Platform은 JSON 객체가 아닌 모든 줄을 건너뛰므로 가져오기 결과에 데이터 행이 전혀 나타나지 않습니다. 위의 루프 또는 "\n".join(json.dumps(r) for r in rows)을 사용합니다.

가져오는 항목#

Platform은 Labelbox 형식을 자동으로 인식하고 경계 상자와 폴리곤을 일치하는 YOLO task type에 매핑합니다:

Labelbox 주석가져옴
경계 상자검출
폴리곤세그먼트
세그멘테이션 마스크, 포인트, 폴리라인, 관계, 분류아직 지원되지 않음

각 객체의 name은 클래스 이름이 됩니다. 따라서 "name": "Dog" 주석은 소문자 value이 아니라 Dog 클래스로 가져옵니다. 픽셀 좌표는 내보내기 파일의 media_attributes 크기를 기준으로 정규화됩니다. 각 이미지의 이름은 data_row.external_id를 따르며, 내보내기에 외부 ID가 없으면 서명된 URL의 파일 이름으로 대체됩니다. 주석이 없는 카탈로그 내보내기는 레이블이 지정되지 않은 이미지 데이터셋으로 가져와지며, Platform의 주석 편집기에서 바로 레이블을 지정할 수 있습니다.

단일 데이터 행은 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은 무시됩니다. 내보낼 때 임베딩은 선택 해제하는 것이 좋습니다. 샘플 내보내기에서는 임베딩이 파일의 약 5분의 4를 차지한 반면, Platform이 실제로 읽는 필드는 5분의 1에 불과했습니다.

마스크 및 포인트 프로젝트는 주석 없이 가져와집니다

현재는 경계 상자와 폴리곤만 읽으며, 객체 주석에서 가져온 경우에만 해당합니다. 이미지 수준의 분류는 내보내기의 다른 위치에 저장되므로 건너뜁니다. 세그멘테이션 마스크(브러시) 도구, 포인트, 폴리라인 또는 분류만 사용하여 전체 프로젝트에 레이블을 지정하면 이미지가 가져와지지만 주석은 가져와지지 않으며 오류도 발생하지 않습니다. 데이터셋 페이지에서 이를 확인할 수 있습니다. 레이블이 유지된 가져온 데이터셋에는 이미지 수 옆에 레이블 수와 주석 수가 표시되고, 레이블이 사라진 데이터셋에는 둘 다 표시되지 않습니다.

링크가 유효할 때 내보내기 파일 업로드

Labelbox 내보내기 파일은 각 이미지를 픽셀 데이터로 포함하는 대신 서명된 URL로 참조하며, 이러한 서명은 만료됩니다. Platform은 시작하기 전에 샘플을 확인하면서 해당 URL에서 이미지를 다운로드합니다. 따라서 모든 링크가 만료된 내보내기 파일은 즉시 실패하고 그 이유를 알려 줍니다. Labelbox에서 다시 내보내고 새 파일을 업로드합니다. 일부만 만료된 내보내기 파일은 여전히 접근 가능한 이미지만 가져오고 나머지는 건너뛰므로, 내보낸 직후 업로드해야 합니다.

혼합된 내보내기에서는 경계 상자가 제외됩니다

경계 상자와 폴리곤을 모두 포함하는 내보내기 파일은 세그먼트 데이터셋으로 가져와지며, 세그먼트 데이터셋에는 폴리곤 형상만 포함됩니다. 따라서 경계 상자 주석은 학습에 사용되지 않으며 버전 내보내기에도 포함되지 않습니다. 둘 다 필요한 경우 경계 상자와 폴리곤을 별도의 Labelbox 프로젝트로 내보냅니다. 폴리곤을 읽으려면 최소 3개의 포인트도 필요합니다.

댓글