17장. Batch Processing 과 YOLO 데이터 준비
일괄 처리란
빨래 바구니에 옷이 서른 벌 있다고 해 봅시다. 한 벌씩 손으로 빨면 옷마다 비누 양도, 헹군 횟수도 조금씩 달라집니다. 세탁기는 코스 하나를 정해 두면 서른 벌을 똑같이 빱니다. 일괄 처리는 사진의 세탁기입니다. 사진 한 장을 어떻게 손질할지 함수 하나로 정해 두고, 폴더의 사진 모두에 그 함수를 돌립니다.
그림의 네 단계가 일괄 처리 프로그램의 뼈대입니다. 둘째 단계의 "한 장 처리" 함수가 세탁 코스이고, 첫째 단계의 파일 목록이 빨래 바구니입니다. 셋째와 넷째 단계는 세탁기의 표시창처럼 무엇이 끝났고 무엇이 안 됐는지 알려 줍니다. 비유와 다른 점도 있습니다. 세탁기는 옷을 한꺼번에 돌리지만, 프로그램은 사진을 빠르게 한 장씩 차례로 처리합니다.
손으로 하기와 일괄 처리
| 견줄 것 | 한 장씩 손으로 | 일괄 처리 |
|---|---|---|
| 걸리는 시간 | 사진 수만큼 늘어난다 | 사람 손은 처음 한 번만 든다 |
| 같은 기준 | 사람이 지치면 달라진다 | 함수가 같으면 언제나 같다 |
| 다시 하기 | 처음부터 다시 손으로 | 같은 프로그램을 한 번 더 돌린다 |
| 무엇을 했는지 | 기억에 기댄다 | 기록(로그)이 남는다 |
짧은 예시
한 장을 처리하는 함수를 먼저 만들고, 그 함수를 파일 목록에 돌립니다. 함수를 먼저 한 장에 시험해 보는 것이 순서입니다.
from pathlib import Path
import cv2
def mean_brightness(path):
"""그림 한 장의 평균 밝기를 돌려준다(한 장 처리 함수)."""
img = cv2.imread(str(path), cv2.IMREAD_GRAYSCALE)
return round(float(img.mean()), 1)
# 먼저 한 장에 시험한다
print(mean_brightness("ch17_raw/part_001.png"))
# 잘 되면 폴더의 앞 세 장에 똑같이 돌린다
for path in sorted(Path("ch17_raw").glob("*.png"))[:3]:
print(path.name, mean_brightness(path))cv2.imread 에 str(path) 처럼 글자로 바꿔 넘기면 OpenCV 판에 상관없이 안전합니다. Path 는 다음 절에서 자세히 봅니다.
주의할 점
- 한 장 처리 함수를 폴더 전체에 돌리기 전에, 한두 장에 먼저 시험합니다. 함수에 실수가 있으면 결과 수백 장이 모두 틀립니다.
- 일괄 처리는 결과를 새 폴더에 따로 씁니다. 원본을 덮어쓰면 실수했을 때 되돌릴 수 없습니다.