영상 속 물체를 사각형으로 찾는 객체 검출(Detection)부터,
종류를 구분하는 분류(Classification),
누끼를 따듯 픽셀을 분리하는 세그멘테이션(Segmentation),
17개 관절을 추적하는 포즈 추정(Pose)까지!
컴퓨터 비전 엔지니어링의 최고 인기 유튜브 강좌를 기반으로 혼자서도 막힘없이 실습할 수 있도록 한글로 체계화했습니다.
단순히 사진을 보는 것을 넘어, 인공지능이 인간처럼 시각 정보를 완벽히 분석하는 4가지 영역을 마스터합니다.
이미지 안에서 사물(사람, 자동차, 동물 등)이 어디에 위치하는지 사각형(Bounding Box)으로 묶고 이름을 맞춥니다.
사진 전체를 보고 "이 사진은 고양이인가, 강아지인가?"처럼 이미지의 카테고리를 백분율 확률로 분류합니다.
네모 박스가 아니라, 포토샵으로 누끼를 따듯 객체의 외곽선 픽셀(Mask)을 정밀하게 추출합니다.
사람의 눈, 코, 어깨, 팔꿈치, 무릎 등 17개 관절 키포인트를 찾아 움직임과 운동 자세를 실시간 분석합니다.
YOLO(You Only Look Once)는 이미지를 격자(Grid)로 나누어 단 한 번의 순방향 연산만으로 객체의 위치와 종류를 동시에 예측하는 현존 최고 성능의 실시간 인공지능 모델입니다. 2023년 Ultralytics사에서 공개한 YOLOv8은 Anchor-free 아키텍처를 도입하여 이전 버전보다 훨씬 빠르고 정확합니다.
YOLOv8은 용도와 하드웨어 성능에 따라 5가지 모델 크기를 제공합니다. 학생 실습에는 가볍고 빠른 Nano(n) 또는 Small(s)을 적극 추천합니다.
터미널(또는 Colab 코드 셀)에서 공식 패키지 ultralytics를 설치합니다. PyTorch와 OpenCV가 자동으로 함께 설치됩니다.
# Ultralytics 공식 YOLO 패키지 설치
pip install ultralytics
# PyTorch GPU 사용 가능 여부 확인
python -c "import torch; print('CUDA 사용 가능 여부:', torch.cuda.is_available())"
인터넷 이미지 링크를 넣고 미리 학습된 COCO 가중치(80개 사물 인식)로 추론을 실행합니다.
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}%)")
파이썬 코드 작성 없이 터미널에서 yolo predict model=yolov8n.pt source='0' show=True 를 입력하면 즉시 내 컴퓨터 노트북 웹캠으로 실시간 사물 인식이 켜집니다!
유튜브 영상의 1번째 핵심 파트입니다. 사전에 정의된 80개 사물이 아니라, 내가 원하는 물체(예: 마스크 착용 여부, 불량 부품, 반려견 배변 등)를 인공지능에게 가르치는 전 과정을 배웁니다.
YOLOv8은 이미지(images)와 텍스트 라벨(labels) 파일이 1:1로 짝을 이루어야 합니다. 라벨 파일(.txt) 안에는 각 사각형의 좌표가 0~1 사이로 정규화되어 들어갑니다.
<class_id> <x_center> <y_center> <width> <height>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/
YOLO에게 어디에 학습 데이터가 있는지, 인식할 클래스 종류가 몇 개인지 알려주는 지도 역할을 합니다.
# 데이터셋 기본 경로 (절대 경로 또는 상대 경로)
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']
전이학습(Transfer Learning)을 활용하여 적은 수의 사진(100~300장)으로도 뛰어난 인식률을 달성할 수 있습니다.
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번째 핵심 파트입니다. 객체의 위치(좌표)를 찾을 필요 없이, 사진 1장이 어떤 카테고리(정상 vs 불량, 개 vs 고양이, 암세포 vs 정상세포)에 해당하는지 빠르게 판단하는 모델입니다.
분류(Classification) 작업은 복잡한 사각형 좌표 라벨링 텍스트 파일이 필요 없습니다! 폴더 이름 자체가 정답 라벨이 됩니다.
classify_dataset/
├── train/
│ ├── defect/ # 불량 부품 사진 500장
│ └── normal/ # 정상 부품 사진 500장
├── val/
│ ├── defect/ # 검증용 불량 사진 100장
│ └── normal/ # 검증용 정상 사진 100장
└── test/
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}%)")
유튜브 영상의 3번째 핵심 파트입니다. 객체를 감싸는 네모 박스는 주변 배경 픽셀까지 포함해 버립니다. 반면 인스턴스 세그멘테이션(Segmentation)은 물체의 정확한 외곽선(다각형 마스크)을 따내어 픽셀 단위로 객체를 배경과 분리합니다.
세그멘테이션 라벨 파일은 박스 4개 좌표가 아니라, 물체 테두리를 따라 찍은 꼭짓점들의 (x, y) 정규화 좌표가 순서대로 나열됩니다.
<class_id> <x1> <y1> <x2> <y2> <x3> <y3> ... <xn> <yn>
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 영상의 장기 및 종양 크기 측정, 위성 지도의 건물 및 농경지 면적 계산 등에 필수적입니다.
유튜브 영상의 4번째 핵심 파트입니다. 카메라에 비친 사람 신체의 17개 핵심 관절 키포인트(Keypoints)를 실시간으로 탐지하여 스켈레톤(뼈대)을 연결합니다.
0: 코, 1: 왼쪽 눈, 2: 오른쪽 눈, 3: 왼쪽 귀, 4: 오른쪽 귀, 5: 왼쪽 어깨, 6: 오른쪽 어깨, 7: 왼쪽 팔꿈치, 8: 오른쪽 팔꿈치, 9: 왼쪽 손목, 10: 오른쪽 손목, 11: 왼쪽 골반, 12: 오른쪽 골반, 13: 왼쪽 무릎, 14: 오른쪽 무릎, 15: 왼쪽 발목, 16: 오른쪽 발목
골반(11) - 무릎(13) - 발목(15) 세 점의 사잇각을 아크탄젠트(arctan2) 수학 공식으로 계산하여 90도 이하로 내려갔을 때 스쿼트 1회를 카운트합니다.
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()
매 프레임마다 물체를 새로 인식하는 것을 넘어, "1번 사람", "2번 자동차"처럼 고유 ID를 부여하여 이동 궤적을 추적하는 ByteTrack 기술과 모델을 초고속으로 변환해 서비스에 배포하는 방법을 다룹니다.
model.predict() 대신 model.track()을 호출하면 내장된 최첨단 추적 알고리즘이 자동으로 고유 추적 ID(Track ID)를 부여합니다.
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)
파이썬 PyTorch 모델(.pt)은 무겁습니다. C++, C#, Java, 웹 브라우저, 임베디드 기기에서 5배 이상 빠르게 구동하기 위해 표준 바이너리인 ONNX로 내보냅니다.
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)
원인: 배치 크기(batch size)나 이미지 해상도(imgsz)가 너무 커서 그래픽카드 VRAM을 초과한 경우입니다.
해결책: batch=16을 batch=8 또는 batch=4로 줄이거나, imgsz=640 대신 imgsz=480 또는 imgsz=320으로 낮춰서 실행하세요.
원인: data.yaml에 적힌 경로와 실제 폴더 이름이 다르거나, 이미지 폴더와 라벨 텍스트 폴더의 파일명이 서로 일치하지 않는 경우입니다.
해결책: image_01.jpg의 라벨은 반드시 같은 이름인 image_01.txt여야 합니다. 또한 images와 labels 폴더가 같은 상위 폴더(train, val) 아래에 나란히 있는지 확인하세요.
원인: 윈도우 환경에서 역슬래시(\)로 인해 경로가 깨지거나 한글 폴더명("바탕화면", "내문서")이 포함된 경우입니다.
해결책: 프로젝트 폴더는 반드시 영어로 된 경로(예: C:/ai_project/)에 두고, 슬래시(/) 기호를 사용하세요.
사진에 네모 박스나 다각형을 일일이 그리기 번거롭다면 웹 브라우저에서 무료로 사용할 수 있는 Roboflow를 추천합니다. 마우스로 박스를 치고 [Export] ➡️ [YOLOv8]을 선택하면 data.yaml과 폴더 구조가 압축 파일 하나로 완벽하게 다운로드됩니다.
구글에서 무료로 제공하는 Google Colab을 사용하세요. 상단 메뉴 [런타임] ➡️ [런타임 유형 변경]에서 T4 GPU를 선택하면 최고 사양의 그래픽카드로 100% 무료 실습이 가능합니다.