이미지 예측
Python에서 사전 학습된 YOLO26 모델을 실행하고, 결과에서 클래스, 신뢰도, 픽셀 좌표 상자를 확인한 다음 누락 대부분을 해결하는 인수를 조정합니다.
선반의 재고 수량 계산, 블러 처리를 위한 얼굴 자르기, JSON API로 상자 전송 등 디텍터를 실제로 사용하는 모든 작업은 결과 객체를 올바르게 읽는 것에서 시작합니다. 텐서로 클래스 이름을 인덱싱하는 것처럼 세부 사항 하나를 잘못 처리하면 첫 이미지에서 앱이 충돌합니다.
사전 학습된 YOLO26 detect 모델은 이미 80개의 COCO 클래스를 알고 있습니다. 이 강의에서는 Python에서 Predict 모드를 실행하고, 결과에서 유용한 모든 필드를 가져오며, 누락·중복·작은 객체에 대응하려면 어떤 인수를 변경해야 하는지 알아봅니다. 나중에 직접 학습한 모델에서도 동일한 결과 객체가 반환됩니다.
실습형
모든 검출을 예측하고 출력하기#

소스에 대해 모델을 호출하면 Predict 모드가 실행되고 이미지마다 Results 객체 하나가 담긴 목록이 반환됩니다. 이미지가 한 장이면 results[0]을 읽습니다.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
for box in result.boxes:
name = result.names[int(box.cls)]
conf = float(box.conf)
x1, y1, x2, y2 = box.xyxy[0].tolist()
print(f"{name:>8} {conf:.2f} ({x1:.0f}, {y1:.0f}) -> ({x2:.0f}, {y2:.0f})")
result.save("bus_annotated.jpg")일반적인 로그 줄 뒤에 출력되는 predict.py의 실제 결과:
bus 0.88 (0, 230) -> (803, 751)
person 0.87 (49, 398) -> (240, 902)
person 0.86 (223, 405) -> (345, 861)
person 0.85 (670, 395) -> (810, 880)
person 0.65 (0, 553) -> (60, 871)결과 읽기:
bus 0.88: 클래스 이름과 신뢰도입니다. 상자는 신뢰도가 높은 순서대로 정렬됩니다.(0, 230) -> (803, 751): 원본 810×1080 이미지에서 픽셀 단위로 표시한 왼쪽 위와 오른쪽 아래 모서리이며, 원점은 왼쪽 위입니다. 이 좌표를 그대로 사용해 자르거나 그릴 수 있습니다.person 0.65의(0, 553): 왼쪽 가장자리에 잘려 있는 다섯 번째 사람은 점수가 낮습니다. 일부만 보이는 객체는 대개 점수가 낮습니다.
result.save()은 주석이 표시된 이미지를 저장하고, result.show()은 해당 이미지를 창에서 엽니다.
결과 객체의 내용 파악하기#
모든 작업은 동일한 Results 유형을 반환하며, 채워지는 필드만 다릅니다. 전체 항목은 Python 사용 가이드에서 확인할 수 있습니다.
| 속성 | 포함 항목 |
|---|---|
boxes | 검출 결과: 픽셀 단위 xyxy, 정규화된 중심 형식 xywhn, conf, cls, 추적 중에는 id |
masks, keypoints, obb, probs | 분할, 포즈, OBB 및 분류 모델의 출력(검출 모델의 경우 None) |
names | 클래스 인덱스를 클래스 이름에 매핑하는 딕셔너리 |
orig_img, orig_shape | NumPy 배열로 된 입력 이미지와 이미지의 높이 × 너비 |
speed | 전처리, 추론, 후처리에 걸린 시간(ms) |
path, save_dir | 입력 출처와 출력이 저장된 위치 |
객체 검출에서는 주로 바운딩 박스인 boxes이 필요합니다. result.summary()은 동일한 검출 결과를 일반 딕셔너리 목록으로 반환하므로 JSON API에 바로 사용할 수 있습니다.
예측 조정하기#
기본값은 대부분의 이미지에 적합합니다. 그렇지 않다면 인수를 한 번에 하나씩 변경하세요:
| 확인되는 문제 | 인수 | 기본값 | 변경 방법 |
|---|---|---|---|
| 누락: 눈에 보이는 객체에 상자가 표시되지 않음 | conf | 0.25 | 예: 0.1을 낮춥니다. |
| 오탐: 아무것도 없는 곳에 상자가 표시됨 | conf | 0.25 | 예: 0.5을 높입니다. |
| 객체 하나에 상자 두 개가 표시됨 | iou | 0.7 | 중복 병합에 사용하는 NMS 중첩(IoU) 임계값을 낮춥니다. |
| 작고 멀리 있는 객체를 놓침 | imgsz | 640 | 예: 1280을 높입니다(32의 배수로 반올림됨). |
| 일부 클래스만 중요함 | classes | 모두 | 예: 사람의 경우 classes=[0] |
| 잘못된 하드웨어 | device | 자동 | cpu, mps 또는 0와 같은 GPU 인덱스 |
신뢰도는 검출 수뿐 아니라 결과 자체를 바꿉니다. 동일한 버스 이미지에서:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model("https://ultralytics.com/images/bus.jpg", conf=0.5, classes=[0]) # 4 persons
model("https://ultralytics.com/images/bus.jpg", conf=0.1) # 사람 5명, 버스 1대, 정지 표지판 1개conf=0.1에서는 모델이 확신하지 못했던 정지 표지판도 보고합니다. conf을 낮추면 모델이 거의 검출한 항목을 가장 빠르게 확인할 수 있습니다. 나머지 인수는 구성 참조에서 확인하세요.
예측 결과가 비어 있으면 다음 순서대로 확인하세요:
여러 이미지 실행하기#
목록, 폴더 또는 "photos/*.jpg"과 같은 glob을 전달합니다. Predict의 기본값은 batch=1입니다. batch를 설정하면 여러 이미지를 한 번에 모델에 전달할 수 있어 GPU에서 훨씬 빠릅니다:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
images = ["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/zidane.jpg"]
for result in model(images, batch=2):
print(result.path, len(result.boxes), result.verbose())image0.jpg 5 4 persons, 1 bus,
image1.jpg 3 2 persons, 1 tie,이런 실수는 피하세요#
증상: KeyError: tensor([5.]). 원인: box.cls 및 box.conf는 PyTorch 텐서이고, result.names은 int를 키로 사용하는 딕셔너리입니다. 해결: 먼저 변환합니다: result.names[int(box.cls)], float(box.conf), box.xyxy[0].tolist().
증상: 함수 내부에서 YOLO("yolo26n.pt")을 호출하는 헬퍼가 느리게 실행됩니다. 노트북 CPU에서는 이미지마다 모델을 다시 로드할 때 71ms가 걸렸지만 모델을 한 번 로드하면 25ms가 걸렸습니다. 해결: 시작 시 모델을 한 번 생성하고 모든 이미지에서 재사용합니다.
model(list_or_folder)은 반환하기 전에 모든 Results 객체를 메모리에 수집합니다. 대용량 폴더와 모든 동영상의 경우 stream=True를 전달하고 반복문을 사용하세요. 결과가 한 번에 하나씩 반환됩니다. 동영상 강의에서 이 내용을 자세히 다룹니다.
정답 보기
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load once
images = ["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/zidane.jpg"]
for result in model(images, verbose=False):
top3 = sorted(result.summary(), key=lambda d: d["confidence"], reverse=True)[:3]
print(f"{result.path}: {len(result.boxes)} detections")
for d in top3:
print(f" {d['name']:>8} {d['confidence']:.2f}")image0.jpg: 5 detections
bus 0.90
person 0.85
person 0.85
image1.jpg: 3 detections
person 0.89
person 0.79
tie 0.59summary()은 이미 일반 이름과 부동 소수점 값을 반환하므로 변환할 텐서가 없습니다. 이미지 목록은 하나의 공통 크기로 패딩되므로 신뢰도는 predict.py과 약간 다릅니다. conf=0.1에서는 bus.jpg을 사용하면 정지 표지판이 추가됩니다.