18장. OpenCV 전처리와 YOLO 연계
전처리와 증강, 어느 쪽으로 풀까
비 오는 날 우산을 쓰는 방법과, 평소에 비 맞는 길도 달려 보는 방법이 있습니다. 우산은 그날그날 써야 하지만 효과가 바로 나고, 빗길 연습은 미리 해 두면 우산 없이도 덜 미끄러집니다. 어두운 사진을 다루는 방법도 둘입니다. 쓸 때마다 OpenCV 로 손질해 넣거나(우산), 16장의 증강으로 어두운 사진을 학습 때 미리 보여 줍니다(빗길 연습).
왼쪽 카드의 OpenCV 손질은 학습을 다시 하지 않아도 바로 쓸 수 있고, 원인이 "어둡다"처럼 하나로 분명할 때 잘 듣습니다. 오른쪽 카드의 증강은 다시 학습해야 하지만, 밝기와 잡음이 제각각인 사진에 두루 강해집니다. 여기서 우산이 OpenCV 손질, 빗길 연습이 증강입니다.
고르는 기준
| 상황 | 알맞은 쪽 | 까닭 |
|---|---|---|
| 카메라 한 대의 조명이 늘 어둡다 | OpenCV 손질 | 원인이 하나로 분명하고 다시 학습하지 않아도 된다 |
| 낮과 밤, 맑은 날과 흐린 날이 섞여 들어온다 | 증강 | 조건이 제각각이라 손질 하나로 맞추기 어렵다 |
| 학습을 다시 할 시간과 장비가 없다 | OpenCV 손질 | 모델은 그대로 둔다 |
| 손질을 걸었더니 오히려 떨어졌다 | 증강, 또는 더 약한 손질 | 학습 때 보지 못한 모습으로 바꾼 것일 수 있다 |
| 둘 다 할 수 있다 | 둘 다 | 증강으로 강하게 만들고, 아주 나쁜 사진만 손질한다 |
이 장의 모델이 어두운 사진에 강했던 것도, 학습용 사진에 어두운 그림이 섞여 있었기 때문입니다(실습 5). 증강으로 어두운 사진을 넣어 준 것과 같은 효과입니다. 증강을 할 때도 16장에서 본 규칙은 그대로입니다. 증강은 학습용에만 하고, 검증용과 시험용은 손대지 않습니다. 아래는 학습용 사진마다 어둡게 할 정도를 씨앗을 고정해 고르는 예입니다.
import numpy as np
rng = np.random.default_rng(1803)
# 학습용 사진 다섯 장마다 밝기 배율을 0.3~1.0 사이에서 고른다(uniform: 고르게 뽑기)
factors = rng.uniform(0.3, 1.0, 5)
print([round(float(f), 2) for f in factors])
# 원본 평균 밝기가 75 인 사진이라면 증강 뒤 평균 밝기는 대략
print([round(75 * float(f), 1) for f in factors])주의할 점
- 쓸 때 손질을 정했으면, 그 손질을 학습용 사진에도 똑같이 걸어 다시 학습하는 방법도 있습니다. 어느 쪽이든 학습 때와 쓸 때의 처리를 맞추는 것이 핵심입니다.
- 증강으로 다시 학습하면 결과 모델이 바뀌므로, 이 장의 점수 표를 처음부터 다시 만들어 견줍니다.