REST API 참조#
Ultralytics Platform은 데이터셋, 이미지, 프로젝트, 모델, 학습, 내보내기 및 배포에 프로그래밍 방식으로 액세스할 수 있는 REST API를 제공합니다.

# List the datasets owned by a workspace
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://platform.ultralytics.com/api/datasets/YOUR_USERNAME아래 각 엔드포인트에는 이 참조 문서와 동일한 계약을 기반으로 생성된 ultralytics-platform SDK의 client.<resource>.<method>(...) 호출이 표시되어 있습니다.
이 페이지에서는 API를 안내합니다. 자동 생성되는 최신 참조 문서는 platform.ultralytics.com/api/docs에 있으며, 참조 문서의 기반이 되는 기계 판독 가능한 OpenAPI 3.2 문서는 platform.ultralytics.com/openapi.json에 게시되어 있습니다. 두 문서 모두 서버 측 계약에서 직접 생성되므로, 이 페이지와 스키마의 내용이 다를 경우 해당 문서가 기준입니다.
API 개요#
API는 핵심 Platform 리소스를 중심으로 구성됩니다:
| 리소스 | 설명 | 주요 작업 |
|---|---|---|
| 데이터셋 | 라벨링된 이미지 모음 | CRUD, 수집, 버전, 클래스, 분할, 클론, 복사 |
| 이미지 | 개별 이미지 및 라벨 | 읽기, 어노테이션, 분할 이동, 삭제, 자동 어노테이션, 얼굴 블러 처리 |
| 프로젝트 | 모델 작업 공간 | CRUD, 클론 |
| 모델 | 학습된 체크포인트 | CRUD, 예측, 다운로드, 클론, 학습 상태 |
| 학습 | 클라우드 GPU 학습 작업 | GPU 사용 가능 여부, 시작, 진행 상황, 취소 |
| 내보내기 | 형식 변환 작업 | 생성, 목록 조회, 상태 확인, 취소 |
| 배포 | 전용 추론 엔드포인트 | 생성, 업데이트, 시작/중지, 예측, 메트릭, 로그 |
| 에이전트 | 저장된 시각적 워크플로 | 목록 조회, 저장, 삭제 |
| 휴지통 | 소프트 삭제된 리소스 | 목록 조회, 복원, 영구 삭제 |
| 스토리지 | 클라우드 스토리지 통합 | 연결, 검색, 둘러보기, 연결 해제 |
| 계정 | 요금제, 크레딧, 스토리지, 프로필 | 계정 요약, API 키, 스토리지 사용량, 사용자 조회 |
| 결제 | 요금제 사용량 및 원장 | 사용량 요약, 거래 내역 |
| 탐색 | 공개 콘텐츠 검색 | 프로젝트, 데이터셋, 이미지 검색 |
인증#
대부분의 엔드포인트에는 API 키가 필요합니다. 공개 데이터셋, 프로젝트 또는 모델 읽기, 공개 데이터셋 이미지 목록 조회, 공개 모델을 통한 추론 실행, 탐색 검색 등 공개 콘텐츠를 제공하는 엔드포인트는 익명 요청도 허용하며, API 키를 제공하면 더 많은 결과를 반환합니다.
API 키 발급#
Settings>API Keys로 이동합니다Add Key을 클릭하고, 공급자로Ultralytics을 유지한 채 이름을 입력한 다음Create Key를 클릭합니다- 생성된 키를 복사합니다
자세한 안내는 API 키를 참조하세요.
인증 헤더#
API 키를 Bearer 토큰으로 포함합니다:
Authorization: Bearer YOUR_API_KEYAPI 키는 리터럴 접두사 ul_ 뒤에 16진수 문자 40개가 이어지는 총 43자 형식입니다(예: ul_a1b2c3d4e5f6789012345678901234567890abcd). 헤더가 없거나, 키 형식이 잘못되었거나, 키가 폐기된 요청은 401를 반환합니다. 키를 안전하게 보관하고 버전 관리 시스템에 커밋하거나 공개적으로 공유하지 마세요.
예시#
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://platform.ultralytics.com/api/account/summary기본 URL#
모든 API 엔드포인트는 다음을 사용합니다:
https://platform.ultralytics.com/api리소스 경로#
대부분의 리소스는 데이터베이스 ID가 아니라 Platform URL에 표시되는 것과 동일한 사람이 읽기 쉬운 이름으로 지정합니다:
| 리소스 | 경로 | 예시 |
|---|---|---|
| 데이터셋 | /api/datasets/{owner}/{dataset} | /api/datasets/acme-vision/warehouse |
| 프로젝트 | /api/projects/{owner}/{project} | /api/projects/acme-vision/inspection |
| 모델 | /api/models/{owner}/{project}/{model} | /api/models/acme-vision/inspection/v3 |
| 배포 | /api/deployments/{owner}/{deployment} | /api/deployments/acme-vision/edge-1 |
| 이미지 | /api/images/{imageId} | /api/images/65f1c0a2b3d4e5f601234567 |
| 에이전트 | /api/workflows?id={agentId} | /api/workflows?id=65f1c0a2b3d4e5f601234567 |
{owner}은 개인 사용자 이름 또는 팀 작업 공간 핸들입니다. 길이는 4~32자이며, 소문자 영숫자와 구간 사이의 단일 하이픈으로 구성됩니다.{dataset},{project},{model},{deployment}은 동일한 소문자와 하이픈 패턴을 따르며, 최대 길이는 128자입니다.{imageId},{exportId},{agentId}는 API가 반환하는 24자 16진수 ID입니다.PATCH을 통해 리소스 이름을 변경하면 표시용name과 URL 이름이 함께 변경되며, 응답에 현재 URL 이름이 반환되므로 계속해서 해당 리소스에 접근할 수 있습니다.
에이전트 API를 제외하면 owner 쿼리 매개변수는 없습니다. 작업 공간 범위 경로에는 경로 내에 소유자가 포함되며, 계정 범위 엔드포인트(/api/account/summary, /api/api-keys, /api/storage, /api/billing/*, /api/trash, /api/integrations/buckets)는 API 키를 발급한 작업 공간에서 작동합니다. 팀 작업 공간에서 작업하려면 해당 작업 공간에서 생성한 API 키를 사용하거나, 에이전트 API에 owner을 전달하세요.
요청 제한#
API는 API 키별로 슬라이딩 윈도우 제한을 적용합니다. 각 경로는 한 카테고리에 속하며, 카테고리마다 별도의 카운터를 사용하므로 예측 요청 20회가 기본 허용량을 소진하지 않습니다.
| 카테고리 | 제한 | 적용 대상 |
|---|---|---|
| 기본 | 분당 요청 100회 | 아래에 나열되지 않은 모든 경로 |
| 학습 | 분당 요청 10회 | POST /api/training/start |
| 업로드 | 분당 요청 10회 | 서명된 업로드 URL, 업로드 완료 및 데이터셋 수집 |
| 예측 | 분당 요청 20회 | Platform API 경로를 통한 모델 및 배포 추론 |
| 내보내기 | 분당 요청 20회 | 모델 내보내기 목록 조회 및 생성, 데이터셋 버전 생성 또는 업데이트. 데이터셋 내보내기(GET)와 단일 모델 내보내기 읽기에는 기본 제한이 적용됩니다. |
| 다운로드 | 분당 요청 30회 | 모델 파일 다운로드 |
| 변경 | 분당 요청 10회 | API 키 목록 조회, 클라우드 스토리지 통합 목록 조회 또는 연결, 스토리지 위치 검색, 배포 업데이트(PATCH) |
| 데이터 채우기 | 분당 요청 20회 | POST /api/datasets/{owner}/{dataset}/images(선택한 이미지 집합 가져오기) 및 GET /api/images/{imageId}/similar |
| 클러스터링 | 분당 요청 10회 | GET /api/datasets/{owner}/{dataset}/images/clustering 및 GET /api/models/{owner}/{project}/{model}/similar-images |
결제 체크아웃 및 팀 관리와 같은 브라우저 전용 Platform 경로에는 자체 제한이 있으며, 이 제한은 API 키 트래픽에는 적용되지 않습니다.
요청이 제한되면 API는 헤더와 JSON 본문에 429을 반환합니다.
Retry-After: 12
X-RateLimit-Reset: 2026-02-21T12:34:56.000Z{
"error": "Rate limit exceeded, wait 12s",
"retryAfter": 12,
"resetAt": "2026-02-21T12:34:56.000Z"
}전용 엔드포인트(무제한)#
전용 엔드포인트를 호출할 때 배포의 자체 serviceUrl(예: https://predict-abc123.run.app/predict)을 직접 사용하면 Platform API 키 속도 제한이 적용되지 않습니다. 이 경우 처리량은 배포된 서비스 구성에 따라 달라집니다.
429을 받으면 재시도하기 전에 Retry-After초 동안(또는 X-RateLimit-Reset까지) 기다립니다. 지수 백오프 구현은 속도 제한 FAQ를 참조하세요.
응답 형식#
성공 응답#
응답은 리소스별 필드를 포함하는 JSON 객체입니다. 일반적인 래퍼는 없습니다. 목록 엔드포인트는 이름이 지정된 컬렉션을 반환하며, 대부분 개수도 함께 반환하고, 변경 작업은 변경된 식별자를 반환합니다.
{
"datasets": [{ "id": "65f1c0a2b3d4e5f601234567", "owner": "acme-vision", "dataset": "warehouse" }],
"total": 1,
"region": "us"
}리소스 목록, 생성 및 복제 응답, 그리고 배포, 스토리지, 휴지통과 같은 일부 조회 응답에는 해당 워크스페이스의 스토리지 리전인 region(us, eu 또는 ap)도 포함됩니다.
오류 응답#
모든 오류 응답은 error 메시지를 포함하는 JSON 객체입니다.
{
"error": "Dataset not found"
}| HTTP 상태 | 의미 |
|---|---|
200 | 성공 |
201 | 생성됨 |
202 | 요청이 수락되었으며 작업은 비동기적으로 계속 진행됩니다 |
400 | 경로, 쿼리 또는 요청 본문이 잘못되었습니다 |
401 | 인증 정보가 없거나 유효하지 않습니다 |
402 | 크레딧이 부족합니다(학습) |
403 | 권한, 플랜 또는 할당량이 부족합니다 |
404 | 리소스를 찾을 수 없습니다 |
409 | 현재 상태와 충돌합니다(중복 이름, 진행 중인 작업) |
413 | 예측 입력이 너무 큽니다 |
422 | 모델 클래스가 데이터셋과 일치하지 않거나, 공급자 키가 없거나 거부되었습니다(자동 주석) |
429 | 속도 제한을 초과했습니다 |
500 | 서버 오류 |
502 | 업스트림 공급자 또는 서비스 호출에 실패했습니다 |
503 | 종속 서비스가 일시적으로 사용할 수 없습니다 |
페이지 매김#
페이지네이션 방식은 컬렉션에 따라 다릅니다.
| 방식 | 엔드포인트 | 파라미터 |
|---|---|---|
| 제한만 | 데이터셋, 프로젝트, 모델, 내보내기, 배포 목록 | limit |
| 오프셋 및 제한 | 데이터셋 이미지, 이미지 클러스터링, Explore 검색 | offset, limit, 그리고 응답의 hasMore |
| 커서 | 데이터셋 이미지(대규모 데이터셋) | cursor, includeTotal, 그리고 nextCursor |
| 페이지 번호 | 휴지통 | page, limit, 그리고 totalPages |
| 불투명 페이지 토큰 | 배포 로그 | pageToken 및 nextPageToken |
데이터셋 API#
YOLO 모델 학습에 사용할 라벨링된 이미지 데이터셋을 생성하고, 둘러보고, 관리합니다. 데이터셋 문서를 참조하세요.
데이터셋 목록#
GET /api/datasets/{owner}Python SDK: client.datasets.list(owner)
소유자의 공개 데이터셋과 키에 해당 워크스페이스를 볼 수 있는 권한이 있을 경우 비공개 데이터셋도 반환합니다.
쿼리 매개변수:
| 매개변수 | 유형 | 설명 |
|---|---|---|
limit | int | 반환할 최대 데이터셋 수(기본값: 1000, 최대: 1000) |
includeSamples | 불리언 | 샘플 이미지 미리보기 포함(기본값: true) |
includeImageUrls | 불리언 | 전체 크기 샘플 이미지 대체 URL 포함(기본값: false) |
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://platform.ultralytics.com/api/datasets/acme-vision?limit=10&includeSamples=false"응답:
{
"datasets": [
{
"id": "65f1c0a2b3d4e5f601234567",
"owner": "acme-vision",
"dataset": "warehouse",
"name": "Warehouse",
"task": "detect",
"visibility": "private",
"imageCount": 1000,
"classCount": 2,
"classNames": ["person", "forklift"],
"splits": { "train": 800, "val": 200, "test": 0, "labeled": 1000 },
"annotationCount": 5400,
"starCount": 3,
"isStarred": false,
"status": "ready",
"createdAt": "2026-01-15T10:00:00Z",
"updatedAt": "2026-01-16T08:30:00Z"
}
],
"total": 1,
"region": "us"
}데이터셋 가져오기#
GET /api/datasets/{owner}/{dataset}Python SDK: client.datasets.retrieve(owner, dataset)
dataset 키 아래에 classNames, splits, versions, source 및 사용자 정의 metadata 객체를 포함한 전체 데이터셋 객체를 반환합니다. 이미지 10,000개 이상을 가져오는 작업이 진행되는 동안 편집기에는 stage, percent, 그리고 알려진 경우 processed, total, objects(스캔된 클라우드 객체)이 포함된 processingProgress도 반환됩니다.
데이터셋 생성#
POST /api/datasetsPython SDK: client.datasets.create(dataset=..., name=...)
본문:
{
"dataset": "warehouse",
"name": "Warehouse",
"task": "detect",
"description": "Forklift and pedestrian safety dataset",
"classNames": ["person", "forklift"],
"visibility": "private",
"metadata": { "location": "factory-1", "reviewed": true },
"owner": "acme-vision"
}| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
dataset | 문자열 | 예 | Platform URL에 사용되는 데이터셋 이름(소문자, 하이픈으로 구분, 최대 128자) |
name | 문자열 | 예 | 표시 이름(최대 100자) |
description | 문자열 | 아니요 | 설명(최대 1000자) |
task | 문자열 | 아니요 | 작업 유형(기본값: detect) |
classNames | 배열 | 아니요 | 인덱스 순서의 클래스 이름(최대 25,000개); 중복 없음, 2자를 초과하는 이름은 대소문자 무시 |
format | 문자열 | 아니요 | 주석 형식: yolo(기본값), coco, raw, ndjson |
visibility | 문자열 | 아니요 | public 또는 private |
blurFaces | 불리언 | 아니요 | 데이터셋에 업로드되는 이미지의 얼굴을 흐리게 처리합니다(얼굴 흐리게 처리 참조). |
tags | 배열 | 아니요 | 태그 최대 50개, 각 태그는 최대 50자 |
license | 문자열 | 아니요 | 데이터셋 라이선스 식별자 |
metadata | 객체 | 아니요 | 사용자 지정 JSON 메타데이터 |
owner | 문자열 | 아니요 | 팀 워크스페이스 핸들. 기본값은 개인 워크스페이스입니다 |
워크스페이스에 이미 존재하는 dataset 슬러그(휴지통에 있는 항목 포함)를 사용하면 409이 반환됩니다.
데이터셋 생성 또는 업데이트 시 유효한 task 값: detect, segment, semantic, depth, classify, pose 및 obb. 깊이 데이터셋에는 클래스가 없습니다.
응답(201):
{
"id": "65f1c0a2b3d4e5f601234567",
"owner": "acme-vision",
"dataset": "warehouse",
"region": "us"
}데이터셋 업데이트#
PATCH /api/datasets/{owner}/{dataset}Python SDK: client.datasets.update(owner, dataset)
본문(부분 업데이트):
{
"name": "Warehouse Safety",
"description": "New description",
"visibility": "public",
"metadata": { "location": "factory-2", "reviewed": true }
}허용되는 필드: name, description, visibility, metadata, tags, classNames, classColors, format, task, license, iconColor, iconLetter, starred, blurFaces, kptSkeletonId(포즈 데이터셋에 포즈 스켈레톤 템플릿 할당), initializeClassNames(데이터셋에 클래스 또는 주석이 아직 없는 경우를 제외하고 업데이트 시 409 반환). 사용자 지정 메타데이터를 지우려면 빈 metadata 객체({})를 보냅니다. 메타데이터 키는 최대 128자이며 직렬화된 객체는 최대 500,000자입니다.
응답:
{
"success": true,
"dataset": "warehouse-safety"
}이름을 변경하면 URL 이름도 변경되므로 후속 요청에는 반환된 dataset 값을 사용하세요.
데이터셋 삭제#
DELETE /api/datasets/{owner}/{dataset}Python SDK: client.datasets.delete(owner, dataset)
데이터셋을 휴지통으로 이동합니다. 이 데이터셋은 30일 동안 복구할 수 있습니다.
데이터셋 복제#
POST /api/datasets/{owner}/{dataset}/clonePython SDK: client.datasets.clone(owner, dataset)
액세스할 수 있는 데이터셋과 해당 이미지 및 라벨을 개인 워크스페이스 또는 팀 워크스페이스에 복사합니다.
선택적 본문(모든 필드 선택 사항):
{
"dataset": "warehouse-copy",
"name": "Warehouse Copy",
"description": "Cloned for experimentation",
"visibility": "private",
"license": "CC-BY-4.0",
"owner": "acme-vision"
}응답(201): id, owner, dataset, name, imageCount, classCount 및 region. 연결된 스토리지 소스를 사용하는 데이터셋은 파일이 복사되지 않으므로 409을 반환합니다.
데이터셋 내보내기 다운로드#
GET /api/datasets/{owner}/{dataset}/exportPython SDK: client.datasets.export(owner, dataset)
서명된 NDJSON 다운로드 URL을 반환합니다. v을 생략하면 데이터셋의 현재 상태를 내보내며, 생성 이후 변경 사항이 없을 경우 캐시된 내보내기를 재사용합니다.
쿼리 매개변수:
| 매개변수 | 유형 | 설명 |
|---|---|---|
v | 정수 | 저장된 버전 번호(1부터 시작). 현재 데이터셋을 사용하려면 생략합니다. |
응답:
{
"downloadUrl": "https://storage.googleapis.com/...&signature=...",
"cached": true
}특정 버전을 요청하면 cached 대신 downloadUrl 및 version을 반환합니다.
데이터셋 버전 생성#
POST /api/datasets/{owner}/{dataset}/exportPython SDK: client.datasets.create_export(owner, dataset)
데이터셋의 변경 불가능한 번호 지정 버전을 생성합니다. 편집자 권한이 필요합니다. NDJSON 다운로드를 준비하지 않고 버전을 저장하려면 download을 false로 설정합니다. 그러면 downloadUrl는 생략됩니다. SDK는 ultralytics-platform>=0.1.73에서 download을 수락합니다.
본문(선택 사항):
{
"description": "Added 500 training images",
"download": true
}응답:
{
"version": 3,
"downloadUrl": "https://storage.googleapis.com/...&signature=...",
"reused": false
}데이터셋이 기존 버전과 일치하면 reused은 true입니다. 예를 들어 데이터셋을 복원한 직후에는 해당 버전이 대신 반환되며, 설명을 지정하면 설명도 업데이트됩니다.
버전 설명 업데이트#
PATCH /api/datasets/{owner}/{dataset}/exportPython SDK: client.datasets.update_export(owner, dataset, version=..., description=...)
본문:
{
"version": 2,
"description": "Fixed mislabeled classes"
}응답: {"ok": true}
데이터셋 버전 복원#
POST /api/datasets/{owner}/{dataset}/restorePython SDK: client.datasets.restore(owner, dataset, version=...)
이미지 바이트를 복사하지 않고 저장된 버전에서 이미지, 주석 및 클래스를 다시 구성합니다.
본문:
{
"version": 2
}응답: {"version": 2, "imageCount": 1000}
데이터셋 버전 비교#
GET /api/datasets/{owner}/{dataset}/versions/compare?base={from}&head={to}Python SDK: client.datasets.compare(owner, dataset, base=1, head=2)(ultralytics-platform>=0.1.73)
| 매개변수 | 유형 | 설명 |
|---|---|---|
base | int | 비교할 시작 버전 |
head | int | 비교할 대상 버전 |
cursor | 문자열 | 이전 페이지의 nextCursor |
hash | 문자열 | 항목의 hash: 변경 사항이 아니라 각 버전에 저장된 이미지 자체를 반환합니다 |
응답(요약):
{
"summary": { "added": 0, "removed": 1, "modified": 1, "moved": 1, "labelsAdded": 1, "labelsRemoved": 2 },
"items": [
{
"hash": "b5c605c133f84c3024af7e652b135501",
"name": "000000000042",
"change": "moved",
"base": { "split": "val", "labelCount": 1 },
"head": { "split": "test", "labelCount": 1 }
}
]
}summary은 첫 페이지에만 표시되며 정확한 총계와 함께 추가, 제거 또는 이름이 변경된 클래스 및 차이가 있는 기타 데이터셋 필드를 나열하는 header을 포함합니다. 각 항목의 change는 added, removed, modified(변경된 fields 포함) 또는 moved(분할 변경)이며, labelsRemoved에는 제거된 이미지의 라벨이 포함됩니다. 다음 페이지에 nextCursor가 있으면 이를 cursor으로 전달합니다. hash을 사용하면 응답은 versions가 됩니다. 즉, 각 버전에 저장된 이미지와 해당 라벨 및 서명된 imageUrl이 반환됩니다. 어느 순서든 사용할 수 있으며, base와 head를 서로 바꾸면 제거된 이미지가 추가된 이미지로 보고됩니다. 비교에는 기본 속도 제한이 적용되며, hash이 없는 요청은 어떤 API 키를 사용하든 사용자 및 데이터셋별로 분당 10회로 제한됩니다.
데이터셋 통계 가져오기#
GET /api/datasets/{owner}/{dataset}/class-statsPython SDK: client.datasets.class_stats(owner, dataset)
클래스별 어노테이션 개수, 이미지 및 어노테이션 히스토그램, 히트맵을 반환합니다. 대규모 데이터셋은 샘플링되며, 이 경우 sampleSize은 분석에 포함된 이미지 수를 보고합니다.
응답(요약):
{
"classes": [{ "classId": 0, "count": 1500, "imageCount": 450 }],
"imageStats": {
"widthHistogram": [{ "bin": 640, "count": 120, "size": 1 }],
"heightHistogram": [{ "bin": 480, "count": 95, "size": 1 }],
"pointsHistogram": [{ "bin": 4, "count": 200, "size": 1 }],
"formatDistribution": { "jpg": 900, "png": 100 },
"fileSizeHistogram": [{ "bin": 250000, "count": 300, "size": 50000 }],
"objectsPerImageHistogram": [{ "bin": 5, "count": 210, "size": 1 }],
"bboxWidthHistogram": [{ "bin": 120, "count": 340, "size": 20 }],
"bboxHeightHistogram": [{ "bin": 90, "count": 300, "size": 20 }]
},
"locationHeatmap": {
"bins": [
[5, 10],
[8, 3]
],
"maxCount": 50
},
"dimensionHeatmap": {
"bins": [
[2, 5],
[3, 1]
],
"maxCount": 12,
"minWidth": 10,
"maxWidth": 1920,
"minHeight": 10,
"maxHeight": 1080
},
"classNames": ["person", "forklift"],
"cached": true,
"sampleSize": null
}클래스 관리#
클래스 병합(어노테이션을 대상 클래스에 재할당한 다음 원본 클래스를 제거):
POST /api/datasets/{owner}/{dataset}/classes/mergePython SDK: client.datasets.merge_classes(owner, dataset, source_class_ids=..., target_class_id=...)
{
"sourceClassIds": [2, 4],
"targetClassId": 1
}클래스 삭제(해당 어노테이션을 삭제하고 나머지 클래스 ID를 낮춤):
POST /api/datasets/{owner}/{dataset}/classes/deletePython SDK: client.datasets.delete_classes(owner, dataset, class_ids=...)
{
"classIds": [2, 4]
}두 작업 모두 success, 업데이트된 classNames 및 classColors, 변경 사항 요약(mergedClassIds 및 targetClassId, 또는 deletedClassIds 및 deletedAnnotations)을 반환합니다.
병합 또는 삭제 후 나머지 ID가 변경되므로 이러한 작업은 멱등성이 없습니다. 다른 클래스 작업을 실행하기 전에 데이터셋을 다시 가져와 현재 클래스 인덱스를 확인하세요.
분할 데이터 재분배#
POST /api/datasets/{owner}/{dataset}/splits/redistributePython SDK: client.datasets.redistribute_splits(owner, dataset, train=..., val=..., test=...)
이미지를 분할 항목 간에 무작위로 재할당합니다. 세 백분율의 합계는 100이어야 합니다.
{
"train": 80,
"val": 20,
"test": 0
}응답: success, 결과로 나온 splits 개수, modified(이동한 이미지 수).
데이터셋 임베딩#
GET /api/datasets/{owner}/{dataset}/embeddings
POST /api/datasets/{owner}/{dataset}/embeddings
DELETE /api/datasets/{owner}/{dataset}/embeddingsPython SDK: client.datasets.embeddings(owner, dataset), client.datasets.create_embeddings(owner, dataset), client.datasets.delete_embeddings(owner, dataset)
GET은 분석 요약(analyzedAt, embeddingsCount, latestImageAt, activeJob)을 반환합니다. POST는 임베딩 분석을 대기열에 추가하고 jobId이 포함된 202을 반환합니다. DELETE은 활성 작업을 취소하고 취소된 작업 ID 또는 null를 반환합니다.
이미지 클러스터링#
GET /api/datasets/{owner}/{dataset}/images/clusteringPython SDK: client.datasets.clustering(owner, dataset)
완료된 분석의 UMAP 2D 레이아웃을 반환하며, offset 및 limit(기본값 및 최대 50,000)을 사용해 페이지로 나누어 표시합니다. 각 항목에는 id, umapX, umapY, cluster, split, classIds, width, height, bytes, labelCount, labeled, missing이 포함됩니다. cluster는 크기순으로 순위가 매겨진 포인트의 시각적 아일랜드입니다(0 = 가장 큼, -1 = 분산됨). 클러스터링 기능이 추가되기 전에 분석된 레이아웃에서는 null이 반환됩니다.
데이터셋에서 학습된 모델 목록#
GET /api/datasets/{owner}/{dataset}/modelsPython SDK: client.datasets.models(owner, dataset)
응답:
{
"models": [
{
"id": "65f1c0a2b3d4e5f601234599",
"owner": "acme-vision",
"project": "inspection",
"model": "v3",
"name": "v3",
"status": "completed",
"task": "detect",
"epochs": 100,
"bestEpoch": 87,
"metrics": { "mAP50": 0.85, "mAP50-95": 0.72, "precision": 0.88, "recall": 0.81 },
"startedAt": "2026-01-14T22:00:00Z",
"completedAt": "2026-01-15T10:00:00Z",
"createdAt": "2026-01-14T21:55:00Z"
}
],
"count": 1
}데이터셋 이미지 목록#
GET /api/datasets/{owner}/{dataset}/imagesPython SDK: client.datasets.images(owner, dataset)
쿼리 매개변수:
| 매개변수 | 유형 | 설명 |
|---|---|---|
limit | int | 반환할 최대 이미지 수(기본값: 50, 최대: 5000) |
offset | int | 건너뛸 이미지 수(기본값: 0) |
cursor | 문자열 | 커서 페이지네이션을 위한 이전 페이지의 마지막 이미지 ID |
includeTotal | 불리언 | 일치하는 전체 개수 포함(기본값: true) |
split | 문자열 | 분할 항목으로 필터링: train, val, test |
hasLabel | 불리언 | 어노테이션 상태로 필터링 |
hasError | 불리언 | 처리 오류 상태로 필터링 |
classIds | 문자열 | 쉼표로 구분된 클래스 ID이며, 해당 클래스 중 하나라도 포함하는 이미지를 반환합니다 |
search | 문자열 | 파일 이름, 클래스 이름, 사용자 지정 메타데이터에서 부분 문자열을 일치시킵니다(최대 200자). |
q | 문자열 | sort 대신 관련성순으로 정렬합니다. 텍스트 일치 항목을 먼저 표시하고, 유사 항목을 최대 1,000개까지 표시합니다. ID, 해시 또는 파일 이름은 search로 처리됩니다(최대 200자). |
sort | 문자열 | newest(기본값), oldest, name-asc, name-desc, height-asc, height-desc, width-asc, width-desc, size-asc, size-desc, labels-asc, labels-desc |
includeThumbnails | 불리언 | 서명된 썸네일 URL 포함(기본값: true) |
includeImageUrls | 불리언 | 서명된 원본 크기 이미지 URL 포함(기본값: false) |
includeLabels | 불리언 | 개수가 제한된 미리 보기 어노테이션 포함(기본값: false) |
응답:
{
"images": [
{
"id": "65f1c0a2b3d4e5f601234567",
"hash": "9f2c1d4b6a8e0f3c5d7b9a1e2f4c6d8b",
"ext": "jpg",
"name": "aisle-04",
"thumbnailUrl": "https://storage.googleapis.com/...&signature=...",
"width": 1920,
"height": 1080,
"split": "train",
"labelCount": 6,
"bytes": 284213,
"error": null
}
],
"total": 1000,
"hasMore": true,
"classes": ["person", "forklift"],
"errorCount": 0,
"nextCursor": "65f1c0a2b3d4e5f601234567"
}선택한 이미지 가져오기#
POST /api/datasets/{owner}/{dataset}/imagesPython SDK: client.datasets.selected_images(owner, dataset, image_ids=...)
지정된 이미지 ID를 최대 1,000개까지 동일한 이미지 형식으로 반환하며, 목록 작업과 동일한 필터 및 URL 쿼리 매개변수를 허용합니다.
{
"imageIds": ["65f1c0a2b3d4e5f601234567", "65f1c0a2b3d4e5f601234568"]
}이미지 복사 또는 이동#
POST /api/datasets/{owner}/{dataset}/images/adoptPython SDK: client.datasets.adopt_images(owner, dataset, image_ids=..., release=...) (ultralytics-platform>=0.1.50)
앱의 복사 및 붙여넣기 기능처럼 다른 데이터셋에서 최대 1,000개의 이미지를 이 데이터셋으로 복사하고, 개수 adopted을 반환합니다.
{
"imageIds": ["65f1c0a2b3d4e5f601234567"],
"release": false,
"classMapping": { "person": 0, "vase": null }
}release 또는 classMapping을 설정하면 편집할 수 있는 데이터셋의 레이블과 분할이 유지됩니다. release: false는 이미지를 복사하고 release: true은 이미지를 소스 데이터셋에서 이동합니다. 두 필드를 모두 생략하면 레이블이 없는 train 이미지를 가져옵니다. 읽기 전용 소스에서 복사하는 경우에도 동일하게 처리됩니다. 읽기 전용 소스에서 이동하면 403가 반환됩니다. 기존 이미지는 건너뜁니다. 레이블과 분할을 유지하는 경우 중복 여부는 대상 분할 내에서 확인합니다. 클래스는 이름을 기준으로 일치 여부를 확인하며, 두 글자를 초과하는 이름은 대소문자를 무시합니다. 422은 unmatchedClasses에서 일치 항목이 없는 소스 클래스를 반환하고, classMapping은 각 클래스를 클래스 인덱스, 새 클래스 이름 또는 레이블을 제외하는 null에 매핑합니다. 409은 대상이 연결된 데이터셋이거나 소스 또는 대상이 사용 중임을 의미합니다. 레이블과 분할을 유지하는 경우 작업, 이미지 채널, 포즈 설정 또는 깊이 스케일이 호환되지 않으면 레이블이 없는 이미지에도 409이 반환됩니다.
데이터셋 데이터 수집#
POST /api/datasets/{owner}/{dataset}/ingestPython SDK: client.datasets.ingest(owner, dataset, body=...)
완료된 업로드, 원격 아카이브 또는 연결된 스토리지 소스의 데이터를 기존 데이터셋으로 처리합니다. 다음 소스 중 정확히 하나를 지정하세요:
| 필드 | 유형 | 설명 |
|---|---|---|
sessionId | 문자열 | POST /api/upload/signed-url의 업로드 세션입니다. POST /api/upload/complete이 호출되지 않은 경우 데이터 수집 과정에서 업로드를 검증하고 완료합니다. |
sourceUrl | 문자열 | ZIP, TAR, TAR.GZ, TGZ 또는 NDJSON 파일의 공개 HTTP 또는 HTTPS URL(최대 4096자) |
reference | 객체 | 연결된 소스: 클라우드 스토리지(provider: "cloud", integrationId, target, prefix) 또는 온프레미스(provider: "local", keyId, root, prefix) |
targetSplit | 문자열 | train, val 또는 test; 아카이브의 분할 구조를 재정의합니다. |
conflictPolicy | 문자열 | 파일 이름 또는 콘텐츠 충돌 시 skip, keep_both 또는 replace를 사용합니다. |
classMapping | 객체 | 수신 클래스 이름을 클래스 인덱스, 기존 또는 새 클래스 이름, 또는 건너뛰기 위한 null에 매핑합니다. |
imageMetadata | 객체 | 각 이미지의 아카이브 기준 상대 경로 또는 NDJSON file 값으로 지정하는 사용자 지정 메타데이터입니다. |
업로드 세션은 POST /api/upload/signed-url에 전달된 assetId을 통해 데이터셋에 연결되며, 데이터 수집 과정에서 다른 데이터셋에 속한 세션은 거부됩니다.
본문(업로드된 아카이브):
{
"sessionId": "session_abc123",
"targetSplit": "train"
}본문(원격 아카이브 또는 NDJSON):
{
"sourceUrl": "https://example.com/my-dataset.zip"
}본문(후속 데이터 수집에서 라벨 가져오기):
{
"sessionId": "session_abc123",
"classMapping": { "person": 0, "automobile": "forklift", "background": null }
}본문(이미지별 메타데이터 연결):
{
"sessionId": "session_abc123",
"imageMetadata": {
"airbus-wing.jpg": { "aircraft": { "family": "A350" }, "inspectionStatus": "reviewed" },
"images/tail.jpg": { "aircraft": { "family": "A320" }, "inspectionSeverity": 2 }
}
}메타데이터 키는 폴더를 포함해 아카이브 내에서 정규화된 경로와 일치해야 합니다. NDJSON을 가져올 때 각 레코드에는 자체 metadata 객체를 포함할 수 있으며, 이 객체는 일치하는 imageMetadata 항목보다 우선합니다. 아카이브 경로는 최대 1,024자, 최상위 메타데이터 키는 최대 128자이며, 각 메타데이터 객체와 전체 imageMetadata 맵은 직렬화된 문자 수 기준 최대 500,000자입니다.
최초 수집 시 아카이브의 클래스로 클래스가 자동 생성됩니다. 이후 수집에서는 classMapping에서 누락된 아카이브 클래스에 대해 기존 데이터셋 클래스를 이름으로 대조하며, 두 글자를 초과하는 이름은 대소문자를 무시합니다. 일치 항목이 없는 클래스는 새 클래스로 추가됩니다. null에 명시적으로 매핑된 클래스의 레이블만 건너뜁니다.
응답(201):
{
"jobId": "65f1c0a2b3d4e5f6012345aa",
"status": "queued"
}Python으로 메타데이터가 포함된 이미지 한 개 업로드
동일한 코드로 여러 이미지도 처리할 수 있습니다. ZIP에 파일을 추가하고 imageMetadata에 해당 항목을 추가하세요.
import io
import zipfile
from pathlib import Path
import requests
api = "https://platform.ultralytics.com/api"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
owner, dataset = "acme-vision", "warehouse"
dataset_id = "65f1c0a2b3d4e5f601234567" # id returned by POST /api/datasets
image_path = Path("airbus-wing.jpg")
archive = io.BytesIO()
with zipfile.ZipFile(archive, "w", zipfile.ZIP_DEFLATED) as zf:
zf.write(image_path, image_path.name)
data = archive.getvalue()
signed = requests.post(
f"{api}/upload/signed-url",
headers=headers,
json={
"assetType": "datasets",
"assetId": dataset_id,
"filename": "images.zip",
"contentType": "application/zip",
"totalBytes": len(data),
},
)
signed.raise_for_status()
upload = signed.json()
headers_put = {"Content-Type": "application/zip", **upload.get("headers", {})}
requests.put(upload["uploadUrl"], headers=headers_put, data=data).raise_for_status()
requests.post(
f"{api}/upload/complete",
headers=headers,
json={"sessionId": upload["sessionId"]},
).raise_for_status()
ingest = requests.post(
f"{api}/datasets/{owner}/{dataset}/ingest",
headers=headers,
json={
"sessionId": upload["sessionId"],
"imageMetadata": {
"airbus-wing.jpg": {
"aircraft": {"family": "A350", "section": "wing"},
"inspectionStatus": "reviewed",
}
},
},
)
ingest.raise_for_status()
print(ingest.json())이미지 API#
24자 이미지 ID를 사용해 데이터셋 이미지를 검사하고, 어노테이션을 추가하고, 이동하고, 삭제합니다. 어노테이션 문서를 참조하세요.
이미지 가져오기#
GET /api/images/{imageId}Python SDK: client.images.retrieve(image_id)
metadata(사용자 지정, 사용자 정의), properties(파일 이름, 해시, 크기, 분할, 개수, 타임스탬프), labels 및 데이터셋의 classNames을 반환합니다.
이미지 업데이트#
PATCH /api/images/{imageId}Python SDK: client.images.update(image_id, body=...)
어노테이션 또는 사용자 지정 메타데이터 중 하나만 교체합니다. 두 형식을 모두 보내지 말고 둘 중 하나만 보내세요.
본문(어노테이션):
{
"labels": [
{ "classId": 0, "bbox": [0.5, 0.5, 0.2, 0.3] },
{ "classId": 1, "segments": [0.1, 0.2, 0.3, 0.2, 0.2, 0.4] }
]
}본문(메타데이터):
{
"metadata": { "location": "strasbourg", "reviewed": true }
}라벨 좌표는 0에서 1 사이의 YOLO 정규화 값입니다. 바운딩 박스는 [x_center, y_center, width, height]을 사용합니다. 세그멘테이션 라벨은 다각형 꼭짓점을 평탄화한 목록인 [x1, y1, x2, y2, ...]에 segments을 사용합니다. 포즈 라벨은 일관된 평탄화 형식으로 keypoints을 사용합니다. 가시성은 일반적으로 0, 1 또는 2를 사용하며, 좌표는 쌍인 [x1, y1, x2, y2, ...] 또는 삼중항인 [x1, y1, v1, x2, y2, v2, ...] 형식입니다. 방향이 지정된 박스는 obb 모서리를 사용합니다. 저장된 좌표는 소수점 이하 5자리로 반올림되며, 이미지 하나에 최대 10,000개의 어노테이션을 지정할 수 있습니다.
이미지 삭제#
DELETE /api/images/{imageId}Python SDK: client.images.delete(image_id)
이미지 하나와 해당 어노테이션을 영구적으로 삭제합니다.
이미지 자동 어노테이션#
POST /api/images/{imageId}/predictPython SDK: client.images.predict(image_id, model_id=...)
이미지에 모델을 실행하고 예측된 어노테이션을 반환합니다. 결과는 저장되지 않습니다. 결과가 적절하다고 판단되면 PATCH /api/images/{imageId}을 사용해 저장하세요.
| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
modelId | 문자열 | 예 | 정규화된 전체 모델 URI, ul://{owner}/{project}/{model} 또는 1~200개 클래스가 있는 검출 데이터셋용 클래스 프롬프트 모델 ID입니다. 호스팅 모델(qwen, moondream, florence2, owlv2, yoloe26x, sam3, sam3.1, groundingdino) 또는 openapi.json의 modelId 열거형에 해당하는 유료 제공업체 모델 ID를 사용할 수 있습니다. |
confidence | float | 아니요 | 신뢰도 임계값, 0.01~1.0(기본값: 0.25). 모델별 임계값을 사용하는 클래스 프롬프트 모델에서는 무시됩니다. |
iou | float | 아니요 | 비최대 억제를 위한 IoU 임계값, 0.0~0.95(기본값: 0.7). 클래스 프롬프트 모델에서는 무시됩니다. |
classMapping | 배열 | 아니요 | YOLO 모델의 경우 모델 클래스 순서에 해당하는 데이터셋 클래스 인덱스를 지정하거나 해당 클래스를 제외하려면 null을 지정합니다. 길이가 잘못되었거나 데이터셋 클래스 범위를 벗어난 인덱스를 지정하면 400이 반환됩니다. 클래스 프롬프트 모델에서는 무시됩니다. |
응답: success, predictions(어노테이션 객체), confidences(인덱스에 맞춰 정렬된 점수이며, 클래스 프롬프트 모델에서는 비어 있음), modelUsed, inferenceTime, 클래스 프롬프트 모델의 경우 partial(생성형 모델의 잘린 출력에서 완전한 박스만 반환된 경우 true), 유료 제공업체 모델의 경우 선택적으로 cost(제공업체 키로 청구되는 예상 제공업체 비용(USD)이며, 추정할 수 없는 경우 생략됨)을 반환합니다. 클래스가 데이터셋과 일치하지 않는 YOLO 모델, 검출 데이터셋이 아니거나 클래스 수가 1~200개 범위를 벗어나는 데이터셋에서 사용하는 클래스 프롬프트 모델, 데이터셋 작업 공간의 설정 > API 키에 제공업체 키를 저장하지 않은 유료 제공업체 모델은 422을 반환합니다(code: missing_provider_api_key). 제공업체 오류에는 제공업체의 메시지가 포함됩니다. 제공업체가 400, 401, 403 또는 404(거부된 키, 모델 또는 요청)로 응답하면 422, 요청 제한에 도달하면 429, 그 밖의 제공업체 오류에는 503이 반환됩니다. 깊이 데이터셋은 400을 반환하며, 연결된 스토리지에 있거나 이미지 채널이 3개를 초과하는 데이터셋은 409를 반환합니다.
유사 이미지 찾기#
GET /api/images/{imageId}/similarPython SDK: client.images.find_similar_images(image_id)
공개 데이터셋과 사용자의 개인 및 팀 데이터셋에서 시각적으로 유사한 images을 최대 24개 반환합니다. 각 이미지에는 score(0~1), 서명된 thumbnailUrl, 원본 dataset(owner, dataset, license)이 포함됩니다. 원본 데이터셋에 이미 있는 이미지와 쿼리 이미지의 복사본은 제외됩니다. 이미지에 대한 보기 권한이 있는 API 키가 필요합니다. 아직 임베딩되지 않은 이미지는 먼저 임베딩하며, 503은 준비에 실패했음을 의미하므로 다시 시도하세요.
데이터셋 자동 어노테이션#
POST /api/datasets/{owner}/{dataset}/predict/batchPython SDK: client.datasets.create_batch(owner, dataset, body={...})(ultralytics-platform>=0.1.57)
데이터셋 버전을 저장한 다음, 모델을 사용해 데이터셋의 라벨이 없는 이미지에 라벨을 지정하는 실행을 대기열에 추가하고 202을 반환합니다. 요청 본문은 단일 이미지 엔드포인트와 동일한 modelId, confidence, iou, classMapping 필드와, 이미 라벨이 있는 이미지에도 어노테이션을 추가하는 includeAnnotated(기본값 false)를 사용합니다. 클래스 프롬프트 모델은 신뢰도 점수 없이 데이터셋 클래스를 검출합니다. 유료 제공업체 모델을 사용하려면 실행이 승인되기 전에 데이터셋 작업 공간의 설정 > API 키에 제공업체 키를 저장해야 합니다(422, code: missing_provider_api_key). 기존 라벨은 변경되지 않으며, 실제로 처리한 이미지에 대해 실행 비용이 청구됩니다. 402은 잔액으로 예상 비용을 충당할 수 없음을 의미하고, 409은 데이터셋을 사용할 준비가 되지 않았거나, 어노테이션할 이미지가 남아 있지 않거나, 이미 실행 중인 작업이 있음을 의미합니다. 422는 데이터셋에 클래스가 없거나 클래스 프롬프트 모델에 검출 데이터셋이 아닌 데이터셋 또는 클래스 수가 1~200개 범위를 벗어나는 데이터셋이 지정되었음을 의미합니다. 이 엔드포인트를 호출하기 전에 클래스 엔드포인트를 사용해 클래스를 생성하세요. 앱은 실행을 시작하기 전에 Map classes 단계에서 이 작업을 수행합니다.
동일한 경로에서 GET (client.datasets.batch(owner, dataset))을 호출하면 진행 중인 실행과 진행 상황을 반환하거나, 마지막으로 완료된 실행을 닫힐 때까지 반환하며, 생성형 모델의 실행에서 잘린 출력 중 완전한 박스만 유지된 경우 해당 실행의 results에는 partialImages이 포함됩니다; DELETE (client.datasets.delete_batch(owner, dataset))는 진행 중인 실행을 취소하거나 청구를 정산하고 완료된 요약을 닫습니다.
동일한 엔드포인트는 "operation": "blur", confidence(기본값 0.25) 및 boxScale(0.5~1.5, 기본값 1)를 사용해 얼굴을 흐리게 처리합니다. imageId은 실행을 이미지 하나로 제한합니다. 버전을 생성하지 않으며 라벨도 변경하지 않습니다. "preview": true를 보내면 변경 없이 최대 6개 이미지에 처리한 다음, 반환된 jobId을 동일한 설정과 함께 previewJobId로 보내 적용할 수 있습니다. 이미 적용된 미리 보기는 재사용할 수 없으며 409를 반환합니다. 미리 보기가 대기 중일 때 해당 ID를 previewJobId으로 전달해 DELETE를 호출하면 미리 보기를 폐기합니다.
{ "operation": "blur", "confidence": 0.25, "boxScale": 1, "preview": true }이미지 일괄 이동#
PATCH /api/images/bulkPython SDK: client.images.update_bulk(image_ids=..., split=...)
한 데이터셋에서 다른 분할로 이미지 최대 1,000개를 이동합니다.
{
"imageIds": ["65f1c0a2b3d4e5f601234567"],
"split": "val",
"conflictPolicy": "skip"
}파일 이름 또는 콘텐츠 충돌이 발생하면 바스켓 전체에 적용할 skip, keep_both 또는 replace 중 하나를 conflictPolicy로 선택할 때까지 409이 반환됩니다. 응답에는 modifiedCount, skippedCount, targetSplit이 포함됩니다.
이미지 일괄 삭제#
DELETE /api/images/bulkPython SDK: client.images.delete_bulk(image_ids=...)
{
"imageIds": ["65f1c0a2b3d4e5f601234567", "65f1c0a2b3d4e5f601234568"]
}단일 데이터셋에서 이미지 최대 1,000개를 삭제하고 deletedCount 및 deletedImageIds을 반환합니다.
서명된 이미지 URL 가져오기#
POST /api/images/urlsPython SDK: client.images.urls(image_ids=...)
단일 데이터셋에서 최대 100개의 이미지 ID에 대한 임시 서명 URL을 반환합니다.
{
"imageIds": ["65f1c0a2b3d4e5f601234567"]
}응답: urls, thumbnails, depths(쌍을 이루는 깊이 이미지의 깊이 타깃 미리 보기)를 반환하며, 모두 이미지 ID를 키로 사용합니다.
프로젝트 API#
모델을 프로젝트별로 구성합니다. 각 모델은 하나의 프로젝트에 속합니다. 프로젝트 문서를 참조하세요.
프로젝트 목록#
GET /api/projects/{owner}Python SDK: client.projects.list(owner)
쿼리 매개변수:
| 매개변수 | 유형 | 설명 |
|---|---|---|
limit | int | 반환할 최대 프로젝트 수(기본값: 20, 최대: 500) |
프로젝트 가져오기#
GET /api/projects/{owner}/{project}Python SDK: client.projects.retrieve(owner, project)
project 객체, 모델별 요약(status, metrics, epochs, weights, train args) 배열인 models, isOwner를 반환합니다. 모델 이름 또는 메타데이터로 models를 필터링하려면 search(최대 200자)을 전달하세요.
프로젝트 만들기#
POST /api/projectsPython SDK: client.projects.create(project=..., name=...)
| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
project | 문자열 | 예 | Platform URL에 사용되는 프로젝트 이름 |
name | 문자열 | 예 | 표시 이름(최대 100자) |
description | 문자열 | 아니요 | 설명(최대 1000자) |
visibility | 문자열 | 아니요 | public 또는 private |
tags | 배열 | 아니요 | 태그 최대 50개 |
license | 문자열 | 아니요 | 프로젝트 라이선스 식별자 |
metadata | 객체 | 아니요 | 사용자 지정 JSON 메타데이터 |
owner | 문자열 | 아니요 | 팀 워크스페이스 핸들. 기본값은 개인 워크스페이스입니다 |
curl -X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"project": "inspection",
"name": "Inspection",
"description": "Detection experiments",
"metadata": {"department": "manufacturing", "cost_center": "cv-01"}
}' \
https://platform.ultralytics.com/api/projects응답(201): id, owner, project, region.
워크스페이스에 이미 존재하는 project 슬러그(휴지통에 있는 항목 포함)를 사용하면 409이 반환됩니다.
프로젝트 업데이트#
PATCH /api/projects/{owner}/{project}Python SDK: client.projects.update(owner, project)
허용되는 필드: name, description, visibility, metadata, tags, license, archived, iconColor, iconLetter, viewPreferences, starred입니다.
{
"metadata": { "department": "research", "program": "inspection" }
}metadata에 빈 객체({})를 전송하면 해당 객체가 삭제됩니다. 프로젝트 메타데이터에는 데이터셋 메타데이터와 동일한 128자 키 및 직렬화된 객체 기준 500,000자 제한이 적용됩니다.
프로젝트 삭제#
DELETE /api/projects/{owner}/{project}Python SDK: client.projects.delete(owner, project)
프로젝트와 해당 모델을 휴지통으로 이동하고 cascadedModels을 반환하며, 해당 모델을 사용하는 배포를 영구 삭제합니다. 프로젝트를 복원해도 배포는 복원되지 않습니다. 502는 배포 정리가 완료되지 않았음을 의미합니다. 정리가 완료될 때까지 모델은 휴지통에 유지됩니다.
프로젝트 복제#
POST /api/projects/{owner}/{project}/clonePython SDK: client.projects.clone(owner, project)
액세스 가능한 프로젝트와 완료된 모델을 복제합니다. 선택적 본문에는 project, name, description, visibility, license 및 대상 owner를 지정할 수 있습니다.
모델 API#
학습된 YOLO 모델을 관리합니다. 지표 확인, 가중치 다운로드, 추론 실행, 학습 모니터링을 수행할 수 있습니다. 자세한 내용은 모델 문서를 참조하세요.
프로젝트의 모델 목록 조회#
GET /api/models/{owner}/{project}Python SDK: client.models.list(owner, project)
쿼리 매개변수:
| 매개변수 | 유형 | 설명 |
|---|---|---|
limit | int | 반환할 최대 모델 수(기본값: 20, 최대: 100) |
모델 조회#
GET /api/models/{owner}/{project}/{model}Python SDK: client.models.retrieve(owner, project, model)
쿼리 매개변수:
| 매개변수 | 유형 | 설명 |
|---|---|---|
analysis | int | 모델 대신 이미지별 검증 분석을 반환하려면 1으로 설정합니다. |
기본 응답에는 상태, 태스크, 지표, trainArgs, trainResults, classNames, computeCost, metadata 등이 포함된 model 객체와 isOwner이 포함됩니다.
모델 생성#
POST /api/modelsPython SDK: client.models.create(body=...)
가중치를 연결하거나 학습할 수 있는 미학습 모델 레코드를 생성합니다.
| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
project | 문자열 | 예 | 대상 프로젝트 이름 |
owner | 문자열 | 아니요 | 워크스페이스 핸들입니다. 기본값은 개인 워크스페이스입니다. |
model | 문자열 | 아니요 | 플랫폼 URL에 사용되는 모델 이름입니다. 생략하면 자동으로 생성됩니다. |
name | 문자열 | 아니요 | 표시 이름(model과 함께 지정한 경우에만 허용됨) |
description | 문자열 | 아니요 | 설명(최대 1000자) |
task | 문자열 | 아니요 | detect, segment, semantic, depth, classify, pose 또는 obb |
metadata | 객체 | 아니요 | 사용자 지정 JSON 메타데이터 |
trainArgs | 객체 | 아니요 | 기록할 학습 인수 |
metrics | 객체 | 아니요 | mAP50, mAP50-95, precision, recall 등의 지표 |
epochs | 숫자 | 아니요 | 이미 학습된 모델의 에포크 수 |
version | 문자열 | 아니요 | 버전 레이블(최대 50자) |
응답(201): id, owner, project, model, region.
.pt 가중치를 연결하려면 assetType: "models"과 이 모델의 id를 assetId으로 사용하여 서명된 업로드 URL을 요청하고, 파일을 반환된 URL에 PUT한 다음 반환된 sessionId을 사용해 POST /api/upload/complete를 호출합니다.
모델 업데이트#
PATCH /api/models/{owner}/{project}/{model}Python SDK: client.models.update(owner, project, model)
허용되는 필드에는 name, description, color, metadata, status, license, datasetSlug, trainArgs, trainResults, epochs, bestEpoch, bestFitness, version, trainingError, starred가 포함됩니다. projectId만 전달하면 모델이 동일한 소유자의 다른 프로젝트로 이동합니다. 응답에는 대상 프로젝트의 모델 slug, 해당 슬러그가 이미 사용 중인 경우 renamed: true, 모델이 아직 학습 중인 경우 409이 반환됩니다.
{
"metadata": { "release": "candidate-3", "reviewed": true }
}사용자 지정 metadata은 trainArgs, environment, trainResults과 같은 학습 소유 필드와 별개이며, 데이터셋 메타데이터와 동일한 크기 제한이 적용됩니다.
모델 삭제#
DELETE /api/models/{owner}/{project}/{model}Python SDK: client.models.delete(owner, project, model)
모델을 30일 동안 휴지통으로 이동하고, 대기 중인 교체 항목을 포함하여 해당 모델을 사용하는 모든 배포를 영구 삭제합니다. 모델을 복원해도 배포는 복원되지 않습니다.
모델 파일 다운로드#
GET /api/models/{owner}/{project}/{model}/filesPython SDK: client.models.files(owner, project, model)
모델 가중치에 대한 단기 유효 서명 URL을 반환합니다.
{
"files": [
{
"name": "best.pt",
"size": 6534127,
"downloadUrl": "https://storage.googleapis.com/...&signature=..."
}
]
}최악의 검증 이미지와 유사한 이미지 찾기#
GET /api/models/{owner}/{project}/{model}/similar-imagesPython SDK: client.models.find_similar_training_images(owner, project, model)
최대 100개의 images을 반환합니다. 형식은 유사한 이미지 찾기와 같으며, 이 학습 실행에서 점수가 가장 낮았던 검증 이미지와 유사하되 학습 데이터셋에 이미 포함된 이미지는 제외합니다. 해당 최악 이미지 중 일부를 기준으로 검색하려면 hashes(쉼표로 구분, 최대 100개)를 전달합니다. 모델 워크스페이스에 액세스할 수 있는 API 키가 필요합니다. 실행에서 이미지별 결과를 기록하지 않은 경우 목록은 비어 있으며, 404은 최악의 이미지가 아직 임베딩되지 않았다는 의미이기도 합니다. 먼저 학습 데이터셋에서 데이터셋 임베딩을 실행하세요.
모델 복제#
POST /api/models/{owner}/{project}/{model}/clonePython SDK: client.models.clone(owner, project, model, project_body=...)
액세스 가능한 모델을 기존 프로젝트로 복사합니다.
{
"owner": "acme-vision",
"project": "inspection",
"model": "v3-copy",
"name": "V3 Copy",
"description": "Cloned from a public model"
}| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
project | 문자열 | 예 | 대상 프로젝트 이름 |
owner | 문자열 | 아니요 | 대상 워크스페이스입니다. 기본값은 개인 워크스페이스입니다. |
model | 문자열 | 아니요 | 대상 모델 이름 |
name | 문자열 | 아니요 | 대상 표시 이름 |
description | 문자열 | 아니요 | 복제 모델 설명 |
추론 실행#
POST /api/models/{owner}/{project}/{model}/predictPython SDK: client.models.predict(owner, project, model, body=...)
공개 모델은 인증 없이 예측할 수 있습니다. 비공개 모델 및 공유 모델에는 상위 프로젝트에 액세스할 수 있는 API 키가 필요합니다.
멀티파트 양식:
| 매개변수 | 유형 | 기본값 | 범위 | 설명 |
|---|---|---|---|---|
file | 파일 | - | - | 이미지 또는 동영상 파일(source이 설정된 경우에는 선택 사항) |
conf | float | 0.25 | 0.01 – 1.0 | 최소 신뢰도 임계값 |
iou | float | 0.7 | 0.0 – 0.95 | NMS IoU 임계값 |
imgsz | int | - | 32 – 1280 | 입력 이미지 크기(픽셀 단위). 기본값은 모델의 학습 크기이며, 사용할 수 없는 경우 640입니다. |
normalize | bool | false | - | 경계 상자 좌표를 0~1 범위로 반환합니다 |
decimals | int | 5 | 0 – 10 | 좌표 값의 소수점 정밀도 |
vid_stride | int | 1 | ≥ 1 | 동영상의 N번째 프레임마다 예측합니다. 이미지에는 적용되지 않습니다. |
bits | int | 8 | 8, 12, 16 | 깊이 맵 양자화. 깊이 모델에만 적용됩니다. |
source | 문자열 | - | - | 이미지 URL 또는 base64 문자열(file의 대안). Platform API를 통한 요청은 최대 4,096자입니다. |
file 또는 source 중 하나를 지정합니다. 깊이 모델은 깊이 맵의 PNG 양자화 방식을 선택하는 bits(8, 12 또는 16)도 지원합니다. 서비스의 입력 제한을 초과하는 요청은 413을 반환합니다.
curl -X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@image.jpg" \
-F "conf=0.5" \
https://platform.ultralytics.com/api/models/acme-vision/inspection/v3/predict응답:
images의 각 항목에는 shape, speed, results과 밀집 예측 태스크의 경우 semantic_mask 또는 depth PNG 페이로드가 포함됩니다(깊이 값은 pixel × max / divisor이며 기본 8비트 맵에서는 제수 255, bits이 12 또는 16이면 65535를 사용합니다). metadata 객체는 이미지 수, 모델 클래스 이름, 함수 실행 시간, 태스크 및 서비스 버전을 보고합니다. 내부 모델 경로는 반환되지 않습니다.
{
"images": [
{
"shape": [1080, 1920],
"speed": { "preprocess": 2.1, "inference": 12.4, "postprocess": 1.3 },
"results": [
{
"class": 0,
"name": "person",
"confidence": 0.92,
"box": { "x1": 100, "y1": 50, "x2": 300, "y2": 400 }
}
]
}
],
"metadata": {
"imageCount": 1,
"classNames": ["person", "forklift"],
"functionTimeAlive": 184.2,
"functionTimeCall": 0.31,
"task": "detect",
"version": { "ultralytics": "8.4.120" }
}
}학습 진행 상태 확인#
GET /api/models/{owner}/{project}/{model}/trainingPython SDK: client.models.training(owner, project, model)
상태, 에포크 진행률, 시간, 컴퓨팅 세부 정보, 학습 인수, 에포크 지표 및 안전한 오류 세부 정보를 포함하는 job을 반환합니다. 모델이 한 번도 학습된 적이 없는 경우에는 null을 반환합니다. 공개 프로젝트의 모델은 인증 없이 조회할 수 있습니다.
학습 취소#
DELETE /api/models/{owner}/{project}/{model}/trainingPython SDK: client.models.delete_training(owner, project, model)
실행 중인 컴퓨팅 인스턴스를 종료하고 작업을 취소됨으로 표시합니다. 학습이 더 이상 활성 상태가 아니면 409을 반환합니다.
학습 API#
클라우드 GPU에서 YOLO 학습을 시작하고 진행 상황을 실시간으로 모니터링합니다. 자세한 내용은 클라우드 학습 문서를 참조하세요.
GPU 가용성 조회#
GET /api/training/gpu-availabilityPython SDK: client.training.gpu_availability()
GPU ID를 기준으로 현재 재고 상태를 반환합니다. 공개 API이며 인증이 필요하지 않습니다. 관리형 학습 용량을 포함하려면 managed=true을 전달해야 하며, 이 경우 API 키가 필요합니다.
학습 시작#
POST /api/training/startPython SDK: client.training.start(model_id=..., train_args=...)
| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
modelId | 문자열 | 예 | 학습할 모델의 ID |
trainArgs | 객체 | 예 | YOLO 학습 인수입니다. model, data, epochs가 필수입니다. |
gpuType | 문자열 | 아니요 | 사용할 클라우드 GPU(기본값: rtx-4090) |
captureDatasetVersion | 불리언 | 아니요 | 이 실행을 위해 변경 불가능한 데이터셋 버전을 저장합니다(기본값: false). |
curl -X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"modelId": "65f1c0a2b3d4e5f601234599",
"gpuType": "rtx-4090",
"trainArgs": {
"model": "yolo26n.pt",
"data": "ul://acme-vision/datasets/warehouse",
"epochs": 100,
"imgsz": 640,
"batch": 16
}
}' \
https://platform.ultralytics.com/api/training/start응답:
{
"modelId": "65f1c0a2b3d4e5f601234599",
"status": "starting",
"gpuType": "rtx-4090",
"estimatedCost": { "pricePerHour": 0.69, "gpuMemoryGb": 24 },
"billing": {
"estimatedCostCents": 138,
"estimatedCostDisplay": "$1.38",
"balanceCents": 2500
}
}크레딧 잔액이 부족하면 학습에서 402을 반환하고, 요청한 GPU를 사용할 수 없으면 503을 반환합니다.
rtx-2000-ada부터 b300까지 26가지 GPU 유형을 사용할 수 있으며, 여기에는 rtx-4090, l40s, a100-80gb-pcie, a100-80gb-sxm, rtx-pro-6000, h100-sxm, h200-sxm, b200가 포함됩니다. 가격을 포함한 전체 목록은 클라우드 학습을 참조하세요.
내보내기 API#
에지 배포를 위해 모델을 ONNX, TensorRT, CoreML, LiteRT와 같은 최적화된 형식으로 변환합니다. 자세한 내용은 배포 문서를 참조하세요.
내보내기 목록 조회#
GET /api/models/{owner}/{project}/{model}/exportsPython SDK: client.exports.list(owner, project, model)
쿼리 매개변수:
| 매개변수 | 유형 | 설명 |
|---|---|---|
status | 문자열 | queued, starting, running, completed, failed 또는 cancelled로 필터링합니다. |
limit | int | 반환할 최대 내보내기 수(기본값: 20, 최대: 100) |
내보내기 생성#
POST /api/models/{owner}/{project}/{model}/exportsPython SDK: client.exports.create(owner, project, model, format=...)
| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
format | 문자열 | 예 | 대상 내보내기 형식(아래 표 참조) |
gpuType | 문자열 | 조건부 | format이 engine인 경우 필수입니다. 지원되는 GPU 또는 Jetson 대상을 사용하세요. |
args | 객체 | 아니요 | 내보내기 옵션: imgsz, quantize, dynamic, simplify, opset, conf, iou, batch, workspace, nms, optimize, name(RKNN, QNN, Hailo, Ascend, Xilinx용 디바이스 대상) |
curl -X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"format": "onnx", "args": {"imgsz": 640, "quantize": 16}}' \
https://platform.ultralytics.com/api/models/acme-vision/inspection/v3/exports각 형식은 아래 내보내기 표의 인수 열에 지정된 옵션만 지원합니다. 해당 옵션을 지원하지 않는 형식에 기본값이 아닌 batch, dynamic, opset, simplify, workspace 또는 optimize 값을 지정하면 400이 반환됩니다. imx 내보내기는 INT8만 지원하며 detect, segment, classify 및 pose 모델에서 사용할 수 있습니다. YOLO26 모델과 나노 이외의 YOLOv8 또는 YOLO11 크기는 400을 반환합니다.
응답(201): id, format, status(queued 또는 running), region, 그리고 TensorRT 내보내기의 경우 gpuType입니다. 동일한 내보내기가 이미 진행 중이면 409을 반환합니다.
지원되는 형식:
아래 공통 내보내기 표의 format 인수를 사용합니다. PyTorch는 소스 형식이며 API 내보내기 대상이 아닙니다.
| 형식 | format 인수 | 모델 | 메타데이터 | 인수 |
|---|---|---|---|---|
| PyTorch | - | yolo26n.pt | ✅ | - |
| TorchScript | torchscript | yolo26n.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| Apple Core AI | coreai | yolo26n.aimodel | ✅ | imgsz, batch, quantize |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz, quantize, opset, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n.pb | ❌ | imgsz, opset, batch, device |
| TF Edge TPU | edgetpu | yolo26n_edgetpu.tflite | ✅ | imgsz, quantize, opset, data, fraction, device |
| LiteRT | litert | yolo26n.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| PaddlePaddle | paddle | yolo26n_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n.mnn | ✅ | imgsz, batch, dynamic, quantize, simplify, opset, nms, device |
| NCNN | ncnn | yolo26n_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo26n_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n_rknn_model/ | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| ExecuTorch | executorch | yolo26n_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n_deepx_model/ | ✅ | imgsz, quantize, simplify, opset, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n_qnn.onnx | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| Hailo | hailo | yolo26n_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou, device |
| Huawei Ascend | ascend | yolo26n_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms, device |
| AMD Xilinx | xilinx | yolo26n_xilinx_model/ | ✅ | imgsz, name, quantize, data, fraction, opset, simplify, device |
nms=None은 외부 NMS를 위한 원시 출력을 기본값으로 사용합니다. 사용 가능한 NMS-free head를 선택하려면 nms=False을 설정합니다. 지원되지 않는 형식은 해당 형식의 기본 출력 경로로 대체됩니다. 위의 nms 항목은 nms=True을 사용해 NMS를 포함할 수 있는 형식을 나타냅니다.
내보내기 상태 조회#
GET /api/models/{owner}/{project}/{model}/exports/{exportId}Python SDK: client.exports.retrieve(owner, project, model, export_id)
status, format, args, gpuType(TensorRT만 해당), 타임스탬프와 export 객체를 반환합니다. 완료되면 size, downloadUrl, downloadFilename이 포함된 file 객체도 반환합니다.
내보내기 취소 또는 삭제#
DELETE /api/models/{owner}/{project}/{model}/exports/{exportId}Python SDK: client.exports.delete(owner, project, model, export_id)
활성 내보내기를 취소하거나 완료된 내보내기와 해당 파일을 삭제합니다. 응답에는 수행된 작업이 표시됩니다.
{
"success": true,
"action": "cancelled"
}배포 API#
상태 점검 및 모니터링 기능을 갖춘 전용 추론 엔드포인트에 모델을 배포합니다. 자세한 내용은 엔드포인트 문서를 참조하세요.
배포 목록 조회#
GET /api/deployments/{owner}Python SDK: client.deployments.list(owner)
쿼리 매개변수:
| 매개변수 | 유형 | 설명 |
|---|---|---|
status | 문자열 | creating, deploying, ready, stopping, stopped 또는 failed |
model | 문자열 | {project}/{model}으로 필터링합니다(예: inspection/v3). |
limit | int | 반환할 최대 배포 수(기본값: 20, 최대: 100) |
익명 호출자는 공개 모델 하나를 기준으로 필터링해야 합니다. 전체 워크스페이스 목록을 조회하려면 인증이 필요합니다.
배포 생성#
POST /api/deployments/{owner}Python SDK: client.deployments.create(owner, project=..., model=..., deployment=..., name=..., region=...)
본문:
{
"project": "inspection",
"model": "v3",
"deployment": "edge-1",
"name": "Edge 1",
"region": "us-central1"
}| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
project | 문자열 | 예 | 모델이 포함된 프로젝트 |
model | 문자열 | 예 | 배포할 모델 |
deployment | 문자열 | 예 | 플랫폼 URL에 사용되는 배포 이름 |
name | 문자열 | 예 | 표시 이름 |
region | 문자열 | 예 | 지원되는 배포 지역 42곳 중 하나 |
cpu | 숫자 | 아니요 | vCPU 코어: 1(기본값), 2, 4, 6 또는 8 |
memoryGi | 숫자 | 아니요 | 메모리(GiB): 2(기본값), 4, 8, 16, 24 또는 32 |
응답(201): id, deployment, status(creating), message 및 region.
기본 크기인 1 vCPU / 2 GiB는 유휴 상태일 때 0으로 축소되며 무료 배포 허용량을 사용할 수 있습니다. 다른 크기에는 사용량 기반 요금이 적용됩니다. 현재 값은 모든 배포 조회 시 resources 객체에 반환됩니다.
지연 시간을 최소화하려면 사용자와 가까운 지역을 선택하세요. 플랫폼 UI에는 사용 가능한 42개 지역 모두의 지연 시간 예상치가 표시됩니다.
배포 조회#
GET /api/deployments/{owner}/{deployment}Python SDK: client.deployments.retrieve(owner, deployment)
deployment 객체를 반환하며, 여기에는 status, statusMessage, region, serviceUrl, resources, 사용자 지정 metadata이 포함됩니다. 소유자의 경우 camera과 cameraApplying도 포함됩니다.
배포 업데이트#
PATCH /api/deployments/{owner}/{deployment}Python SDK: client.deployments.update(owner, deployment, body=...)
다음 본문 중 하나를 전송합니다:
{ "name": "Edge 1 (primary)" }이름을 변경하면 URL의 deployment 값이 새 이름을 슬러그로 변환한 값으로 설정되고, 이 값은 deployment로 반환됩니다. 이전 경로는 404를 반환하며 serviceUrl은 변경되지 않습니다. 비어 있는 metadata 객체는 사용자 지정 메타데이터를 지웁니다. 교체 작업은 배포 ID, 리전, 엔드포인트 URL을 유지하면서 새 리비전을 배포합니다. 배포에 실패하면 기존 리비전이 계속 실행됩니다. 교체 모델은 키로 액세스할 수 있는 가중치가 포함된 완료된 모델이어야 합니다. 카메라 작업은 RTSP 또는 RTSPS 카메라를 저장하며, 준비된 사용자 지정 리소스 엔드포인트에서 해당 카메라의 추론을 계속 실행합니다(백그라운드 카메라 참조). "url": null을 사용하거나 크기를 기본값으로 조정하면 카메라가 제거됩니다. 기본 크기 엔드포인트에 카메라를 저장하면 403이 반환됩니다. 카메라 변경을 적용하는 동안에는 202이 status ready과 함께 반환됩니다. cameraApplying이 더 이상 true가 아닐 때까지 배포 상태를 폴링한 다음 camera을 확인하세요. 변경에 실패하면 이전 카메라가 유지되고 statusMessage가 설정됩니다. 작업이 완료되면 200가 status ready 또는 stopped과 함께 반환됩니다. 다른 작업이 계속 배포 중이면 202가 deploying 또는 stopping과 함께 반환됩니다.
배포 삭제#
DELETE /api/deployments/{owner}/{deployment}Python SDK: client.deployments.delete(owner, deployment)
추론 엔드포인트를 영구적으로 제거합니다.
상태 검사#
GET /api/deployments/{owner}/{deployment}/healthPython SDK: client.deployments.health(owner, deployment)
엔드포인트에 핑을 보내 활성화하고, healthy, latencyMs, 업스트림 status 코드를 반환합니다.
배포에서 추론 실행#
POST /api/deployments/{owner}/{deployment}/predictPython SDK: client.deployments.predict(owner, deployment, body=...)
이미지 또는 비디오를 전용 엔드포인트로 전달합니다. 요청 및 응답 규약은 모델 추론과 일치합니다. 카메라 스트림은 프록시되지 않습니다. 실시간 카메라 추론에 설명된 대로 엔드포인트 URL로 보내세요.
멀티파트 양식:
| 매개변수 | 유형 | 기본값 | 범위 | 설명 |
|---|---|---|---|---|
file | 파일 | - | - | 이미지 또는 동영상 파일(source이 설정된 경우에는 선택 사항) |
conf | float | 0.25 | 0.01 – 1.0 | 최소 신뢰도 임계값 |
iou | float | 0.7 | 0.0 – 0.95 | NMS IoU 임계값 |
imgsz | int | - | 32 – 1280 | 입력 이미지 크기(픽셀 단위). 기본값은 모델의 학습 크기이며, 사용할 수 없는 경우 640입니다. |
normalize | bool | false | - | 경계 상자 좌표를 0~1 범위로 반환합니다 |
decimals | int | 5 | 0 – 10 | 좌표 값의 소수점 정밀도 |
vid_stride | int | 1 | ≥ 1 | 동영상의 N번째 프레임마다 예측합니다. 이미지에는 적용되지 않습니다. |
bits | int | 8 | 8, 12, 16 | 깊이 맵 양자화. 깊이 모델에만 적용됩니다. |
source | 문자열 | - | - | 이미지 URL 또는 base64 문자열(file의 대안). Platform API를 통한 요청은 최대 4,096자입니다. |
메트릭 가져오기#
GET /api/deployments/{owner}/{deployment}/metricsPython SDK: client.deployments.metrics(owner, deployment)
쿼리 매개변수:
| 매개변수 | 유형 | 설명 |
|---|---|---|
range | 문자열 | 1h, 6h, 24h(기본값), 7d 또는 30d |
sparkline | 불리언 | 전체 시리즈 대신 간결한 대시보드 요약을 반환합니다(기본값: false). |
view | 문자열 | overview은 요청, 오류 및 P95 지연 시간 메트릭만 반환합니다. |
전체 응답에는 summary(요청 총계, 오류율, 평균 및 p50/p95/p99 지연 시간)과 timeSeries(요청, 오류, 지연 시간, CPU, 메모리, 인스턴스 수)이 포함됩니다. 스파크라인 응답은 requests24h(시간별 요청 수, 요청이 없는 시간은 생략), totalRequests, errorRate, avgLatencyMs(시간별 P95 지연 시간의 평균)를 반환합니다. view=overview을 사용하면 summary에는 totalRequests, errorRate, p95LatencyMs이 포함되고, timeSeries에는 requests, errors, latencyP95가 포함됩니다.
로그 가져오기#
GET /api/deployments/{owner}/{deployment}/logsPython SDK: client.deployments.logs(owner, deployment)
쿼리 매개변수:
| 매개변수 | 유형 | 설명 |
|---|---|---|
severity | 문자열 | 쉼표로 구분: DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY |
limit | int | 반환할 항목 수(기본값: 50, 최대: 200) |
pageToken | 문자열 | 이전 응답의 페이지네이션 토큰 |
에이전트 API#
에이전트 워크플로를 저장하고 관리합니다. API는 에이전트 정의를 저장하며, 실행은 Agents 캔버스에서 시작합니다. 여기서 https://platform.ultralytics.com/agents?workflow={id}을 선택하면 저장된 에이전트가 열립니다. Python SDK 메서드에는 ultralytics-platform>=0.1.74가 필요합니다.
모든 작업은 선택 사항인 owner 쿼리 매개변수를 지원하며, 이 매개변수에는 소속된 워크스페이스의 사용자 이름을 지정합니다(기본값: 본인). 목록 조회에는 뷰어 액세스 권한이 필요하며, 저장 및 삭제에는 편집자 액세스 권한이 필요합니다.
에이전트 목록 조회#
GET /api/workflowsPython SDK: client.agents.list()
| 매개변수 | 유형 | 설명 |
|---|---|---|
owner | 문자열 | 워크스페이스 사용자 이름(기본값: 본인) |
id | 문자열 | graph이 포함된 에이전트 하나를 반환합니다. |
search | 문자열 | 에이전트 이름으로 필터링 |
응답은 workflows에 최대 100개의 에이전트를 나열하며, 최근에 업데이트된 항목부터 표시합니다. 각 에이전트에는 id, username, name, version, createdAt, updatedAt이 포함됩니다. id을 요청하면 에이전트의 graph도 반환됩니다.
에이전트 저장#
PUT /api/workflowsPython SDK: client.agents.save(name=..., graph=..., version=...)
에이전트를 생성하려면 version: 0을 전송합니다. 에이전트를 업데이트하려면 해당 에이전트의 id과 마지막 목록 조회 또는 저장 시 반환된 version를 전송합니다. 오래된 version은 409를 반환하므로 에이전트 목록을 다시 조회한 후 재시도하세요. 연결이 순환을 이루거나 블록에 입력이 두 개 이상 연결된 그래프는 400를 반환합니다.
from ultralytics_platform import Platform
def block(node_id, kind, x, config):
return {
"id": node_id,
"type": "agent",
"position": {"x": x, "y": 0},
"data": {"label": kind, "type": kind, "config": config},
}
graph = {
"nodes": [
block("images", "Dataset", 0, {"dataset": "official:coco8", "split": "val", "maxInputs": 2}),
block("yolo", "YOLO", 220, {"model": "ul://ultralytics/yolo26/yolo26n", "task": "detect"}),
block("output", "Output", 440, {}),
],
"edges": [{"id": "e1", "source": "images", "target": "yolo"}, {"id": "e2", "source": "yolo", "target": "output"}],
"templateId": "",
}
with Platform() as client:
saved = client.agents.save(name="Detect COCO8", graph=graph, version=0)
print(saved["id"], saved["version"], saved["errors"])응답은 에이전트 id, 새 version, 그리고 errors를 반환하며, 캔버스에서 경고로 표시할 블록의 예로는 데이터 세트가 선택되지 않은 데이터 세트 블록이 있습니다. 어느 경우든 에이전트는 저장됩니다. 모든 블록 유형과 해당 구성에 대해서는 openapi.json를 참조하세요.
에이전트 삭제#
DELETE /api/workflows?id={id}Python SDK: client.agents.delete(id=...)
에이전트를 삭제하고 활성 실행을 취소합니다. 삭제된 에이전트는 휴지통에 표시되지 않으며 복원할 수 없습니다.
휴지통 API#
소프트 삭제된 프로젝트, 데이터셋, 모델을 확인하고 복원하거나 영구적으로 삭제합니다. 항목은 30일 후 자동으로 완전히 삭제됩니다. 휴지통 문서를 참조하세요.
휴지통 목록 조회#
GET /api/trashPython SDK: client.lifecycle.trash()
쿼리 매개변수:
| 매개변수 | 유형 | 설명 |
|---|---|---|
type | 문자열 | all(기본값), project, dataset 또는 model |
page | int | 페이지 번호(기본값: 1) |
limit | int | 페이지당 항목 수(기본값: 50, 최대: 200) |
id | 문자열 | type project 또는 model를 사용하면 해당 항목을 삭제할 때 영향을 받는 모델과 배포를 미리 확인합니다. |
응답에는 items(각 항목에 daysRemaining 포함), total, page, limit, totalPages, 유형별 총계가 포함된 summary이 포함됩니다. id을 사용하면 대신 resources이 반환되며, 여기에는 영향을 받는 모델과 영구적으로 삭제될 배포가 포함됩니다.
항목 복원#
POST /api/trashPython SDK: client.lifecycle.restore(id=..., type=...)
{
"id": "65f1c0a2b3d4e5f601234567",
"type": "dataset"
}프로젝트를 복원하면 프로젝트와 함께 휴지통으로 이동한 모델도 복원되며, 복원된 모델은 restoredModels으로 보고됩니다.
영구 삭제#
DELETE /api/trashPython SDK: client.lifecycle.delete_trash(body=...)
항목 하나 삭제:
{
"id": "65f1c0a2b3d4e5f601234567",
"type": "dataset"
}또는 휴지통 전체 비우기:
{
"all": true
}응답에는 deletedCount과 해당하는 경우 cascadedModels 및 survivingDeployments가 보고됩니다.
영구 삭제는 취소할 수 없습니다. 리소스와 연결된 모든 데이터가 제거됩니다.
업로드 API#
서명된 URL을 사용하여 파일을 클라우드 스토리지에 직접 업로드합니다. 모델 업로드를 완료하면 가중치가 연결됩니다. 데이터셋 아카이브 업로드를 완료하면 아카이브가 검증되며, 이후 해당 단계를 건너뛴 경우 업로드 자체도 완료하는 데이터셋 수집에 세션을 전달합니다. 데이터 문서를 참조하세요.
서명된 업로드 URL 가져오기#
POST /api/upload/signed-urlPython SDK: client.upload.signed_url(body=...)
본문:
{
"assetType": "datasets",
"assetId": "65f1c0a2b3d4e5f601234567",
"filename": "warehouse.zip",
"contentType": "application/zip",
"totalBytes": 52428800
}| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
assetType | 문자열 | 예 | datasets 또는 models |
assetId | 문자열 | 예 | 대상 데이터셋 또는 모델의 ID |
filename | 문자열 | 예 | 원본 파일 이름(최대 256자) |
contentType | 문자열 | 예 | MIME 유형 |
totalBytes | 숫자 | 예 | 파일 크기(바이트) |
assetType이 datasets인 경우 filename는 .zip, .tar, .tar.gz, .tgz 또는 .ndjson로 끝나야 합니다. 개별 이미지는 업로드하기 전에 아카이브로 묶으세요.
응답:
{
"sessionId": "session_abc123",
"uploadUrl": "https://storage.googleapis.com/...&signature=...",
"expiresAt": "2026-02-22T12:00:00Z",
"headers": { "x-goog-if-generation-match": "0" }
}PUT 요청을 uploadUrl로 보내 파일을 업로드합니다. 선언한 것과 동일한 Content-Type를 사용하고 headers에 반환된 모든 헤더를 포함해야 합니다. 데이터셋 업로드 URL은 12시간 동안 유효하며 생성 전용입니다. 동일 URL에 대한 두 번째 PUT는 412를 반환하고, 반환된 헤더 없이 보낸 PUT은 400을 반환합니다.
업로드 완료#
POST /api/upload/completePython SDK: client.upload.complete(session_id=...)
{
"sessionId": "session_abc123",
"md5": "<optional md5 hex>"
}응답: success과 size 및 contentType이 포함된 file 객체입니다. 모델의 경우 가중치가 연결되며, 데이터셋 아카이브의 경우 처리를 시작하려면 다음 단계로 수집을 호출하세요.
md5을 지정하면 저장된 객체와 대조해 확인합니다. 일치하지 않으면 400을 반환합니다. 아직 완료되지 않은 세션에서는 업로드된 파일도 삭제하고 세션은 미완료 상태로 유지되므로, 새 서명 URL을 요청한 후 다시 업로드하세요. 아카이브가 존재하는 동안에는 완료된 데이터셋 세션을 다시 완료할 수 있지만, 서로 다른 다이제스트로 동시에 완료를 시도하면 409를 반환합니다. 모델 세션은 완료 시 제거됩니다. checksum은 모델 파일 메타데이터로 저장되며 검증되지 않습니다.
스토리지 통합 API#
읽기 전용 Google Cloud Storage, Amazon S3 또는 Azure Blob Storage 계정을 연결하고 데이터셋 소스로 탐색합니다. 통합 문서를 참조하세요.
스토리지를 검색하고 연결하려면 워크스페이스 관리자 액세스 권한과 Pro 또는 Enterprise 플랜이 필요합니다(그렇지 않으면 403). 통합 목록 조회와 객체 탐색에는 편집자 액세스 권한이 필요합니다.
통합 목록 조회#
GET /api/integrations/bucketsPython SDK: client.storage_integrations.list()
integrations을 반환하며, 각 항목에는 id, provider, credentialIdentity, targets, createdAt가 포함됩니다. 자격 증명은 반환되지 않습니다.
위치 검색#
POST /api/integrations/buckets/discoverPython SDK: client.storage_integrations.discover(body=...)
저장하지 않고 제공된 자격 증명으로 읽을 수 있는 버킷 또는 컨테이너를 나열합니다.
{
"provider": "gcs",
"credentials": {
"client_email": "svc@project.iam.gserviceaccount.com",
"private_key": "-----BEGIN PRIVATE KEY-----\n...",
"project_id": "my-project"
}
}응답: {"targets": ["my-bucket", "another-bucket"]}
스토리지 연결#
POST /api/integrations/bucketsPython SDK: client.storage_integrations.create(body=...)
검색과 동일한 자격 증명 형식을 사용하며, 필수 targets 배열에는 버킷 또는 컨테이너 이름을 1~50개 지정합니다. 저장된 통합을 포함하는 201을 반환합니다. 임시 S3 자격 증명(ASIA 액세스 키)은 거부됩니다.
객체 탐색#
GET /api/integrations/buckets/{id}/objectsPython SDK: client.storage_integrations.objects(id, target=...)
쿼리 매개변수:
| 매개변수 | 유형 | 필수 | 설명 |
|---|---|---|---|
target | 문자열 | 예 | 버킷 또는 컨테이너 이름 |
prefix | 문자열 | 아니요 | 폴더 접두사(최대 1024자) |
cursor | 문자열 | 아니요 | 이전 페이지의 공급자 페이지네이션 커서 |
entries을 반환합니다(각 kind은 folder 또는 file임). 다음 페이지가 있으면 cursor도 반환합니다.
스토리지 연결 해제#
DELETE /api/integrations/buckets/{id}Python SDK: client.storage_integrations.delete(id)
공급자 데이터를 삭제하지 않고 저장된 자격 증명을 제거합니다. 연결된 데이터셋은 계속 표시되지만, 동일한 스토리지 계정을 다시 연결할 때까지 해당 파일에 액세스할 수 없습니다. 워크스페이스 관리자 액세스 권한이 필요합니다.
데이터셋 가져오기 API#
타사 서비스에서 데이터셋을 가져옵니다. Roboflow 통합을 참조하세요.
Roboflow 가져오기 미리보기#
POST /api/integrations/roboflow/previewPython SDK: client.datasets.preview_roboflow(api_key=...)
Roboflow API 키를 가져오기 계획으로 확인합니다. 계획에는 워크스페이스 세부 정보, 가져올 newDatasets, 이미 가져온 항목(skippedCount), 버전이 없는 프로젝트, 지원되지 않는 프로젝트와 확인되지 않은 프로젝트의 수, bytesTotal, 사용 가능한 storage 용량이 포함됩니다. Roboflow API 키는 본문에서 읽으며 저장하지 않습니다.
{
"apiKey": "ROBOFLOW_API_KEY"
}Roboflow에서 가져오기#
POST /api/integrations/roboflow/importPython SDK: client.datasets.import_roboflow(api_key=..., items=...)
미리보기에서 반환된 항목을 사용하여 선택한 Roboflow 프로젝트 버전을 최대 500개까지 수집 작업 대기열에 추가합니다.
{
"apiKey": "ROBOFLOW_API_KEY",
"items": [
{
"workspace": "my-workspace",
"projectId": "warehouse-safety",
"projectName": "Warehouse Safety",
"projectType": "object-detection",
"latestVersion": 4
}
]
}응답(201): imported, failed, skipped 배열입니다. 가져오려면 스토리지 용량이 충분해야 하며 각 데이터셋은 플랜의 가져오기별 크기 제한을 충족해야 합니다.
계정 API#
Platform 계정, 키, 스토리지, 공개 프로필을 확인합니다. 설정 문서를 참조하세요.
계정 요약#
GET /api/account/summaryPython SDK: client.account.summary()
키를 발급한 워크스페이스의 플랜, 크레딧 잔액, 리소스 수를 반환합니다.
{
"username": "acme-vision",
"name": "Acme Vision",
"accountType": "team",
"plan": "pro",
"creditsCents": 2500,
"counts": { "projects": 4, "datasets": 7, "models": 21 },
"teams": []
}개인 계정의 경우 teams에는 소속된 팀 워크스페이스가 나열되며, 각 항목에는 사용자의 role과 현재 액세스할 수 없는 경우의 deniedReason가 포함됩니다. 플랜 만료가 액세스할 수 없는 사유일 수 있습니다. 팀 워크스페이스는 빈 목록을 반환합니다.
API 키 목록 조회#
GET /api/api-keysPython SDK: client.account.api_keys()
키의 워크스페이스에 대한 keyId, name, keyPrefix, createdAt가 포함된 keys을 반환합니다. API 키로 인증된 요청에는 메타데이터만 제공됩니다. 전체 키 값은 워크스페이스 소유자가 Platform UI의 설정 > API 키에서 확인할 수 있으며, 이곳에서 키를 생성하고 폐기할 수도 있습니다.
스토리지 사용량 확인#
GET /api/storagePython SDK: client.account.storage()
쿼리 매개변수:
| 매개변수 | 유형 | 설명 |
|---|---|---|
details | 불리언 | 스토리지 사용량이 가장 많은 항목 10개를 포함합니다(기본값: false). |
응답:
{
"tier": "pro",
"usage": {
"storage": { "current": 1073741824, "limit": 536870912000, "percent": 0 },
"datasets": { "current": 2, "limit": -1, "percent": 0 },
"models": { "current": 4, "limit": 500, "percent": 1 }
},
"breakdown": {
"byCategory": {
"datasets": { "bytes": 536870912, "count": 2 },
"models": { "bytes": 268435456, "count": 4 },
"exports": { "bytes": 268435456, "count": 3 }
},
"topItems": [
{
"_id": "65f1c0a2b3d4e5f601234567",
"name": "Warehouse",
"slug": "warehouse",
"sizeBytes": 536870912,
"type": "dataset"
}
]
},
"region": "us",
"username": "acme-vision",
"updatedAt": "2026-01-15T10:00:00Z"
}usage은 projects, datasets, models, images, annotations, deployments의 개수와 storage의 바이트 수를 보고합니다. limit이 -1이면 제한이 없음을 의미하며, percent은 제한 대비 정수 백분율입니다.
공개 사용자 프로필 가져오기#
GET /api/usersPython SDK: client.account.profile(username=...)
쿼리 매개변수:
| 매개변수 | 유형 | 필수 | 설명 |
|---|---|---|---|
username | 문자열 | 예 | 조회할 사용자 이름 |
followerCount을 포함한 공개 user 프로필을 반환하며, 인증된 호출자에게는 isFollowed도 반환합니다.
사용자 팔로우 또는 언팔로우#
PATCH /api/usersPython SDK: client.account.follow(username=..., followed=...)
{
"username": "target-user",
"followed": true
}응답: followed과 업데이트된 followerCount입니다.
결제 API#
요금제 사용량과 크레딧 원장을 확인합니다. 결제 문서를 참조하세요.
결제 금액은 미국 센트 단위의 정수이며, 100 = $1.00.
요금제 및 사용량 보기#
GET /api/billing/usage-summaryPython SDK: client.billing.usage_summary()
plan(ID, 상태, 결제 주기, 기간 종료일), metrics(저장 공간 한도 및 사용량), trainingCredit, features, creditsCents 및 좌석 수를 반환합니다.
거래 내역 보기#
GET /api/billing/transactionsPython SDK: client.billing.transactions()
쿼리 매개변수:
| 매개변수 | 유형 | 설명 |
|---|---|---|
from | 문자열 | 가장 이른 거래 타임스탬프(ISO 8601) |
to | 문자열 | 가장 최근 거래 타임스탬프(ISO 8601) |
각 거래에는 id, type(예: purchase, training, monthly_grant 또는 refund), amountCents, balanceAfter, createdAt, 선택 항목인 receiptUrl 및 학습 요금에 대한 모델 컨텍스트가 포함됩니다. 내부 결제 세부 정보는 반환되지 않습니다.
Explore API#
커뮤니티가 공유한 공개 프로젝트와 데이터셋을 검색하거나 이미지에 표시된 내용을 기준으로 이미지를 검색하세요. Explore 문서를 참조하세요.
공개 콘텐츠 검색#
GET /api/explore/searchPython SDK: client.explore.search()
쿼리 매개변수:
| 매개변수 | 유형 | 설명 |
|---|---|---|
q | 문자열 | 검색어(최대 200자); 데이터셋의 경우 텍스트가 일치하는 항목이 먼저 표시되고, 그다음 이미지가 일치하는 데이터셋이 표시됩니다. |
type | 문자열 | all(기본값), projects, datasets 또는 images(sort 무시) |
sort | 문자열 | newest(기본값), oldest, stars, name-asc, name-desc, count-desc, count-asc |
offset | int | 건너뛸 결과 수(기본값: 0) |
limit | int | 리소스 유형별 최대 결과 수(기본값: 20, 최대: 100) |
task | 문자열 | 쉼표로 구분된 작업 필터: detect, segment, semantic, depth, classify, pose, obb |
author | 문자열 | 소유자 사용자 이름 필터 |
starred | 불리언 | 인증된 호출자가 별표 표시한 콘텐츠만 반환합니다. API 키가 필요합니다. |
응답: projects, datasets, hasMore. type=images은 일치 항목을 images에 대신 반환하며, 가장 일치하는 항목부터 정렬됩니다. 각 항목에는 소스 dataset와 0~1 범위의 유사도 score이 포함됩니다. 이 기능에는 q이 필요하며, 공개 데이터셋을 검색합니다. API 키를 보내면 본인 및 팀의 데이터셋도 검색합니다.
curl "https://platform.ultralytics.com/api/explore/search?type=datasets&task=detect&sort=stars&limit=20"Python SDK#
ultralytics-platform은 OpenAPI 계약에서 생성된 타입 지정 Python 클라이언트이며, 각 엔드포인트별 메서드(client.datasets.list, client.models.predict, client.exports.create 등)를 제공합니다. 모든 메서드는 경로 매개변수를 위치 인수로 받고, 다른 입력은 키워드 인수로 받으며, 요청별 선택 항목인 timeout 및 extra_headers도 지원합니다.
pip install "ultralytics-platform>=0.1.45" # Python 3.11+from ultralytics_platform import Platform
with Platform() as client: # ULTRALYTICS_API_KEY 또는 yolo login으로 저장한 키를 읽습니다.
dataset = client.datasets.retrieve("acme-vision", "warehouse")
images = client.datasets.images("acme-vision", "warehouse", limit=10)
export = client.exports.create("acme-vision", "inspection", "v3", format="onnx")AsyncPlatform은 async/await 코드에 동일한 리소스 트리를 제공하며, 응답이 성공하지 않으면 APIError과 함께 status_code, body 및 파싱된 json을 발생시키고, 연결 실패 시 APIConnectionError을 발생시킵니다. 전체 README는 SDK 저장소를 참조하세요.
Python 통합#
학습 및 추론 워크플로에는 인증, 업로드 및 실시간 메트릭 스트리밍을 자동으로 처리하는 Ultralytics Python 패키지를 사용하세요. Python 3.11 이상에서는 pip install ultralytics도 ultralytics-platform SDK를 설치합니다. model.train(project=...)가 Platform을 대상으로 하면 학습 콜백이 SDK의 client.training.metrics()을 통해 이벤트를 스트리밍하고, OpenAPI 문서의 POST /api/webhooks/training/metrics 및 POST /api/webhooks/models/upload 작업인 client.models.upload_checkpoint()를 통해 체크포인트 업로드 URL을 요청하므로 직접 호출할 필요가 없습니다.
설치 및 설정#
Platform 통합에는 Python>=3.11 및 ultralytics>=8.4.120이 필요합니다.
pip install "ultralytics>=8.4.120"설치를 확인합니다.
yolo check인증#
yolo login YOUR_API_KEYPlatform 데이터셋 사용#
ul:// URI를 사용하여 데이터셋을 지정합니다.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# Platform 데이터셋으로 학습
model.train(
data="ul://your-username/datasets/your-dataset",
epochs=100,
imgsz=640,
)URI 형식:
| 패턴 | 설명 |
|---|---|
ul://username/datasets/slug | 데이터셋 |
ul://username/project/model-name | 특정 모델 |
ul://ultralytics/yolo26/yolo26n | 공식 모델 |
Platform에 푸시#
결과를 Platform 프로젝트로 전송합니다.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# 결과가 Platform에 자동으로 동기화됩니다.
model.train(
data="coco8.yaml",
epochs=100,
project="your-username/my-project",
name="experiment-1",
)동기화 항목:
- 학습 메트릭(실시간)
- 최종 모델 가중치
- 검증 플롯
- 콘솔 출력
- 시스템 메트릭
- 학습 인수 및 호스트 환경(호스트 이름, OS, Python, 하드웨어, git 커밋, 명령줄)
API 예제#
Platform에서 모델 로드:
# 사용자 모델
model = YOLO("ul://username/project/model-name")
# 공식 모델
model = YOLO("ul://ultralytics/yolo26/yolo26n")추론 실행:
results = model("image.jpg")
# 결과에 접근
for r in results:
boxes = r.boxes # 검출 박스
masks = r.masks # 세그멘테이션 마스크
keypoints = r.keypoints # 포즈 키포인트
probs = r.probs # 분류 확률모델 내보내기:
# ONNX로 내보내기
model.export(format="onnx", imgsz=640, quantize=16)
# TensorRT로 내보내기
model.export(format="engine", imgsz=640, quantize=16)
# CoreML로 내보내기
model.export(format="coreml", imgsz=640) # 분류에는 imgsz=224 사용검증:
metrics = model.val(data="ul://username/datasets/my-dataset")
print(f"mAP50: {metrics.box.map50}")
print(f"mAP50-95: {metrics.box.map}")자주 묻는 질문#
Platform URL에 표시되는 소유자 및 이름 세그먼트를 동일하게 사용합니다.
https://platform.ultralytics.com/acme-vision/inspection/v3에 있는 모델은GET /api/models/acme-vision/inspection/v3입니다. 데이터베이스 ID도 응답에 반환되며(id로), 일부 경로에서는 ID를 직접 사용합니다. 이미지 경로에는imageId이 필요하고, 업로드에는assetId가 필요하며,POST /api/training/start에는modelId이 필요합니다.컬렉션에 따라 다릅니다. 대부분의 목록 엔드포인트는
limit을 지원합니다.curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://platform.ultralytics.com/api/datasets/acme-vision?limit=50"데이터셋 이미지, 클러스터링 및 Explore 검색은
limit과 함께offset을 사용하고hasMore를 보고합니다.curl "https://platform.ultralytics.com/api/explore/search?type=datasets&offset=20&limit=20&sort=stars"매우 큰 이미지 세트는
nextCursor으로 반환되는 커서를 사용해 순회하는 것이 가장 좋습니다.curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://platform.ultralytics.com/api/datasets/acme-vision/warehouse/images?limit=1000&includeTotal=false&cursor=LAST_IMAGE_ID"휴지통은
page을 사용하며, 배포 로그는nextPageToken로 반환되는 불투명한pageToken을 사용합니다.예. 이 페이지의 모든 작업은 일반 HTTPS 요청이며, 전체 계약은 platform.ultralytics.com/openapi.json에 OpenAPI 3.2로 공개되어 있습니다. 이 계약을 모든 언어의 클라이언트 생성기에 입력할 수 있습니다.
ultralytics-platform패키지는 계약에서 생성된 타입 지정 클라이언트이며,ultralytics패키지는 학습 및 추론에 실시간 메트릭 스트리밍과 자동 모델 업로드 기능을 추가합니다. 결제 체크아웃 및 팀 관리와 같은 브라우저 세션 전용 계정 흐름은 Platform UI에서 계속 처리됩니다.적절한 시간 동안 대기하려면
429응답의Retry-After헤더를 사용하세요.import time import requests def api_request_with_retry(url, headers, max_retries=3): for attempt in range(max_retries): response = requests.get(url, headers=headers) if response.status_code != 429: return response wait = int(response.headers.get("Retry-After", 2**attempt)) time.sleep(wait) raise RuntimeError("Rate limit exceeded")404은 리소스가 없거나 키에서 전혀 보이지 않는다는 의미입니다.403은 리소스를 찾았지만 작업에 키가 가진 것보다 높은 접근 권한이 필요하다는 의미입니다. 예를 들어 데이터셋을 수정하려면 편집자 권한이, 배포를 삭제하려면 소유자 권한이, 스토리지를 연결 해제하려면 관리자 권한이 필요하며, 내보내기 및 배포에는 더 높은 요금제 또는 할당량이 필요할 수 있습니다.공개 데이터셋, 프로젝트 및 모델과 해당 이미지, 서명된 이미지 URL, 클래스 통계, 임베딩 상태, 클러스터링 레이아웃, 데이터셋으로 학습된 모델 및 내보내기 목록 읽기, 공개 모델의 학습 진행률 확인, 공개 모델 파일 다운로드, 공개 모델 추론 실행, 공개 사용자 프로필 조회, 공개 모델 하나로 필터링한 배포 목록 조회, Explore 검색이 가능합니다.
GET /api/training/gpu-availability은 관리형 용량을 요청하지 않는 한 완전히 공개됩니다. 그 밖의 모든 작업에는 키가 필요하며, 공개 엔드포인트에 키를 제공하면 비공개 리소스도 표시됩니다.