OpenCV 비전 실무19장 · Vision 데이터 파이프라인6 / 21← 이전목차다음 →MetaContents

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장의 주의할 점에서 "점수는 이 묶음 안에서 견줄 때 뜻이 있다", "배경이 비슷한 사진이 많으면 다른 사진도 거리가 작게 나올 수 있다"고 했습니다. 이 장의 부품 그림이 바로 그런 묶음입니다. 기준값을 데이터에 맞춰 다시 정한 까닭을 다음 짧은 예시로 확인합니다.

짧은 예시

Python
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 안쪽의 알림이라 프로그램은 멈추지 않고, 원고의 출력에는 나오지 않습니다.
← 이전 절19장 · 수집 단계다음 절 →19장 · 다듬기 단계