추론#
Ultralytics Platform은(는) 학습된 모델 테스트를 위한 브라우저 기반 추론 기능과 프로그래밍 방식 액세스를 위한 전용 엔드포인트를 제공합니다.

예측 탭#
가중치가 있는 모든 모델에는 브라우저 기반 추론을 위한 Predict 탭이 포함되어 있습니다:
- 모델로 이동합니다
- Predict 탭을 클릭합니다
- 이미지를 업로드하거나, 예제를 사용하거나, 웹캠을 엽니다
- 작업별 오버레이, 예측 요약, 타이밍 및 원시 응답을 검토합니다.
가중치가 없는 모델은 대신 빈 상태를 표시합니다. 모델을 학습시키거나 가중치를 먼저 업로드하세요.

입력 방식#
Predict 패널은 여러 입력 방식을 지원합니다:
| 메서드 | 설명 |
|---|---|
| 이미지 업로드 | 이미지를 드래그 앤 드롭하거나 클릭하여 업로드합니다 |
| 예제 이미지 | 내장된 예제(데이터셋 이미지 또는 기본값)를 클릭합니다 |
| 웹캠 캡처 | 단일 프레임 캡처 기능이 있는 실시간 카메라 피드입니다 |
graph LR
A[Upload Image]:::start --> D[Auto-Inference]:::proc
B[Example Image]:::start --> D
C[Webcam Capture]:::start --> D
D --> E[Results + Overlays]:::out
classDef start fill:#4CAF50,color:#fff
classDef proc fill:#2196F3,color:#fff
classDef out fill:#9C27B0,color:#fff이미지 업로드#
드래그 앤 드롭하거나 클릭하여 업로드하세요:
- 지원되는 포맷: JPEG, PNG, WebP, AVIF, HEIC, JP2, TIFF, BMP
- 최대 크기: 10 MB
- 자동 추론: 업로드 후 결과가 자동으로 표시됩니다
Predict 패널은 이미지 업로드, 예제 선택 또는 웹캠 프레임 캡처 시 자동으로 추론을 실행합니다. 별도의 버튼 클릭은 필요하지 않습니다.
업로드하기 전에 패널은 이미지의 가장 긴 변이 선택된 Image Size와 일치하도록 크기를 조절하고 정규화된 좌표를 요청합니다. 이를 통해 브라우저 테스트가 빠르게 유지되며, 사용자가 직접 전송한 요청은 크기가 조절되지 않습니다.
예제 이미지#
예측 패널은 모델의 연결된 데이터셋에서 최대 두 장의 예시 이미지를 표시하며, val 분할, 그다음 test, 마지막으로 train 순으로 우선 적용합니다. 연결된 데이터셋이 없으면 기본 예시가 사용됩니다:
| 이미지 | 콘텐츠 |
|---|---|
bus.jpg | 차량이 있는 거리 풍경 |
zidane.jpg | 사람들이 있는 스포츠 경기 장면 |
OBB 모델의 경우, 보트와 공항의 항공 사진이 대신 표시됩니다.
페이지 로드 시 예제 이미지가 사전 로드되므로, 예제를 클릭하면 다운로드 대기 시간 없이 거의 즉시 추론이 시작됩니다.
웹캠#
웹캠 카드를 클릭하여 실시간 카메라 피드를 시작합니다:
- 메시지가 표시되면 카메라 권한을 허용합니다
- 비디오 미리보기를 클릭하여 프레임을 캡처합니다
- 캡처된 프레임에서 자동으로 추론이 실행됩니다
- 다시 클릭하면 웹캠이 재시작됩니다
결과 확인#
추론 결과에는 모델 작업에 적절한 출력(박스, 마스크, 키포인트, 회전된 박스, 분류 점수, 시맨틱 커버리지 또는 깊이 맵)이 표시됩니다. 객체 결과는 가능한 경우 데이터셋 클래스 색상을 사용합니다. 또한 패널에는 전처리, 추론, 후처리 및 네트워크 타이밍이 표시됩니다.
결과 패널에 표시되는 항목:
| 필드 | 설명 |
|---|---|
| 결과 요약 | 탐지별 목록, 또는 분류 및 세그멘테이션 모델의 상위 5개 클래스 |
| 속도 통계 | 전처리, 추론, 후처리 및 네트워크 (ms) |
| 버전 | Ultralytics 및 PyTorch 버전, 그리고 해당하는 경우 깊이 범위 또는 마스크 크기 |
| JSON 응답 | 베이스64 맵 데이터가 생략된 코드 블록 내의 원시 API 응답 |
결과가 나오면 미리보기 위에 두 개의 컨트롤이 표시됩니다. 이미지를 클릭하여 오버레이를 유지한 채 확대할 수 있으며, 다운로드 버튼을 사용하여 현재 결과의 주석이 달린 JPEG를 저장할 수 있습니다.
추론 파라미터#
이미지 아래의 세 가지 슬라이더로 추론 동작을 조정합니다:

| 파라미터 | 범위 | 기본값 | 설명 |
|---|---|---|---|
| 신뢰도(Confidence) | 0.01 – 1.0, 0.01 단위 | 0.25 | 최소 신뢰도 임계값 |
| IoU | 0.0 – 0.95, 0.01 단위 | 0.7 | NMS IoU 임계값 |
| 이미지 크기(Image Size) | 32 – 1280, 32 단위 | 640 | 입력 크기 조정 차원 |
파라미터를 변경하면 500ms 디바운싱(debounce) 후 현재 이미지에 대해 추론이 자동으로 재실행됩니다. 다시 업로드할 필요가 없습니다.
신뢰도 임계값#
신뢰도별로 예측 필터링:
- 높음 (0.5+): 더 적지만 확실한 예측
- 낮음 (0.1-0.25): 더 많은 예측, 일부 노이즈 포함
- 기본값 (0.25): 대부분의 사용 사례에 최적화된 균형
IoU 임계값#
NMS(비최대 억제) 제어:
- 높음 (0.7+): 겹치는 박스 허용
- 하한 (0.3-0.5): 겹치는 탐지를 더 적극적으로 억제합니다.
- 기본값 (0.7): 대부분의 사용 사례에 최적화된 균형 잡힌 NMS 동작
배포 모델 예측#
실행 중인 각 전용 엔드포인트에는 배포 카드에 직접 Predict 탭이 포함되어 있습니다. 이 탭은 공유 예측 서비스 대신 배포 자체의 추론 서비스를 사용하므로 브라우저에서 배포된 엔드포인트를 테스트할 수 있습니다.
전용 엔드포인트 API#
모델 Predict 탭의 API Docs 카드에는 현재 슬라이더에 설정된 confidence, IoU, 이미지 크기로 미리 채워진 Python, JavaScript 및 cURL 요청 예시가 포함되어 있습니다. URL과 키는 모델을 배포할 때까지 자리표시자 상태로 유지됩니다. 코드 탭 옆의 Deploy 버튼을 누르면 모델의 Deploy 탭으로 이동합니다. 배포 후, 배포 카드의 Code 탭에는 해당 엔드포인트의 URL과(워크스페이스 소유자의 경우) 바인딩된 API 키가 채워져 복사하여 실행할 준비가 됩니다.
인증#
요청에 API 키를 포함하세요:
Authorization: Bearer YOUR_API_KEY자신의 스크립트, 노트북 또는 앱에서 추론을 실행하려면 API 키를 포함하세요. Settings > API Keys에서 키를 생성할 수 있습니다. 전용 엔드포인트는 생성 시 사용된 단일 키만 허용하며, 공유 모델 API는 워크스페이스 내의 모든 활성 키를 허용하고 공개 모델은 익명 요청도 허용합니다.
엔드포인트#
전용 엔드포인트는 자체 URL에서 요청을 받습니다:
POST https://YOUR_DEPLOYMENT_URL.run.app/predict공유 추론은 모델의 전체 경로가 포함된 Platform API를 사용합니다:
POST https://platform.ultralytics.com/api/models/{owner}/{project}/{model}/predict둘 다 동일한 multipart/form-data 본문을 허용하며 동일한 응답 형태를 반환합니다. Python SDK를 사용하여 공유 추론에는 client.models.predict(owner, project, model, body=...)를 사용하고 전용 배포에는 client.deployments.predict(owner, deployment, body=...)을 사용하십시오.
from ultralytics_platform import Platform
client = Platform() # reads ULTRALYTICS_API_KEY
with open("image.jpg", "rb") as f:
results = client.models.predict("acme-vision", "inspection", "v3", body={"file": f, "conf": 0.25})요청#
import requests
url = "https://YOUR_DEPLOYMENT_URL.run.app/predict"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
data = {"conf": 0.25, "iou": 0.7, "imgsz": 640}
with open("image.jpg", "rb") as image_file:
response = requests.post(url, headers=headers, files={"file": image_file}, data=data)
print(response.json())
요청 파라미터#
| 파라미터 | 유형 | 기본값 | 범위 | 설명 |
|---|---|---|---|---|
file | 파일 | - | - | 이미지 또는 비디오 파일 (source이(가) 설정된 경우 제외 필수) |
conf | 부동 소수점(float) | 0.25 | 0.01 – 1.0 | 최소 신뢰도 임계값 |
iou | 부동 소수점(float) | 0.7 | 0.0 – 0.95 | NMS IoU 임계값 |
imgsz | 정수(int) | 640 | 32 – 1280 | 입력 이미지 크기 (픽셀 단위) |
normalize | bool | false | - | 바운딩 박스 좌표를 0 – 1 범위로 반환 |
decimals | 정수(int) | 5 | 0 – 10 | 좌표 값에 대한 소수점 정밀도 |
bits | 정수(int) | 8 | 8, 12, 16 | 깊이 맵 양자화, 깊이 모델 전용 |
source | 문자열(string) | - | - | 이미지 URL 또는 base64 문자열 (file의 대안) |
응답#
{
"images": [
{
"shape": [1080, 1920],
"results": [
{
"class": 0,
"name": "person",
"confidence": 0.92,
"box": { "x1": 100, "y1": 50, "x2": 300, "y2": 400 }
},
{
"class": 2,
"name": "car",
"confidence": 0.87,
"box": { "x1": 400, "y1": 200, "x2": 600, "y2": 350 }
}
],
"speed": {
"preprocess": 1.2,
"inference": 12.5,
"postprocess": 2.3
}
}
],
"metadata": {
"imageCount": 1,
"functionTimeAlive": 1284.51,
"functionTimeCall": 0.018,
"task": "detect",
"version": {
"ultralytics": "8.x.x",
"torch": "2.6.0",
"torchvision": "0.21.0",
"python": "3.13.0"
}
}
}
응답 필드#
| 필드 | 유형 | 설명 |
|---|---|---|
images | array | 처리된 이미지 목록, 비디오의 경우 비디오 프레임당 하나의 항목 |
images[].shape | array | 이미지 크기 [높이, 너비] |
images[].results | array | 탐지 목록 |
images[].results[].class | 정수(int) | 클래스 인덱스 (정수 ID) |
images[].results[].name | 문자열(string) | 클래스 이름 |
images[].results[].confidence | 부동 소수점(float) | 탐지 신뢰도 (0-1) |
images[].results[].box | 객체 | 바운딩 박스 좌표 |
images[].semantic_mask | 객체 | 픽셀별 클래스 맵(세그멘테이션 모델 전용) |
images[].depth | 객체 | 픽셀별 깊이 맵(깊이 모델 전용) |
images[].speed | 객체 | 밀리초 단위 처리 시간 |
metadata | 객체 | 이미지 수, 서비스 타이밍, 태스크, 그리고 Ultralytics/PyTorch 버전 |
작업별 응답#
응답 형식은 작업에 따라 다릅니다:
{
"class": 0,
"name": "person",
"confidence": 0.92,
"box": {"x1": 100, "y1": 50, "x2": 300, "y2": 400}
}속도 제한(Rate Limits)#
공유 모델 API는 각 API 키, 로그인한 호출자 또는 익명 IP당 분당 20회 요청으로 제한됩니다. 제한에 도달하면 API는 Retry-After 헤더와 함께 429을 반환합니다. 모든 엔드포인트 범주에 대해서는 전체 rate-limit reference를 참조하세요.
전용 엔드포인트로 직접 전송된 요청은 Platform API 속도 제한기를 거치지 않습니다. 엔드포인트는 일시적으로 용량이 초과될 때 429 및 Retry-After 헤더와 함께 부하를 분산합니다. 대용량 로컬 추론에 대해서는 Predict 모드 가이드를 참조하세요.
오류 처리#
일반적인 오류 응답:
| 코드 | 메시지 | 해결 방법 |
|---|---|---|
| 400 | 잘못된 이미지 | 파일 형식 또는 모델에 학습된 가중치가 있는지 확인하세요. |
| 401 | 인증되지 않음 | API 키 확인 |
| 404 | 모델을 찾을 수 없음 | 소유자, 프로젝트 및 모델 이름을 확인하세요. |
| 413 | 입력이 너무 큽니다. | 파일 크기를 엔드포인트 제한 미만으로 줄이세요. |
| 429 | 속도 제한 초과 | 기다렸다가 다시 시도하거나 전용 엔드포인트로 요청을 직접 전송하세요. |
| 500 | 서버 오류 | 요청 재시도 |
| 503 | 서비스를 사용할 수 없음 | Predict 서비스가 시작 중이거나 도달할 수 없습니다. 잠시 기다린 후 다시 시도하십시오 |
FAQ#
두 가지 추론 방법 모두 비디오 파일을 허용합니다:
- 전용 엔드포인트는 비디오 파일을 직접 허용합니다. 지원되는 형식 (최대 100 MB): ASF, AVI, GIF, M4V, MKV, MOV, MP4, MPEG, MPG, TS, WEBM, WMV. 각 프레임은 개별적으로 처리되며 결과는 프레임별로 반환됩니다. 자세한 내용은 전용 엔드포인트를 참조하세요.
- 공유 추론(
POST /api/models/{owner}/{project}/{model}/predict)은 동일한 predict 서비스를 사용하며 동일한 비디오 형식을 허용합니다. 브라우저 Predict 탭은 이미지만 선택하므로 비디오의 경우 API 또는 전용 엔드포인트를 사용하세요.
Predict 탭에서 미리보기 위의 다운로드 버튼은 현재 결과를 주석이 달린 JPEG로 저장합니다. API 자체는 JSON 예측을 반환합니다. 이를 시각화하려면:
- 예측을 사용하여 로컬에서 박스 그리기
- Ultralytics
plot()메서드를 사용하세요:
from ultralytics import YOLO model = YOLO("yolo26n.pt") results = model("image.jpg") results[0].save("annotated.jpg")전체 결과 API 및 시각화 옵션에 대해서는 Predict 모드 문서를 참조하세요.
- Predict 탭 제한: 10 MB
- API 제한: 공유 추론 및 전용 엔드포인트 모두 100 MB
- Predict 탭의 자동 크기 조절: 업로드하기 전에 이미지가 선택한
Image Size크기로 조절됩니다.
대형 이미지는 종횡비를 유지한 채 브라우저에서 자동으로 크기가 조절됩니다. 사용자가 직접 전송한 요청은 크기가 조절되지 않으므로, 제한을 초과하는 이미지는
413과 함께 거부됩니다.현재 API는 요청당 하나의 이미지를 처리합니다. 배치를 수행하려면:
- 각 이미지마다 별도의 요청 전송
- 적절한 경우 전용 엔드포인트 간에 요청 분산
- 대규모 배치에는 로컬 추론 사용
Python을 사용한 배치 추론import concurrent.futures import requests url = "https://YOUR_DEPLOYMENT_URL.run.app/predict" headers = {"Authorization": "Bearer YOUR_API_KEY"} images = ["img1.jpg", "img2.jpg", "img3.jpg"] def predict(image_path): with open(image_path, "rb") as f: return requests.post(url, headers=headers, files={"file": f}).json() with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor: results = list(executor.map(predict, images))