19장. Vision 데이터 파이프라인
설정을 한곳에
에어컨 리모컨을 떠올려 봅시다. 온도, 바람 세기, 꺼짐 예약을 리모컨 한 곳에서 바꿉니다. 온도를 바꾸려고 에어컨 뚜껑을 열고 안쪽 부품을 만지지 않습니다. 파이프라인의 기준값도 코드 곳곳에 숫자로 박아 두지 않고 사전 하나(CONFIG)에 모아 리모컨처럼 씁니다.
왼쪽 카드처럼 30, 50, 0.7 같은 숫자를 함수 안 곳곳에 직접 쓰는 것을 하드코딩이라고 합니다. 흐림 기준을 바꾸려면 코드를 뒤져 숫자를 찾아야 하고, 한 곳을 빠뜨리기 쉽습니다. 오른쪽 카드처럼 CONFIG 에 이름을 붙여 모아 두면 config["blur_min"] 처럼 꺼내 쓰고, 바꿀 때는 CONFIG 한 줄만 고칩니다. 여기서 리모컨이 CONFIG, 에어컨 안쪽 부품이 단계 함수입니다.
이 장의 CONFIG
| 열쇠 | 값 | 쓰는 단계 | 뜻 |
|---|---|---|---|
exts | [".png", ".jpg", ".jpeg"] | 수집 | 그림으로 볼 확장자 |
min_side | 64 | 거르기 | 짧은 변이 이보다 작으면 탈락(16장) |
dark_drop | 30 | 거르기 | 평균 밝기가 이보다 작으면 탈락 |
blur_min | 30 | 거르기 | 흐림 점수가 이보다 작으면 탈락 |
hash_max | 2 | 거르기 | 평균 해시 거리가 이 이하면 중복 |
size | [320, 240] | 다듬기 | 맞출 가로, 세로(18장 학습 크기) |
dark_fix, gamma | 50, 0.7 | 다듬기 | 평균 밝기가 50 미만이면 감마 0.7 |
noise_max, denoise_ksize | 3.0, 5 | 다듬기 | 잡음 점수가 3 초과면 5×5 가우시안 블러 |
conf | 0.25 | 추론 | 신뢰도가 이보다 낮은 상자는 버림 |
iou_hit | 0.5 | 채점 | IoU 가 이 이상이면 맞힘(18장) |
every | 4 | 수집(동영상) | 몇 장마다 한 장을 뽑을지 |
seed | 19 | 보고 | 확인 격자에 넣을 그림을 고르는 씨앗 |
짧은 예시
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"])로 바꿉니다.