OpenCV 비전 실무16장 · AI 데이터 정제와 데이터 증강4 / 21← 이전목차다음 →MetaContents

16장. AI 데이터 정제와 데이터 증강

깨진 파일과 형식 문제 거르기

택배를 받으면 상자를 열기 전에 먼저 살핍니다. 상자가 비어 가볍지 않은지, 찢어져 속이 쏟아지지 않았는지, 주문한 것보다 너무 작지 않은지, 포장 방식이 다르지 않은지 봅니다. 사진 파일도 열어 보기 전과 연 직후에 같은 순서로 살핍니다.

파일 크기, 읽기, 그림 크기, 채널 수의 네 가지를 차례로 확인하는 흐름도

그림의 네 칸을 왼쪽부터 확인합니다. 파일 크기가 0 바이트면 빈 파일이고, cv2.imread 가 None 을 돌려주면 깨진 파일입니다(1장 프로젝트에서 본 것과 같습니다). 열리더라도 짧은 변이 64칸보다 작으면 쓸 만한 정보가 모자랍니다. 마지막으로 채널 수를 셉니다. 여기서 빈 상자가 0 바이트 파일, 찢어진 상자가 깨진 파일, 너무 작은 상자가 작은 그림, 포장 방식이 다른 상자가 채널이 다른 그림입니다.

흑백, 컬러, 투명 채널 그림을 채널 셋으로 맞추는 방법을 견준 비교 그림

채널이 다른 그림은 버리지 않고 맞춥니다. 흑백(채널 1)은 COLOR_GRAY2BGR 로 같은 밝기를 세 채널에 넣고, 투명 채널이 있는 그림(채널 4)은 COLOR_BGRA2BGR 로 넷째 채널을 뗍니다. 모델은 모든 사진이 (세로, 가로, 3) 모양이기를 바랍니다.

읽기 방법에 따른 결과

읽는 법흑백 png투명 채널 png깨진 파일
cv2.imread(경로)(세로, 가로, 3) 으로 바꿔 읽음넷째 채널을 버리고 3 채널None
cv2.imread(경로, cv2.IMREAD_UNCHANGED)(세로, 가로), 채널 1(세로, 가로, 4)None

점검할 때는 IMREAD_UNCHANGED 로 읽습니다. 저장된 그대로를 봐야 흑백이나 투명 채널이 섞였는지 알 수 있기 때문입니다.

짧은 예시

Python
import os
import cv2

# 1. 파일 크기: os.path.getsize 는 바이트 수를 돌려준다
print(os.path.getsize("ch16_raw/tangerine_13.png"))    # 결과: 0 → 빈 파일

# 2. 읽기: 그림이 아닌 파일은 None
print(cv2.imread("ch16_raw/apple_11.png", cv2.IMREAD_UNCHANGED))   # 결과: None

# 3. 그림 크기: 짧은 변이 64 보다 작으면 너무 작다
small = cv2.imread("ch16_raw/tangerine_12.png", cv2.IMREAD_UNCHANGED)
print(small.shape, min(small.shape[:2]) < 64)           # 결과: (36, 48, 3) True

# 4. 채널 수: ndim 이 2 면 채널 1, 아니면 shape 의 셋째 값
gray = cv2.imread("ch16_raw/apple_12.png", cv2.IMREAD_UNCHANGED)
rgba = cv2.imread("ch16_raw/lime_12.png", cv2.IMREAD_UNCHANGED)
print(gray.shape, rgba.shape)                            # 결과: (150, 200) (150, 200, 4)

# 채널을 셋으로 맞춘다
print(cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR).shape)     # 결과: (150, 200, 3)
print(cv2.cvtColor(rgba, cv2.COLOR_BGRA2BGR).shape)     # 결과: (150, 200, 3)

깨진 파일을 읽을 때 화면에 [ WARN:0@...] 로 시작하는 글이 찍힐 수 있습니다. OpenCV 안쪽(C++)이 남기는 알림이고, 파이썬 쪽에서는 None 만 돌아옵니다. 1장에서 본 것과 같습니다.

주의할 점

  • 흑백 사진을 세 채널로 바꿔도 색이 생기지는 않습니다. 세 채널에 같은 밝기가 들어갈 뿐입니다. 색이 중요한 분류(빨간 사과와 초록 라임)라면 흑백 사진을 버리는 쪽이 나을 수도 있습니다. 이 장에서는 모양은 남아 있으므로 고쳐서 씁니다.
  • 투명 채널을 그냥 떼면, 투명했던 곳에 원래 저장돼 있던 색이 드러납니다. 투명한 곳이 넓은 그림(스티커, 아이콘)은 2장처럼 흰 바탕에 합성한 뒤 떼는 편이 안전합니다.
  • "64칸"은 이 장에서 정한 연습용 기준입니다. 모델에 넣을 크기(이 장은 128)의 절반보다 작으면 키우면서 크게 흐려지므로 버리기로 했습니다.
← 이전 절16장 · 데이터 정제란다음 절 →16장 · 너무 어둡거나 밝은 사진