AI/개념

비전 객체탐지 모델 응용 및 전이학습(심화)

ksc036 2026. 4. 28. 22:40

 


YOLO 하이퍼파라미터 튜닝 정리

YOLO 모델을 학습할 때는 단순히 모델만 선택하는 것이 아니라, 학습 방식과 데이터 처리 방식, 저장 경로, 검증/예측 설정, 데이터 증강, 후처리 방식 등 다양한 설정을 함께 조정해야 한다. 이러한 설정값들을 하이퍼파라미터라고 한다.

하이퍼파라미터는 모델이 학습을 통해 직접 배우는 값이 아니라, 사용자가 학습 전에 정해주는 값이다. 예를 들어 learning rate, batch size, epoch 수, confidence threshold, IoU threshold 등이 있다.


1. 모델 관련 설정

YOLO에서는 어떤 모델을 사용할지 먼저 선택해야 한다.

예를 들어:

model = YOLO("yolo11n.pt")
model = YOLO("yolo11s.pt")
model = YOLO("yolo11m.pt")
model = YOLO("yolo11n-seg.pt")

여기서 n, s, m, l, x는 모델 크기를 의미한다.

n = nano, 가장 작고 빠름
s = small
m = medium
l = large
x = extra large, 가장 크고 무거움

모델이 클수록 일반적으로 정확도는 좋아질 수 있지만, 학습과 추론 속도는 느려지고 더 많은 GPU 메모리가 필요하다.

또한 YOLO는 작업 종류에 따라 모델이 나뉜다.

detect = 객체 탐지
seg = 인스턴스 세그멘테이션
cls = 이미지 분류
pose = 자세 추정
obb = 회전된 바운딩 박스 탐지

예를 들어 yolo11n-seg.pt는 segmentation용 YOLO 모델이다.


2. 훈련 설정 관련 하이퍼파라미터

훈련 설정은 모델이 데이터를 얼마나, 어떤 방식으로 학습할지를 결정한다.

대표적인 설정은 다음과 같다.

model.train(
    data="data.yaml",
    epochs=100,
    imgsz=640,
    batch=16,
    lr0=0.01,
    optimizer="SGD"
)

epochs

epochs는 전체 학습 데이터를 몇 번 반복해서 학습할지 정하는 값이다.

epochs=100

이면 전체 데이터셋을 100번 반복해서 학습한다는 뜻이다.

epoch가 너무 적으면 모델이 충분히 학습하지 못할 수 있고, 너무 많으면 과적합이 발생할 수 있다.


batch size

batch는 한 번에 몇 장의 이미지를 학습에 사용할지 정하는 값이다.

batch=16

이면 한 번의 학습 단계에서 이미지 16장을 사용한다.

batch size가 크면 학습이 안정적일 수 있지만 GPU 메모리를 많이 사용한다. 반대로 batch size가 작으면 메모리는 적게 쓰지만 학습이 불안정할 수 있다.


image size

imgsz는 학습에 사용할 이미지 크기이다.

imgsz=640

이면 이미지를 640 크기로 맞춰 학습한다.

이미지 크기가 크면 작은 객체를 더 잘 잡을 수 있지만 학습 속도가 느려지고 메모리 사용량이 증가한다.


learning rate

lr0는 초기 학습률이다.

lr0=0.01

learning rate는 모델의 가중치를 얼마나 크게 업데이트할지를 결정한다.

learning rate가 너무 크면 학습이 불안정해지고, 너무 작으면 학습이 너무 느려진다.


optimizer

optimizer는 손실값을 줄이기 위해 가중치를 업데이트하는 방법이다.

대표적으로 다음이 있다.

SGD
Adam
AdamW
auto

SGD는 안정적이고 전통적으로 많이 사용된다. Adam 계열은 빠르게 수렴하는 경우가 많지만 데이터나 상황에 따라 성능 차이가 날 수 있다.


3. 저장 및 경로 설정

YOLO는 학습 결과를 자동으로 저장한다. 저장 경로와 실험 이름도 설정할 수 있다.

model.train(
    data="data.yaml",
    epochs=100,
    project="runs/train",
    name="exp_custom_yolo"
)

project

project는 결과를 저장할 상위 폴더이다.

project="runs/train"

name

name은 해당 학습 실험의 이름이다.

name="exp_custom_yolo"

학습이 끝나면 보통 다음과 같은 구조로 저장된다.

runs/train/exp_custom_yolo/

이 안에는 학습 결과, 그래프, weight 파일 등이 저장된다.

대표적으로 중요한 파일은 다음과 같다.

weights/best.pt
weights/last.pt

best.pt는 검증 성능이 가장 좋았던 모델이고, last.pt는 마지막 epoch까지 학습한 모델이다.


4. 손실 함수 관련 설정

YOLO는 학습 과정에서 여러 손실값을 함께 사용한다.

대표적으로 다음과 같은 손실이 있다.

box loss
class loss
dfl loss
segmentation loss

box loss

box loss는 예측한 바운딩 박스가 실제 정답 박스와 얼마나 다른지를 계산하는 손실이다.

즉, 객체의 위치를 잘 맞히는지 평가한다.


class loss

class loss는 객체의 종류를 제대로 분류했는지 계산하는 손실이다.

예를 들어 실제로는 cup인데 모델이 bottle이라고 예측하면 class loss가 커진다.


DFL loss

DFL은 Distribution Focal Loss의 줄임말이다.

바운딩 박스 좌표를 하나의 고정된 값으로 바로 예측하는 것이 아니라, 좌표 주변의 분포를 학습해서 더 정교하게 위치를 예측하도록 도와주는 손실이다.

쉽게 말하면 객체 박스의 위치를 더 세밀하게 맞추기 위한 손실이라고 볼 수 있다.


segmentation loss

segmentation 모델에서는 객체의 박스뿐 아니라 객체 영역의 mask도 예측한다.

이때 예측한 mask가 실제 mask와 얼마나 다른지 계산하는 손실이 segmentation loss이다.


5. 학습 전략 관련 설정

학습 전략은 모델을 어떻게 안정적으로 학습시킬지와 관련이 있다.

대표적으로 다음과 같은 설정이 있다.

early stopping
patience
freeze
resume
pretrained

early stopping

early stopping은 성능이 더 이상 좋아지지 않으면 학습을 일찍 멈추는 전략이다.

YOLO에서는 patience 값으로 설정할 수 있다.

model.train(
    data="data.yaml",
    epochs=100,
    patience=20
)

patience=20은 검증 성능이 20 epoch 동안 개선되지 않으면 학습을 멈춘다는 의미이다.


freeze

freeze는 특정 레이어의 가중치를 업데이트하지 않도록 고정하는 것이다.

model.train(
    data="data.yaml",
    freeze=10
)

이렇게 하면 앞쪽 10개 레이어는 학습하지 않고 고정한다.

이미 사전학습된 모델이 기본적인 특징을 잘 학습하고 있다면, 앞쪽 레이어는 유지하고 뒤쪽 레이어만 새로운 데이터에 맞게 학습할 수 있다.


resume

resume은 중단된 학습을 이어서 진행하는 설정이다.

model.train(resume=True)

학습 도중 에러가 나거나 시간이 부족해서 중단된 경우, 마지막 체크포인트부터 다시 학습할 수 있다.


pretrained

pretrained는 사전학습된 모델을 사용할지 여부를 의미한다.

사전학습 모델을 사용하면 이미 일반적인 이미지 특징을 학습한 상태에서 시작하므로, 적은 데이터로도 더 좋은 성능을 얻기 쉽다.


6. 검증 설정 관련

검증은 학습된 모델이 새로운 데이터에 대해 얼마나 잘 동작하는지 확인하는 과정이다.

metrics = model.val(
    data="data.yaml",
    imgsz=640,
    conf=0.25,
    iou=0.45
)

검증 결과에서는 보통 다음 지표를 확인한다.

Precision
Recall
mAP50
mAP50-95

Precision

모델이 객체라고 예측한 것 중 실제로 맞은 비율이다.

잘못된 탐지를 줄이고 싶을 때 중요하다.


Recall

실제 객체 중에서 모델이 찾아낸 비율이다.

놓치는 객체를 줄이고 싶을 때 중요하다.


mAP

mAP는 객체 탐지 모델의 대표적인 성능 지표이다.

mAP50 = IoU 0.5 기준에서의 평균 정밀도
mAP50-95 = IoU 0.5부터 0.95까지 여러 기준을 평균낸 값

mAP50-95가 더 엄격한 평가 지표이다. 사업계획서 같이 포장이 중요한 상황에서는 mAP50을 사용하는 경향이 있다.


7. 예측 설정 관련

예측 단계에서는 confidence threshold와 IoU threshold가 중요하다.

results = model(
    "sample.png",
    conf=0.25,
    iou=0.45
)

confidence threshold

conf는 모델이 어느 정도 확신할 때 결과로 인정할지를 정하는 값이다.

conf=0.25

이면 confidence score가 0.25 이상인 예측만 남긴다.

conf 값을 높이면 확실한 객체만 탐지하지만, 놓치는 객체가 많아질 수 있다.

conf 값을 낮추면 더 많은 객체를 탐지하지만, 잘못된 탐지도 늘어날 수 있다.


IoU threshold

iou는 후처리 과정에서 중복 박스를 제거할 때 사용하는 기준이다.

YOLO는 같은 객체에 대해 여러 박스를 예측할 수 있는데, 이때 NMS라는 후처리 기법으로 중복 박스를 제거한다.

iou=0.45

이면 박스끼리 겹치는 정도가 0.45 이상일 때 중복으로 보고 하나만 남길 수 있다.


8. 데이터 증강 관련 설정

데이터 증강은 원본 이미지를 변형해서 학습 데이터를 다양하게 만드는 기법이다.

YOLO에서는 다양한 augmentation 설정을 사용할 수 있다.

대표적인 예시는 다음과 같다.

hsv_h
hsv_s
hsv_v
degrees
translate
scale
fliplr
mosaic
mixup
copy_paste

HSV 변형

HSV는 색상, 채도, 밝기와 관련된 설정이다.

hsv_h = 색상 변화
hsv_s = 채도 변화
hsv_v = 밝기 변화

이미지의 색이나 밝기를 조금씩 바꿔서 다양한 환경에서도 잘 탐지하도록 만든다.


flip

fliplr는 이미지를 좌우 반전하는 증강이다.

fliplr=0.5

이면 50% 확률로 이미지를 좌우 반전한다.


scale

scale은 이미지를 확대하거나 축소하는 증강이다.

객체 크기가 다양한 상황에 대응하기 위해 사용한다.


mosaic

mosaic은 여러 이미지를 하나로 합쳐서 학습하는 YOLO의 대표적인 데이터 증강 기법이다.

작은 객체 탐지 성능을 높이는 데 도움이 될 수 있다.


mixup

mixup은 두 이미지를 섞어서 새로운 학습 이미지를 만드는 방식이다.

모델이 더 일반화된 특징을 학습하도록 도와준다.


9. 후처리 및 시각화 관련

YOLO 모델의 예측 결과는 바로 사용되기도 하지만, 일반적으로 후처리와 시각화를 함께 수행한다.

대표적인 후처리는 NMS이다.

NMS

NMS는 Non-Maximum Suppression의 줄임말이다.

같은 객체에 대해 여러 개의 박스가 예측되었을 때, confidence score가 가장 높은 박스만 남기고 나머지는 제거한다.


시각화

YOLO에서는 result.plot()을 사용하면 예측 결과가 그려진 이미지를 얻을 수 있다.

results = model("sample.png")
result = results[0]

annotated = result.plot()

이때 annotated는 이미지 파일 자체가 아니라, 박스와 라벨이 그려진 이미지의 픽셀 배열이다.

이미지로 저장하려면 다음과 같이 할 수 있다.

import cv2

cv2.imwrite("result.png", annotated)

또는 화면에 출력하려면 다음과 같이 할 수 있다.

import matplotlib.pyplot as plt

plt.imshow(annotated[..., ::-1])
plt.axis("off")
plt.show()

10. TUNE 함수와 자동 하이퍼파라미터 최적화

YOLO에는 하이퍼파라미터를 자동으로 탐색하는 tune() 함수도 있다.

model.tune(
    data="data.yaml",
    epochs=30,
    iterations=100,
    optimizer="AdamW"
)

tune() 함수는 여러 하이퍼파라미터 조합을 시도하면서 더 좋은 성능을 내는 설정을 찾는다.

예를 들어 다음과 같은 값들을 자동으로 조정할 수 있다.

learning rate
momentum
weight decay
augmentation 관련 값
loss 관련 가중치

즉, 사용자가 일일이 모든 조합을 실험하지 않아도 모델 성능을 높일 수 있는 방향으로 하이퍼파라미터를 탐색해준다.


11. 하이퍼파라미터 튜닝과 파인튜닝의 차이

주의할 점은 하이퍼파라미터 튜닝과 파인튜닝은 완전히 같은 말은 아니다.

하이퍼파라미터 튜닝

하이퍼파라미터 튜닝은 학습에 사용되는 설정값을 조정하는 것이다.

예를 들어:

learning rate 조정
batch size 조정
epoch 수 조정
augmentation 강도 조정
conf, iou 값 조정

파인튜닝

파인튜닝은 이미 학습된 모델을 가져와서 새로운 데이터셋에 맞게 추가 학습하는 것이다.

예를 들어:

model = YOLO("yolo11n.pt")
model.train(data="custom_data.yaml", epochs=50)

이 경우 기존 YOLO 모델의 가중치를 기반으로 내 데이터셋에 맞게 다시 학습하므로 파인튜닝이라고 할 수 있다.


정리

YOLO 학습에서는 모델 선택, 훈련 설정, 저장 경로, 손실 함수, 학습 전략, 검증/예측 설정, 데이터 증강, 후처리와 시각화 등 다양한 하이퍼파라미터를 조정할 수 있다.

하이퍼파라미터 튜닝은 모델이 더 좋은 성능을 내도록 설정값을 조정하는 과정이고, 파인튜닝은 사전학습된 모델을 새로운 데이터셋에 맞게 다시 학습시키는 과정이다.

따라서 YOLO에서 좋은 성능을 얻기 위해서는 단순히 모델만 학습시키는 것이 아니라, 데이터 특성과 목적에 맞게 하이퍼파라미터를 적절히 조정하는 과정이 중요하다.