YOLO 예제

이 문서는 YOLO를 처음 접하는 분들을 위한 실행 가능한 예제 모음입니다. 예제 1부터 순서대로 따라하면 5분 안에 첫 번째 객체 탐지 결과를 확인할 수 있습니다. 모든 예제는 Google Colab 또는 로컬 Python 환경에서 그대로 실행할 수 있습니다.

항목내용
사전 조건pip install ultralytics 설치 완료
예제 수5개 (추론 → 배치 → 임계값 → 클래스 필터 → 저장)
권장 시작 모델yolo11n.pt (가장 빠르고 가벼움)
테스트 데이터Ultralytics 제공 샘플 이미지 (자동 다운로드)
예상 소요 시간전체 약 20분 (예제 1만: 5분)

문서 탐색


예제 1: 첫 번째 추론 (5분 코스)

가장 간단한 형태의 YOLO 추론입니다. 설치 후 바로 실행해 볼 수 있습니다.

# 1단계: 라이브러리 임포트
from ultralytics import YOLO
 
# 2단계: 모델 로드
# yolo11n.pt 파일이 없으면 자동으로 인터넷에서 다운로드됩니다 (~6MB)
model = YOLO("yolo11n.pt")
 
# 3단계: 추론 실행
# Ultralytics에서 제공하는 샘플 이미지 사용 (자동 다운로드)
results = model("https://ultralytics.com/images/bus.jpg")
 
# 4단계: 결과 확인
result = results[0]
print(f"탐지된 객체 수: {len(result.boxes)}")
 
# 각 탐지 결과 출력
for box in result.boxes:
    cls_id = int(box.cls.item())
    cls_name = result.names[cls_id]
    confidence = box.conf.item()
    x1, y1, x2, y2 = box.xyxy[0].tolist()
    print(f"  클래스: {cls_name}, 신뢰도: {confidence:.2f}, 위치: ({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})")
 
# 5단계: 결과 이미지 저장
result.save(filename="my_first_result.jpg")
print("결과 저장 완료: my_first_result.jpg")

예상 출력:

탐지된 객체 수: 5
  클래스: person, 신뢰도: 0.89, 위치: (16, 198, 193, 732)
  클래스: person, 신뢰도: 0.84, 위치: (671, 160, 810, 716)
  클래스: bus, 신뢰도: 0.98, 위치: (22, 82, 789, 732)
  클래스: person, 신뢰도: 0.67, 위치: (214, 208, 285, 498)
  클래스: person, 신뢰도: 0.54, 위치: (786, 218, 861, 440)
결과 저장 완료: my_first_result.jpg

Colab에서 결과를 바로 보려면 result.show() 대신 다음 코드를 사용합니다.

from PIL import Image
Image.open("my_first_result.jpg")

예제 2: 여러 이미지 배치 추론 (폴더 단위)

드론으로 촬영한 수백 장의 이미지를 한 번에 처리할 때 사용합니다.

from ultralytics import YOLO
import os
 
model = YOLO("yolo11n.pt")
 
# 폴더 내 모든 이미지를 한 번에 처리
# 지원 형식: jpg, jpeg, png, bmp, tiff, webp
results = model("drone_images/", stream=True)  # stream=True: 메모리 절약 (대용량 폴더 권장)
 
# 결과 순회
total_detections = 0
for i, result in enumerate(results):
    n = len(result.boxes)
    total_detections += n
    print(f"[{i+1}] {os.path.basename(result.path)}: {n}개 탐지")
 
print(f"\n전체 탐지 수: {total_detections}")
 
# 결과 일괄 저장 (각 이미지에 바운딩 박스가 그려진 상태로 저장)
results = model(
    "drone_images/",
    save=True,           # 이미지 저장
    project="runs",      # 저장 상위 폴더
    name="batch_run",    # 저장 하위 폴더
)
# 결과: runs/batch_run/ 폴더에 저장됨

stream=True는 이미지를 하나씩 불러와 처리하므로, 수천 장 이상의 폴더를 처리할 때 메모리 부족을 방지합니다.


예제 3: Confidence Threshold 조정

conf 파라미터는 탐지 결과의 최소 신뢰도를 설정합니다. 값이 낮을수록 더 많은 객체가 탐지되지만 오탐(False Positive)이 늘어납니다.

from ultralytics import YOLO
 
model = YOLO("yolo11n.pt")
image = "drone_railway.jpg"
 
# 낮은 임계값: 모든 후보 포함 (오탐 多, 놓침 少)
results_low = model(image, conf=0.25)
print(f"conf=0.25: {len(results_low[0].boxes)}개 탐지")
 
# 중간 임계값: 일반적인 기본값
results_mid = model(image, conf=0.50)
print(f"conf=0.50: {len(results_mid[0].boxes)}개 탐지")
 
# 높은 임계값: 확실한 것만 포함 (오탐 少, 놓침 多)
results_high = model(image, conf=0.70)
print(f"conf=0.70: {len(results_high[0].boxes)}개 탐지")
conf 값탐지 수특징적합한 상황
0.10~0.25많음작은 결함도 놓치지 않음 (오탐 증가)안전 점검 초기 스캔
0.40~0.50보통속도와 정확도 균형 (기본 권장)일반 점검 업무
0.60~0.80적음확실한 결함만 출력 (놓침 증가)자동 경고 시스템

철도 점검처럼 놓침(미탐)이 위험한 상황에서는 conf를 낮게 설정하고 사람이 2차 검토하는 방식을 권장합니다.


예제 4: 특정 클래스만 탐지

철도 점검에서 균열과 볼트 누락만 탐지하고 싶을 때처럼, 특정 클래스만 필터링하는 방법입니다.

from ultralytics import YOLO
 
model = YOLO("yolo11n.pt")
 
# COCO 데이터셋에서 사람(0)과 자동차(2)만 탐지
results = model("drone_image.jpg", classes=[0, 2])
 
# 클래스 ID 확인 (COCO 80클래스 기준)
print(model.names)
# {0: 'person', 1: 'bicycle', 2: 'car', 3: 'motorcycle', ...}
 
# 커스텀 모델에서 균열(0)과 볼트누락(1)만 탐지
custom_model = YOLO("railway_detector.pt")
results = custom_model("drone_image.jpg", classes=[0, 1])
 
# 탐지 후 코드에서 필터링하는 방법 (추론은 모든 클래스로 수행)
results = model("drone_image.jpg")
result = results[0]
 
TARGET_CLASSES = [0, 2]  # 관심 클래스 ID
filtered_boxes = [
    box for box in result.boxes
    if int(box.cls.item()) in TARGET_CLASSES
]
print(f"필터링 후 탐지 수: {len(filtered_boxes)}")

classes= 파라미터로 필터링하는 것이 추론 후 필터링보다 빠릅니다. 하지만 커스텀 모델을 학습할 때는 처음부터 필요한 클래스만 포함한 데이터셋을 구성하는 것이 가장 효율적입니다.


예제 5: 결과 저장

탐지 결과를 이미지, 텍스트 라벨, JSON 등 다양한 형식으로 저장합니다.

from ultralytics import YOLO
 
model = YOLO("yolo11n.pt")
 
# 이미지 + 라벨 파일 모두 저장
results = model(
    source="drone_images/",
    save=True,           # 바운딩 박스가 그려진 이미지 저장
    save_txt=True,       # YOLO 형식 라벨 파일(.txt) 저장
    save_conf=True,      # 라벨 파일에 신뢰도 점수 포함
    save_crop=True,      # 탐지된 객체를 잘라서 별도 저장
    project="output",    # 저장 상위 디렉토리
    name="inspection",   # 저장 하위 디렉토리
)
 
# 저장 구조:
# output/inspection/
# ├── image1.jpg          (save=True: 바운딩 박스가 그려진 이미지)
# ├── image2.jpg
# ├── labels/
# │   ├── image1.txt      (save_txt=True: YOLO 형식 라벨)
# │   └── image2.txt
# └── crops/
#     ├── person/         (save_crop=True: 클래스별 잘라낸 이미지)
#     └── car/
 
# 라벨 파일 형식 확인 (save_txt=True 사용 시)
with open("output/inspection/labels/image1.txt") as f:
    print(f.read())
# 0 0.512 0.438 0.245 0.187 0.893
# 클래스ID cx cy w h confidence (정규화 좌표, save_conf=True일 때 confidence 포함)
 
# JSON 형식으로 결과 저장
import json
results = model("drone_images/")
all_results = []
for result in results:
    data = json.loads(result.tojson())
    all_results.extend(data)
 
with open("detections.json", "w", encoding="utf-8") as f:
    json.dump(all_results, f, ensure_ascii=False, indent=2)
 
print("JSON 저장 완료: detections.json")

초보자 팁

이유
nano 모델(yolo11n.pt)부터 시작하세요빠르고 가벼워서 파이프라인 테스트에 최적, 나중에 큰 모델로 교체 가능
COCO8 데이터셋으로 파이프라인 먼저 검증하세요COCO 전체(~20GB)보다 8장짜리 COCO8로 학습-검증-추론 흐름을 빠르게 확인
imgsz=640을 기본으로 사용하세요대부분의 모델이 640×640에 최적화됨, 소형 객체가 많으면 1280으로 올리세요
stream=True로 대용량 폴더 처리하세요수백 장 이상 처리 시 메모리 부족 방지
Colab에서 런타임을 GPU로 설정하세요CPU 대비 10~50배 빠름, 무료 T4 GPU 사용 가능
결과가 이상하면 conf 값을 낮춰보세요기본 0.25보다 낮게 설정하면 더 많은 탐지 결과를 확인 가능
# COCO8 데이터셋으로 빠른 파이프라인 검증 예시
from ultralytics import YOLO
 
model = YOLO("yolo11n.pt")
 
# COCO8: COCO train/val 각 4장씩 8장으로 구성된 미니 데이터셋 (자동 다운로드)
metrics = model.val(data="coco8.yaml")
print(f"mAP@0.5: {metrics.box.map50:.3f}")
print(f"mAP@0.5:0.95: {metrics.box.map:.3f}")

문서 탐색


참고 자료