OpenCV 비전 실무5장 · 영상 향상과 학습용 전처리11 / 21← 이전목차다음 →MetaContents

5장. 영상 향상과 학습용 전처리

AI 학습용 전처리로서의 향상

운전 학원에서 맑은 낮에만 연습한 사람은 비 오는 밤에 처음 운전하면 당황합니다. AI 모델도 학습 사진의 밝기가 들쭉날쭉하면, 물건의 모양보다 "밝다, 어둡다"에 휘둘리기 쉽습니다. 그래서 학습 사진의 밝기를 고르게 맞춰 주고, 실제로 쓸 때 들어오는 사진에도 똑같은 손질을 합니다. 시험 문제도 연습 문제와 같은 글꼴로 내야 공정한 것과 같습니다.

사진 모으기, 진단, 같은 함수로 손질, 학습과 사용의 네 단계 흐름도

그림의 네 단계를 왼쪽부터 읽습니다. 밝기가 제각각인 사진을 모아 4장의 숫자로 진단하고, 판정에 맞는 손질을 하나의 함수로 묶어 하고, 그 함수를 학습할 때와 실제로 쓸 때 똑같이 씁니다. 여기서 연습 문제가 학습 데이터, 시험 문제가 실제로 들어오는 사진, 같은 글꼴이 같은 전처리 함수입니다.

학습용 손질에서 지킬 것

지킬 것까닭예
밝기를 고르게 맞춘다모델이 밝기 대신 모양을 보고 배우게어두운 사진만 감마 0.5
학습과 사용에 같은 처리학습 때 못 본 꼴의 사진이 들어오지 않게같은 함수를 두 곳에서 부른다
지나치게 고치지 않는다0 과 255 에 몰린 칸은 정보가 지워진다손질 뒤 양끝 비율을 다시 잰다
원본을 남긴다처리 방법을 바꿀 때 다시 만들 수 있게고친 사진은 다른 폴더에 저장

짧은 예시

Python
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 를 다루는 장에서 다시 봅니다.
← 이전 절5장 · CLAHE다음 절 →5장 · 기법 고르는 기준