Ultralytics YOLO27: 대기자 명단에 등록하세요.
Get Started
첫 YOLO 모델 학습하기·예측·레슨 2/10
강의초급

이미지 예측

Python에서 사전 학습된 YOLO26 모델을 실행하고, 결과에서 클래스, 신뢰도, 픽셀 좌표 상자를 확인한 다음 누락 대부분을 해결하는 인수를 조정합니다.

선반의 재고 수량 계산, 블러 처리를 위한 얼굴 자르기, JSON API로 상자 전송 등 디텍터를 실제로 사용하는 모든 작업은 결과 객체를 올바르게 읽는 것에서 시작합니다. 텐서로 클래스 이름을 인덱싱하는 것처럼 세부 사항 하나를 잘못 처리하면 첫 이미지에서 앱이 충돌합니다.

사전 학습된 YOLO26 detect 모델은 이미 80개의 COCO 클래스를 알고 있습니다. 이 강의에서는 Python에서 Predict 모드를 실행하고, 결과에서 유용한 모든 필드를 가져오며, 누락·중복·작은 객체에 대응하려면 어떤 인수를 변경해야 하는지 알아봅니다. 나중에 직접 학습한 모델에서도 동일한 결과 객체가 반환됩니다.

학습 성과

이미지에서 YOLO26을 실행하고 각 검출의 클래스 이름, 신뢰도, 픽셀 좌표 상자를 출력하는 Python 스크립트를 작성할 수 있으며, 어떤 종류의 누락에 어떤 인수를 사용해야 하는지 알 수 있습니다.

속성 과정
이미 사용법을 알고 계신다면, 간단히 요약해 드리겠습니다.
  1. 한 번만 로드합니다: model = YOLO('yolo26n.pt'); 그런 다음 result = model(source)[0]을 실행합니다.

  2. result.boxes을 순회하고 int(box.cls), float(box.conf), box.xyxy[0].tolist()으로 변환합니다.

  3. result.names[int(box.cls)]을 사용해 클래스 인덱스를 이름에 매핑합니다.

  4. 호출별로 conf, iou, imgsz, classes을 조정합니다.

실습형

모든 검출을 예측하고 출력하기#

워터프런트 산책로에서 Ultralytics YOLO가 검출한 결과: 사람, 자전거, 개, 자동차 주변에 신뢰도 점수가 표시된 상자

소스에 대해 모델을 호출하면 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_shapeNumPy 배열로 된 입력 이미지와 이미지의 높이 × 너비
speed전처리, 추론, 후처리에 걸린 시간(ms)
path, save_dir입력 출처와 출력이 저장된 위치

객체 검출에서는 주로 바운딩 박스인 boxes이 필요합니다. result.summary()은 동일한 검출 결과를 일반 딕셔너리 목록으로 반환하므로 JSON API에 바로 사용할 수 있습니다.

예측 조정하기#

기본값은 대부분의 이미지에 적합합니다. 그렇지 않다면 인수를 한 번에 하나씩 변경하세요:

확인되는 문제인수기본값변경 방법
누락: 눈에 보이는 객체에 상자가 표시되지 않음conf0.25예: 0.1을 낮춥니다.
오탐: 아무것도 없는 곳에 상자가 표시됨conf0.25예: 0.5을 높입니다.
객체 하나에 상자 두 개가 표시됨iou0.7중복 병합에 사용하는 NMS 중첩(IoU) 임계값을 낮춥니다.
작고 멀리 있는 객체를 놓침imgsz640예: 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를 전달하고 반복문을 사용하세요. 결과가 한 번에 하나씩 반환됩니다. 동영상 강의에서 이 내용을 자세히 다룹니다.

사용해 보기

top3.py을 작성합니다. yolo26n.pt을 한 번 로드하고, bus.jpg, zidane.jpg, 직접 촬영한 사진 한 장에 실행한 다음 각 이미지의 검출 수와 신뢰도가 가장 높은 클래스 세 개를 출력합니다. 그런 다음 검출 수가 가장 적은 이미지를 conf=0.1로 다시 실행하고 무엇이 나타났는지 한 문장으로 작성합니다.

완료 조건
다음 조건을 모두 충족하면 레슨을 완료한 것입니다.
  • 스크립트가 KeyError 없이 모든 이미지의 검출 수와 신뢰도와 함께 상위 3개 클래스를 출력합니다.

  • conf=0.25과 conf=0.1에서 동일한 이미지 하나를 비교하고 변경된 점을 기록했습니다.

  • 누락, 중복 상자, 작은 객체에 대응하려면 어떤 인수를 변경해야 하는지 말할 수 있습니다.

정답 보기
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.59

summary()은 이미 일반 이름과 부동 소수점 값을 반환하므로 변환할 텐서가 없습니다. 이미지 목록은 하나의 공통 크기로 패딩되므로 신뢰도는 predict.py과 약간 다릅니다. conf=0.1에서는 bus.jpg을 사용하면 정지 표지판이 추가됩니다.

다음 단계

가장 작은 모델을 사용해 보았습니다. 다음으로 프로젝트에서 실제 학습 및 배포에 사용할 YOLO26 크기를 결정해 보세요.