5장. 영상 향상과 학습용 전처리
AI 학습용 전처리로서의 향상
운전 학원에서 맑은 낮에만 연습한 사람은 비 오는 밤에 처음 운전하면 당황합니다. AI 모델도 학습 사진의 밝기가 들쭉날쭉하면, 물건의 모양보다 "밝다, 어둡다"에 휘둘리기 쉽습니다. 그래서 학습 사진의 밝기를 고르게 맞춰 주고, 실제로 쓸 때 들어오는 사진에도 똑같은 손질을 합니다. 시험 문제도 연습 문제와 같은 글꼴로 내야 공정한 것과 같습니다.
그림의 네 단계를 왼쪽부터 읽습니다. 밝기가 제각각인 사진을 모아 4장의 숫자로 진단하고, 판정에 맞는 손질을 하나의 함수로 묶어 하고, 그 함수를 학습할 때와 실제로 쓸 때 똑같이 씁니다. 여기서 연습 문제가 학습 데이터, 시험 문제가 실제로 들어오는 사진, 같은 글꼴이 같은 전처리 함수입니다.
학습용 손질에서 지킬 것
| 지킬 것 | 까닭 | 예 |
|---|---|---|
| 밝기를 고르게 맞춘다 | 모델이 밝기 대신 모양을 보고 배우게 | 어두운 사진만 감마 0.5 |
| 학습과 사용에 같은 처리 | 학습 때 못 본 꼴의 사진이 들어오지 않게 | 같은 함수를 두 곳에서 부른다 |
| 지나치게 고치지 않는다 | 0 과 255 에 몰린 칸은 정보가 지워진다 | 손질 뒤 양끝 비율을 다시 잰다 |
| 원본을 남긴다 | 처리 방법을 바꿀 때 다시 만들 수 있게 | 고친 사진은 다른 폴더에 저장 |
짧은 예시
import os
import cv2
def preprocess(gray):
"""학습할 때와 쓸 때 똑같이 부를 손질 함수. 여기서는 정규화만 한다."""
return cv2.normalize(gray, None, 0, 255, cv2.NORM_MINMAX)
folder = "ch05_train"
for name in sorted(os.listdir(folder)):
gray = cv2.imread(os.path.join(folder, name), cv2.IMREAD_GRAYSCALE)
out = preprocess(gray)
print(name, round(float(gray.mean()), 1), "→", round(float(out.mean()), 1))ch05_train/ 은 컨베이어 위의 부품을 도형으로 그린 가상의 학습 사진 여섯 장입니다. 정규화 전의 평균은 36.8 부터 200.3 까지 들쭉날쭉하지만, 정규화 뒤에는 그림자가 진 part_06.png(68.3)를 빼면 98.5~103.3 으로 모입니다. 그림자처럼 한쪽만 어두운 사진은 정규화로 고르게 맞지 않는다는 것도 함께 보입니다.
주의할 점
- 손질 함수의 숫자(감마 값, clipLimit 등)를 학습 사진을 보고 정했다면, 실제 사진에도 그 숫자 그대로 씁니다. 사진마다 다른 숫자를 쓰면 같은 처리가 아닙니다.
- 딥러닝 모델에 넣기 직전에 밝기를 255 로 나눠 0~1 로 맞추는 일도 흔합니다. 이 일은 과정 뒤쪽의 YOLO 를 다루는 장에서 다시 봅니다.