Computer Vision Masterclass · YOLOv8

YOLOv8 인공지능 객체인식
학생 자습 & 실습 완성 가이드

영상 속 물체를 사각형으로 찾는 객체 검출(Detection)부터, 종류를 구분하는 분류(Classification), 누끼를 따듯 픽셀을 분리하는 세그멘테이션(Segmentation), 17개 관절을 추적하는 포즈 추정(Pose)까지!
컴퓨터 비전 엔지니어링의 최고 인기 유튜브 강좌를 기반으로 혼자서도 막힘없이 실습할 수 있도록 한글로 체계화했습니다.

YouTube Full Masterclass Yolov8 FULL TUTORIAL (Detection · Classification · Segmentation · Pose)
강사: Computer Vision Engineer
추천 학습법 영상을 재생하면서 아래에 정리된 한글 설명과 파이썬 실습 코드를 Google Colab이나 본인 컴퓨터에 복사해 직접 실행해 보세요!
Core 4 Tasks

YOLOv8이 해결하는 4대 핵심 컴퓨터 비전

단순히 사진을 보는 것을 넘어, 인공지능이 인간처럼 시각 정보를 완벽히 분석하는 4가지 영역을 마스터합니다.

1. 객체 검출 (Detection)

이미지 안에서 사물(사람, 자동차, 동물 등)이 어디에 위치하는지 사각형(Bounding Box)으로 묶고 이름을 맞춥니다.

yolov8n.pt Bounding Box mAP50

2. 이미지 분류 (Classification)

사진 전체를 보고 "이 사진은 고양이인가, 강아지인가?"처럼 이미지의 카테고리를 백분율 확률로 분류합니다.

yolov8n-cls.pt Top-1 Acc Softmax

3. 인스턴스 분할 (Segmentation)

네모 박스가 아니라, 포토샵으로 누끼를 따듯 객체의 외곽선 픽셀(Mask)을 정밀하게 추출합니다.

yolov8n-seg.pt Polygon Mask 자율주행 차선

4. 포즈 추정 (Pose Estimation)

사람의 눈, 코, 어깨, 팔꿈치, 무릎 등 17개 관절 키포인트를 찾아 움직임과 운동 자세를 실시간 분석합니다.

yolov8n-pose.pt 17 Keypoints 스쿼트 카운터
MODULE 01

컴퓨터 비전 기초 & YOLOv8 환경 구축

YOLO(You Only Look Once)는 이미지를 격자(Grid)로 나누어 단 한 번의 순방향 연산만으로 객체의 위치와 종류를 동시에 예측하는 현존 최고 성능의 실시간 인공지능 모델입니다. 2023년 Ultralytics사에서 공개한 YOLOv8은 Anchor-free 아키텍처를 도입하여 이전 버전보다 훨씬 빠르고 정확합니다.

1-1. 모델 크기(Size) 선택 가이드 (Nano부터 XLarge까지)

YOLOv8은 용도와 하드웨어 성능에 따라 5가지 모델 크기를 제공합니다. 학생 실습에는 가볍고 빠른 Nano(n) 또는 Small(s)을 적극 추천합니다.

  • yolov8n (Nano): 파라미터 약 320만 개. 속도가 가장 빠르며 스마트폰, 라즈베리 파이, 일반 노트북 웹캠 실습에 최적화.
  • yolov8s (Small): 속도와 정확도의 밸런스가 뛰어나 학부 졸업작품이나 프로젝트에 가장 많이 애용됨.
  • yolov8m (Medium) / yolov8l (Large) / yolov8x (Extra Large): 고성능 GPU 서버용. 정밀한 산업용 결함 검사 등에 사용.
1-2. 라이브러리 설치 (단 한 줄이면 준비 끝!)

터미널(또는 Colab 코드 셀)에서 공식 패키지 ultralytics를 설치합니다. PyTorch와 OpenCV가 자동으로 함께 설치됩니다.

Terminal / Bash
# Ultralytics 공식 YOLO 패키지 설치
pip install ultralytics

# PyTorch GPU 사용 가능 여부 확인
python -c "import torch; print('CUDA 사용 가능 여부:', torch.cuda.is_available())"
1-3. 3초 만에 첫 객체인식 실행해보기

인터넷 이미지 링크를 넣고 미리 학습된 COCO 가중치(80개 사물 인식)로 추론을 실행합니다.

01_quick_start.py
from ultralytics import YOLO

# 1. 사전 학습된 나노(Nano) 모델 로드 (가중치 자동 다운로드됨)
model = YOLO("yolov8n.pt")

# 2. 이미지 추론 실행 (인터넷 이미지 URL 또는 로컬 파일 경로 입력)
results = model.predict(
    source="https://ultralytics.com/images/bus.jpg",
    save=True,       # 결과 이미지에 사각형 그려서 runs/detect/predict에 저장
    conf=0.25        # 신뢰도(Confidence) 25% 이상인 객체만 표시
)

# 3. 인식된 객체 정보 출력
for result in results:
    boxes = result.boxes
    for box in boxes:
        cls_id = int(box.cls[0])
        name = model.names[cls_id]
        conf = float(box.conf[0])
        print(f"🎯 인식된 사물: {name} (확률: {conf*100:.1f}%)")
Execution Output
Downloading https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n.pt to 'yolov8n.pt'...
image 1/1: bus.jpg: 640x480 4 persons, 1 bus, 1 stop sign, 12.5ms
Speed: 2.1ms preprocess, 12.5ms inference, 1.8ms postprocess per image at shape (1, 3, 640, 480)
Results saved to runs/detect/predict
🎯 인식된 사물: bus (확률: 89.2%)
🎯 인식된 사물: person (확률: 87.4%)
🎯 인식된 사물: stop sign (확률: 78.1%)
실습 팁 (CLI 명령어로도 바로 실행 가능!)

파이썬 코드 작성 없이 터미널에서 yolo predict model=yolov8n.pt source='0' show=True 를 입력하면 즉시 내 컴퓨터 노트북 웹캠으로 실시간 사물 인식이 켜집니다!

MODULE 02

나만의 커스텀 객체 검출 (Object Detection)

유튜브 영상의 1번째 핵심 파트입니다. 사전에 정의된 80개 사물이 아니라, 내가 원하는 물체(예: 마스크 착용 여부, 불량 부품, 반려견 배변 등)를 인공지능에게 가르치는 전 과정을 배웁니다.

2-1. 데이터셋 폴더 구조와 라벨링(Annotation) 규격

YOLOv8은 이미지(images)와 텍스트 라벨(labels) 파일이 1:1로 짝을 이루어야 합니다. 라벨 파일(.txt) 안에는 각 사각형의 좌표가 0~1 사이로 정규화되어 들어갑니다.

  • 라벨 포맷: <class_id> <x_center> <y_center> <width> <height>
  • 좌표 정규화: 픽셀 좌표를 이미지의 가로/세로 길이로 나눈 0.0 ~ 1.0 값.
데이터셋 표준 디렉토리 구조
my_dataset/
├── data.yaml          # 학습 설정 파일 (경로, 클래스 이름 정의)
├── train/
│   ├── images/        # 학습용 사진들 (img_01.jpg, img_02.jpg ...)
│   └── labels/        # 라벨 텍스트들 (img_01.txt, img_02.txt ...)
├── valid/
│   ├── images/        # 검증용 사진들
│   └── labels/        # 검증용 라벨 텍스트들
└── test/
    ├── images/        # 최종 테스트용 사진들
    └── labels/
2-2. data.yaml 파일 작성하기

YOLO에게 어디에 학습 데이터가 있는지, 인식할 클래스 종류가 몇 개인지 알려주는 지도 역할을 합니다.

data.yaml
# 데이터셋 기본 경로 (절대 경로 또는 상대 경로)
path: /content/my_dataset

train: train/images
val: valid/images
test: test/images

# 클래스 수 (Number of Classes)
nc: 2

# 클래스 이름 목록 (인덱스 0번, 1번)
names: ['mask_on', 'mask_off']
2-3. 파이썬 코드로 커스텀 모델 훈련(Training) 시작

전이학습(Transfer Learning)을 활용하여 적은 수의 사진(100~300장)으로도 뛰어난 인식률을 달성할 수 있습니다.

02_train_custom_detection.py
from ultralytics import YOLO

# 1. 사전 훈련된 가중치 불러오기 (전이학습 시작점)
model = YOLO("yolov8n.pt")

# 2. 커스텀 데이터셋으로 파인 튜닝(Fine-tuning)
results = model.train(
    data="data.yaml",   # 방금 만든 yaml 파일 경로
    epochs=50,          # 전체 데이터셋을 50번 반복 학습
    imgsz=640,          # 입력 이미지 해상도 (640x640 정규화)
    batch=16,           # 한 번에 GPU에 올릴 사진 묶음 크기
    device=0,           # GPU 0번 사용 (CPU만 있을 땐 'cpu' 입력)
    name="my_mask_model"# 학습 결과 저장 폴더 이름
)

# 3. 훈련 완료된 최적 가중치(best.pt)로 테스트 이미지 추론
best_model = YOLO("runs/detect/my_mask_model/weights/best.pt")
best_model.predict(source="test_sample.jpg", save=True, show=True)
2-4. 성능 평가 지표 쉽게 이해하기 (mAP50이란?)
  • Precision (정밀도): "인공지능이 마스크라고 예측한 것 중 진짜 마스크는 몇 개인가?" (헛다리 짚지 않는 능력)
  • Recall (재현율): "실제 마스크 중에서 인공지능이 놓치지 않고 찾아낸 비율은 얼마인가?" (누락시키지 않는 능력)
  • mAP50 (Mean Average Precision): 겹침 정도(IoU)가 50% 이상일 때의 종합 성적표(0~1 사이). 0.8(80%) 이상이면 훌륭한 모델입니다.
MODULE 03

이미지 분류 (Image Classification)

유튜브 영상의 2번째 핵심 파트입니다. 객체의 위치(좌표)를 찾을 필요 없이, 사진 1장이 어떤 카테고리(정상 vs 불량, 개 vs 고양이, 암세포 vs 정상세포)에 해당하는지 빠르게 판단하는 모델입니다.

3-1. 라벨링이 필요 없는 폴더 기반 데이터셋 구조

분류(Classification) 작업은 복잡한 사각형 좌표 라벨링 텍스트 파일이 필요 없습니다! 폴더 이름 자체가 정답 라벨이 됩니다.

Classification 폴더 구조
classify_dataset/
├── train/
│   ├── defect/     # 불량 부품 사진 500장
│   └── normal/     # 정상 부품 사진 500장
├── val/
│   ├── defect/     # 검증용 불량 사진 100장
│   └── normal/     # 검증용 정상 사진 100장
└── test/
03_image_classification.py
from ultralytics import YOLO

# 1. 분류 전용 경량 모델 로드 (-cls 접미사가 붙음)
model = YOLO("yolov8n-cls.pt")

# 2. 폴더 데이터셋으로 학습 실행
model.train(
    data="classify_dataset", # 폴더 경로만 지정하면 됨!
    epochs=30,
    imgsz=224,               # 분류는 보통 224x224 크기로 초고속 학습
    batch=32
)

# 3. 새로운 사진 분류 테스트
result = model("test_part.jpg")[0]
top1_index = result.probs.top1
top1_label = result.names[top1_index]
top1_conf = result.probs.top1conf.item()

print(f"🔍 판정 결과: {top1_label} (신뢰도: {top1_conf*100:.2f}%)")
MODULE 04

인스턴스 분할 (Instance Segmentation)

유튜브 영상의 3번째 핵심 파트입니다. 객체를 감싸는 네모 박스는 주변 배경 픽셀까지 포함해 버립니다. 반면 인스턴스 세그멘테이션(Segmentation)은 물체의 정확한 외곽선(다각형 마스크)을 따내어 픽셀 단위로 객체를 배경과 분리합니다.

4-1. 폴리곤(Polygon) 라벨 포맷

세그멘테이션 라벨 파일은 박스 4개 좌표가 아니라, 물체 테두리를 따라 찍은 꼭짓점들의 (x, y) 정규화 좌표가 순서대로 나열됩니다.

<class_id> <x1> <y1> <x2> <y2> <x3> <y3> ... <xn> <yn>

04_instance_segmentation.py
import cv2
import numpy as np
from ultralytics import YOLO

# 1. 세그멘테이션 전용 모델 로드 (-seg 접미사)
model = YOLO("yolov8n-seg.pt")

# 2. 이미지 추론
results = model("street.jpg")

for r in results:
    img = r.orig_img
    # r.masks 객체 안에 픽셀 단위 마스크 폴리곤 좌표가 들어있음
    if r.masks is not None:
        for mask, box in zip(r.masks.xy, r.boxes):
            cls_name = model.names[int(box.cls[0])]
            polygon = np.int32([mask]) # 꼭짓점 정수 좌표 변환
            
            # 외곽선 그리기 (초록색 선)
            cv2.polylines(img, polygon, isClosed=True, color=(0, 255, 0), thickness=2)
            print(f"✨ 세그멘테이션 분할 완료: {cls_name} (꼭짓점 개수: {len(mask)})")

cv2.imwrite("segmented_output.jpg", img)
주요 활용 분야

자율주행 자동차의 주행 가능 도로 영역 및 차선 검출, 의료 CT/MRI 영상의 장기 및 종양 크기 측정, 위성 지도의 건물 및 농경지 면적 계산 등에 필수적입니다.

MODULE 05

포즈 추정 (Pose Estimation) & AI 헬스 트레이너

유튜브 영상의 4번째 핵심 파트입니다. 카메라에 비친 사람 신체의 17개 핵심 관절 키포인트(Keypoints)를 실시간으로 탐지하여 스켈레톤(뼈대)을 연결합니다.

5-1. COCO 17개 키포인트 인덱스

0: 코, 1: 왼쪽 눈, 2: 오른쪽 눈, 3: 왼쪽 귀, 4: 오른쪽 귀, 5: 왼쪽 어깨, 6: 오른쪽 어깨, 7: 왼쪽 팔꿈치, 8: 오른쪽 팔꿈치, 9: 왼쪽 손목, 10: 오른쪽 손목, 11: 왼쪽 골반, 12: 오른쪽 골반, 13: 왼쪽 무릎, 14: 오른쪽 무릎, 15: 왼쪽 발목, 16: 오른쪽 발목

5-2. 실전 미니 프로젝트: 스쿼트 각도 계산 & 카운터

골반(11) - 무릎(13) - 발목(15) 세 점의 사잇각을 아크탄젠트(arctan2) 수학 공식으로 계산하여 90도 이하로 내려갔을 때 스쿼트 1회를 카운트합니다.

05_ai_squat_counter.py
import cv2
import numpy as np
from ultralytics import YOLO

def calculate_angle(a, b, c):
    """세 점 a, b(중심점), c의 사잇각(도, Degree)을 계산"""
    a, b, c = np.array(a), np.array(b), np.array(c)
    radians = np.arctan2(c[1]-b[1], c[0]-b[0]) - np.arctan2(a[1]-b[1], a[0]-b[0])
    angle = np.abs(radians * 180.0 / np.pi)
    if angle > 180.0:
        angle = 360.0 - angle
    return angle

# 1. 포즈 추정 전용 모델 로드 (-pose 접미사)
model = YOLO("yolov8n-pose.pt")

# 웹캠 열기 (0번 카메라)
cap = cv2.VideoCapture(0)
counter = 0
stage = "UP"

while cap.isOpened():
    ret, frame = cap.read()
    if not ret: break

    results = model(frame, verbose=False)
    for r in results:
        keypoints = r.keypoints.xy.cpu().numpy()
        if len(keypoints) > 0 and len(keypoints[0]) >= 17:
            kpts = keypoints[0]
            hip = kpts[11]   # 왼쪽 골반
            knee = kpts[13]  # 왼쪽 무릎
            ankle = kpts[15] # 왼쪽 발목

            # 세 관절 좌표가 유효한지 확인 후 각도 계산
            if knee[0] > 0 and hip[0] > 0 and ankle[0] > 0:
                angle = calculate_angle(hip, knee, ankle)
                
                # 스쿼트 판정 로직
                if angle < 90:
                    stage = "DOWN"
                if angle > 160 and stage == "DOWN":
                    stage = "UP"
                    counter += 1
                    print(f"🔥 스쿼트 성공! 현재 횟수: {counter}회")

                # 화면에 각도와 카운터 출력
                cv2.putText(frame, f"Angle: {int(angle)} deg", (30, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 255), 2)
                cv2.putText(frame, f"Squats: {counter}", (30, 100), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 255, 0), 3)

    cv2.imshow("AI Squat Counter", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
MODULE 06

실전 응용: 객체 추적 (Tracking) & 초고속 모델 배포

매 프레임마다 물체를 새로 인식하는 것을 넘어, "1번 사람", "2번 자동차"처럼 고유 ID를 부여하여 이동 궤적을 추적하는 ByteTrack 기술과 모델을 초고속으로 변환해 서비스에 배포하는 방법을 다룹니다.

6-1. 단 한 줄로 객체 추적기(ByteTrack / BoT-SORT) 켜기

model.predict() 대신 model.track()을 호출하면 내장된 최첨단 추적 알고리즘이 자동으로 고유 추적 ID(Track ID)를 부여합니다.

06_object_tracking.py
from ultralytics import YOLO

model = YOLO("yolov8n.pt")

# 비디오 파일 또는 실시간 RTSP CCTV 스트림에서 실시간 추적 실행
results = model.track(
    source="highway_cars.mp4",
    tracker="bytetrack.yaml", # 또는 'botsort.yaml'
    show=True,
    save=True
)

for result in results:
    if result.boxes.id is not None:
        track_ids = result.boxes.id.int().cpu().tolist()
        print("현재 화면에 감지된 차량 고유 ID들:", track_ids)
6-2. 프로덕션 배포를 위한 ONNX / TensorRT 모델 내보내기

파이썬 PyTorch 모델(.pt)은 무겁습니다. C++, C#, Java, 웹 브라우저, 임베디드 기기에서 5배 이상 빠르게 구동하기 위해 표준 바이너리인 ONNX로 내보냅니다.

07_export_model.py
from ultralytics import YOLO

model = YOLO("best.pt")

# ONNX 포맷으로 변환 (C++ 및 일반 CPU 추론 최적화)
model.export(format="onnx", dynamic=True)

# NVIDIA 그래픽카드용 초고속 TensorRT 변환 (엔진 파일 생성)
# model.export(format="engine", device=0)
FAQ & TROUBLESHOOTING

학생 자습 시 자주 발생하는 오류 TOP 5 & 해결책

1. "CUDA out of memory" (GPU 메모리 부족 오류)

원인: 배치 크기(batch size)나 이미지 해상도(imgsz)가 너무 커서 그래픽카드 VRAM을 초과한 경우입니다.
해결책: batch=16을 batch=8 또는 batch=4로 줄이거나, imgsz=640 대신 imgsz=480 또는 imgsz=320으로 낮춰서 실행하세요.

2. "No labels found in ... labels.cache" (라벨을 찾을 수 없음)

원인: data.yaml에 적힌 경로와 실제 폴더 이름이 다르거나, 이미지 폴더와 라벨 텍스트 폴더의 파일명이 서로 일치하지 않는 경우입니다.
해결책: image_01.jpg의 라벨은 반드시 같은 이름인 image_01.txt여야 합니다. 또한 images와 labels 폴더가 같은 상위 폴더(train, val) 아래에 나란히 있는지 확인하세요.

3. "AssertionError: Image Not Found" (경로 오류)

원인: 윈도우 환경에서 역슬래시(\)로 인해 경로가 깨지거나 한글 폴더명("바탕화면", "내문서")이 포함된 경우입니다.
해결책: 프로젝트 폴더는 반드시 영어로 된 경로(예: C:/ai_project/)에 두고, 슬래시(/) 기호를 사용하세요.

4. 라벨링을 손쉽게 무료로 하는 추천 도구: Roboflow

사진에 네모 박스나 다각형을 일일이 그리기 번거롭다면 웹 브라우저에서 무료로 사용할 수 있는 Roboflow를 추천합니다. 마우스로 박스를 치고 [Export] ➡️ [YOLOv8]을 선택하면 data.yaml과 폴더 구조가 압축 파일 하나로 완벽하게 다운로드됩니다.

5. 내 컴퓨터에 고성능 그래픽카드(GPU)가 없다면?

구글에서 무료로 제공하는 Google Colab을 사용하세요. 상단 메뉴 [런타임] ➡️ [런타임 유형 변경]에서 T4 GPU를 선택하면 최고 사양의 그래픽카드로 100% 무료 실습이 가능합니다.