19장. Vision 데이터 파이프라인
거르기 단계
공항 보안 검색대는 짐을 여러 관문에 차례로 통과시킵니다. 먼저 표가 있는지 보고, 다음에 엑스레이로 보고, 수상하면 손으로 엽니다. 앞 관문에서 걸리면 뒤 관문까지 갈 필요가 없습니다. 거르기 단계도 빠르고 단순한 검사부터 차례로 하고, 걸리면 그 자리에서 탈락시킵니다.
그림의 네 관문은 16장에서 만든 검사를 파이프라인 순서로 놓은 것입니다. 파일이 비었거나 열리지 않으면 바로 빼고, 평균 밝기가 너무 낮으면 빼고, 16장에서 본 흐림 점수(Laplacian 분산)가 작으면 빼고, MD5 와 평균 해시로 앞에서 이미 통과한 그림과 같으면 뺍니다. 여기서 표 확인이 읽어 보기, 엑스레이가 밝기·흐림 재기, 손으로 열어 보는 일이 그림끼리 견주는 중복 찾기입니다. 중복 찾기를 맨 뒤에 두는 까닭은, 그림끼리 견주는 일이라 그림 수가 많을수록 오래 걸리기 때문입니다.
입고 폴더에 섞어 둔 문제 그림입니다. 위 줄의 belt_011.png 는 평균 밝기 21.7 로 거의 검고, belt_013.png 는 흐림 점수 0.9 로 크게 흐립니다. 아래 줄의 belt_021.png 는 belt_003.png 를 이름만 바꾼 복사본이고, belt_022.jpg 는 belt_010.png 를 조금 밝게 해서 jpg 로 다시 저장한 것입니다. belt_004.png(어두움), belt_008.jpg(노이즈), belt_016.png(640×480)는 버리지 않고 다음 단계에서 고칩니다.
이 장의 기준값은 16차시의 값과 다르다
| 검사 | 16차시(과일 사진) | 이 장(부품 그림) | 까닭 |
|---|---|---|---|
| 아주 어두움 | 평균 밝기 40 미만 | 30 미만 | 벨트가 짙은 회녹색이라 정상 그림도 평균 63~81 이다 |
| 흐림 | 흐림 점수 100 미만 | 30 미만 | 바탕 무늬가 적어 정상 그림도 64~275 로 나온다 |
| 중복(평균 해시) | 해밍 거리 5 이하 | 2 이하 | 바탕이 같아 서로 다른 그림도 거리가 4 까지 가깝다 |
16장의 주의할 점에서 "점수는 이 묶음 안에서 견줄 때 뜻이 있다", "배경이 비슷한 사진이 많으면 다른 사진도 거리가 작게 나올 수 있다"고 했습니다. 이 장의 부품 그림이 바로 그런 묶음입니다. 기준값을 데이터에 맞춰 다시 정한 까닭을 다음 짧은 예시로 확인합니다.
짧은 예시
import cv2
def blur_score(img):
"""16차시의 흐림 점수: 흑백 Laplacian 의 분산. 클수록 선명하다."""
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
return float(cv2.Laplacian(gray, cv2.CV_64F).var())
for name in ["belt_001.png", "belt_010.png", "belt_016.png", "belt_011.png", "belt_013.png"]:
img = cv2.imread(f"ch19_incoming/{name}")
mean = round(float(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY).mean()), 1)
print(name, "밝기", mean, "흐림 점수", round(blur_score(img), 1))
# 결과: belt_001.png 밝기 69.6 흐림 점수 95.1
# belt_010.png 밝기 63.3 흐림 점수 73.9
# belt_016.png 밝기 70.9 흐림 점수 63.8
# belt_011.png 밝기 21.7 흐림 점수 17.3
# belt_013.png 밝기 75.0 흐림 점수 0.9위의 세 장은 문제가 없는 그림인데도 흐림 점수가 100 보다 작습니다. 16장의 기준 100 을 그대로 쓰면 멀쩡한 그림을 버립니다. 반면 흐린 belt_013.png 는 0.9 라, 30 으로 낮춰도 넉넉히 걸립니다.
주의할 점
- 거르기 단계는 그림을 고치지 않습니다. 조금 어두운 그림이나 노이즈 낀 그림은 "통과"로 넘기고, 고치는 일은 다듬기 단계가 맡습니다.
- 중복은 "먼저 통과한 그림"과 견줍니다. 이름순으로 돌면
belt_003.png가 남고 뒤에 오는belt_021.png가 빠집니다. 어느 쪽을 남길지 규칙을 정해 두어야 다시 돌려도 같은 그림이 남습니다. - 깨진 파일을 읽을 때 터미널에
[ WARN:0@...]같은 글이 찍힐 수 있습니다. OpenCV 안쪽의 알림이라 프로그램은 멈추지 않고, 원고의 출력에는 나오지 않습니다.