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

19장. Vision 데이터 파이프라인

설정을 한곳에

에어컨 리모컨을 떠올려 봅시다. 온도, 바람 세기, 꺼짐 예약을 리모컨 한 곳에서 바꿉니다. 온도를 바꾸려고 에어컨 뚜껑을 열고 안쪽 부품을 만지지 않습니다. 파이프라인의 기준값도 코드 곳곳에 숫자로 박아 두지 않고 사전 하나(CONFIG)에 모아 리모컨처럼 씁니다.

코드 곳곳에 흩어진 숫자와 사전 하나에 모은 CONFIG 를 견준 비교 그림

왼쪽 카드처럼 30, 50, 0.7 같은 숫자를 함수 안 곳곳에 직접 쓰는 것을 하드코딩이라고 합니다. 흐림 기준을 바꾸려면 코드를 뒤져 숫자를 찾아야 하고, 한 곳을 빠뜨리기 쉽습니다. 오른쪽 카드처럼 CONFIG 에 이름을 붙여 모아 두면 config["blur_min"] 처럼 꺼내 쓰고, 바꿀 때는 CONFIG 한 줄만 고칩니다. 여기서 리모컨이 CONFIG, 에어컨 안쪽 부품이 단계 함수입니다.

이 장의 CONFIG

열쇠값쓰는 단계뜻
exts[".png", ".jpg", ".jpeg"]수집그림으로 볼 확장자
min_side64거르기짧은 변이 이보다 작으면 탈락(16장)
dark_drop30거르기평균 밝기가 이보다 작으면 탈락
blur_min30거르기흐림 점수가 이보다 작으면 탈락
hash_max2거르기평균 해시 거리가 이 이하면 중복
size[320, 240]다듬기맞출 가로, 세로(18장 학습 크기)
dark_fix, gamma50, 0.7다듬기평균 밝기가 50 미만이면 감마 0.7
noise_max, denoise_ksize3.0, 5다듬기잡음 점수가 3 초과면 5×5 가우시안 블러
conf0.25추론신뢰도가 이보다 낮은 상자는 버림
iou_hit0.5채점IoU 가 이 이상이면 맞힘(18장)
every4수집(동영상)몇 장마다 한 장을 뽑을지
seed19보고확인 격자에 넣을 그림을 고르는 씨앗

짧은 예시

Python
import json

CONFIG = {"dark_drop": 30, "blur_min": 30, "hash_max": 2, "size": [320, 240], "gamma": 0.7}

# 기준만 바꾼 새 설정: ** 로 원래 사전을 펼친 뒤 바꿀 열쇠만 다시 적는다
strict = {**CONFIG, "blur_min": 100}
print(CONFIG["blur_min"], strict["blur_min"])     # 결과: 30 100

# 흐림 점수 몇 개로 두 설정을 견준다(앞 절에서 잰 정상 그림 셋과 흐린 그림 하나)
scores = {"belt_001.png": 95.1, "belt_010.png": 73.9, "belt_016.png": 63.8, "belt_013.png": 0.9}
for cfg_name, cfg in [("CONFIG", CONFIG), ("strict", strict)]:
    dropped = [n for n, s in scores.items() if s < cfg["blur_min"]]
    print(cfg_name, "탈락:", dropped)
# 결과: CONFIG 탈락: ['belt_013.png']
#       strict 탈락: ['belt_001.png', 'belt_010.png', 'belt_016.png', 'belt_013.png']

# 설정을 JSON 글자로: 결과와 함께 저장해 두면 어떤 기준으로 돌렸는지 남는다
print(json.dumps(CONFIG, ensure_ascii=False))

json.dumps 는 dump string(글자로 쏟아 내기)의 줄임으로, 사전을 JSON 글자로 바꿉니다. ensure_ascii=False 는 한글을 안 같은 부호로 바꾸지 않고 그대로 적으라는 뜻입니다. 파일로 저장할 때는 json.dump(CONFIG, f, ensure_ascii=False, indent=2) 를 씁니다(프로젝트).

주의할 점

  • CONFIG 의 값은 단계 함수가 인자로 받아 씁니다(def filter_stage(items, config)). 함수 안에서 바깥의 CONFIG 를 몰래 읽으면, 설정 두 벌을 견주기 어렵습니다.
  • JSON 은 튜플을 목록으로 바꿔 저장하므로, 크기는 처음부터 [320, 240] 처럼 목록으로 두고 cv2.resize 에 넣을 때 tuple(config["size"]) 로 바꿉니다.
← 이전 절19장 · 결과 시각화와 보고다음 절 →19장 · 기록과 재현