18장. OpenCV 전처리와 YOLO 연계
전이 학습
운전을 오래 한 사람이 처음 타는 차를 빌렸다고 해 봅시다. 운전 자체를 다시 배우지는 않습니다. 의자와 거울을 맞추고, 브레이크가 얼마나 민감한지 몇 번 밟아 보고, 차 크기에 감을 잡으면 금방 익숙해집니다. 전이 학습이 이것입니다. COCO 의 80가지 물체로 "물체의 테두리와 모양을 보는 법"을 익힌 yolo11n 에게, 볼트와 너트와 와셔를 조금 더 보여 줘서 우리 부품에 맞춥니다.
왼쪽 카드는 아무것도 모르는 모델을 처음부터 가르치는 길입니다. 사진이 수천 장 넘게 들고 시간도 오래 걸립니다. 오른쪽 카드의 전이 학습은 17장에서 만든 학습용 사진 45장으로도 해 볼 만합니다. 여기서 운전 실력이 사전학습 가중치이고, 새 차가 우리 부품 데이터셋입니다. 비유와 다른 점이 하나 있습니다. 사람은 옛 차 운전법을 잊지 않지만, 모델은 부품을 배우면서 COCO 의 80가지를 찾는 능력은 버립니다. 학습한 모델의 names 에는 bolt, nut, washer 셋만 남습니다.
학습은 문제집을 여러 번 풀며 틀린 만큼 고치는 일입니다. 그림의 네 걸음이 에포크 한 번에 일어나는 일입니다. 학습용 사진을 배치 8장씩 묶어 상자를 맞혀 보고, 틀린 정도를 손실로 매기고, 손실이 줄도록 가중치를 조금 고칩니다. 학습용 사진을 다 돌면 검증용 사진(17장의 모의고사)으로 mAP50 을 잽니다. 이 네 걸음을 에포크 수만큼 되풀이합니다.
학습에 주는 값
실습 2에서 쓰는 값입니다. 숫자를 바꾸면 결과도 달라지므로, 이 장의 결과와 견줄 때는 이 값을 그대로 씁니다.
| 값 | 이 장에서 | 뜻 | 바꾸면 |
|---|---|---|---|
data | out_ch17_yolo/data.yaml | 17장에서 만든 데이터셋의 안내판 | 다른 데이터셋으로 배운다 |
epochs | 30 | 문제집을 몇 번 풀까 | 늘리면 오래 걸리고, 너무 늘리면 과적합 |
batch | 8 | 한 번에 몇 장씩 볼까 | 늘리면 메모리를 많이 쓴다 |
imgsz | 320 | 사진을 맞출 크기 | 우리 그림이 320×240 이라 320 |
device | "cpu" | 어느 장치로 계산할까 | 그래픽 카드가 있으면 0 |
workers | 0 | 사진을 읽는 일꾼 수 | Windows 에서는 0 이 탈이 적다 |
seed, deterministic | 0, True | 씨앗 고정, 같은 계산 순서 | 같은 PC 에서 다시 돌려도 결과가 같게 |
얼마나 걸릴까
45장을 8장씩 묶으면 에포크 한 번에 묶음이 6개(마지막 묶음은 5장)입니다. 30 에포크면 가중치를 180번 고칩니다. 교안 PC(그래픽 카드 없음)에서는 에포크 한 번에 11초쯤, 30 에포크에 6분 남짓(5.7분) 걸렸습니다. 걸리는 시간은 PC 마다 크게 다릅니다.
import math
n_train, batch, epochs = 45, 8, 30
steps = math.ceil(n_train / batch) # ceil: 올림. 45 ÷ 8 = 5.6 → 6 묶음
print("에포크 한 번의 묶음 수:", steps)
print("가중치를 고치는 횟수:", steps * epochs)
# 에포크 한 번에 11초가 걸린다고 치면 전체는 몇 분인가
print("어림 시간(분):", round(11 * epochs / 60, 1))주의할 점
- 전이 학습을 해도 데이터셋이 작으면 실력에 한계가 있습니다. 이 장의 45장은 수업용으로 줄인 크기입니다. 실제 현장에서는 클래스마다 수백 장 이상을 모읍니다.
- 학습 중에는 CPU 를 거의 다 씁니다. 수업에서는 학습을 미리 돌려 두거나, 다른 작업을 하지 않는 동안 돌립니다.