19장. Vision 데이터 파이프라인
파이프라인이란
택배 분류 센터에서는 상자가 컨베이어를 타고 흘러갑니다. 첫 칸에서 송장을 읽고, 둘째 칸에서 찌그러진 상자를 빼고, 셋째 칸에서 다시 포장하고, 넷째 칸에서 지역을 나누고, 마지막 칸에서 몇 개가 나갔는지 셉니다. 칸마다 받는 것과 내보내는 것이 정해져 있어서, 한 칸의 일꾼이 바뀌어도 라인은 그대로 돌아갑니다.
그림의 다섯 상자를 왼쪽에서 오른쪽으로 읽습니다. 1장에서는 모으기, 거르기, 다듬기, 늘리기, 알아보기의 다섯 단계를 보았습니다. 늘리기(증강)는 학습할 때만 하는 일이라, 학습이 끝난 모델로 새 그림을 검사하는 이 장에서는 빼고, 끝에 "보고" 단계를 붙였습니다. 여기서 송장 읽기가 수집, 찌그러진 상자 빼기가 거르기, 다시 포장하기가 다듬기, 지역 나누기가 추론, 출고 개수 세기가 보고입니다. 비유와 다른 점도 있습니다. 택배 라인은 상자 여러 개가 동시에 여러 칸에 있지만, 이 장의 파이프라인은 한 단계가 그림 전부를 처리한 뒤 다음 단계로 넘깁니다.
단계마다 받는 것과 내보내는 것
| 단계 | 받는 것 | 내보내는 것 | 쓰는 앞 장 |
|---|---|---|---|
| 수집 | 폴더 이름, 동영상 이름 | 그림 항목 목록(파일 이름, 출처) | 15장, 17장 |
| 거르기 | 그림 항목 목록 | 통과한 항목(그림 배열 포함), 탈락 기록 | 16장, 17장 |
| 다듬기 | 통과한 항목 | 320×240 으로 맞춘 그림, 손질 기록 | 5장, 6장, 14장 |
| 추론 | 다듬은 그림 | 물체 표(한 행 = 물체 하나) | 18장 |
| 보고 | 물체 표, 기록 | 상자 그림 격자, 클래스별 개수, 깔때기 표 | 17장, 18장 |
짧은 예시
# 파이프라인을 (단계 이름, 받는 것, 내보내는 것) 목록으로 적어 두고 차례로 찍는다
pipeline = [
("수집", "폴더 이름", "그림 항목 목록"),
("거르기", "그림 항목 목록", "통과한 항목"),
("다듬기", "통과한 항목", "맞춘 그림"),
("추론", "맞춘 그림", "물체 표"),
("보고", "물체 표", "그림과 표"),
]
for no, (stage, given, made) in enumerate(pipeline, start=1):
print(f"{no}. {stage}: {given} → {made}")
# 앞 단계가 내보낸 것과 다음 단계가 받는 것이 같은지 확인한다
for (a, _, made), (b, given, _) in zip(pipeline, pipeline[1:]):
print(a, "→", b, "이어짐" if made == given else "끊김")
# 결과: 수집 → 거르기 이어짐 ... 추론 → 보고 이어짐 (넷 모두 이어짐)zip(pipeline, pipeline[1:]) 은 목록을 한 칸 밀어 짝지어서 (첫째, 둘째), (둘째, 셋째) 처럼 이웃한 두 단계를 꺼냅니다. 앞 단계의 출력과 다음 단계의 입력이 같아야 라인이 이어집니다.
주의할 점
- 파이프라인은 앞 단계의 실수를 뒤로 그대로 넘깁니다. 깨진 그림을 거르기에서 놓치면 추론 단계에서 오류가 나거나 엉뚱한 상자가 나옵니다. 앞쪽 단계일수록 꼼꼼히 만듭니다.
- 한 번에 다섯 단계를 다 짜지 않습니다. 단계 하나를 만들고 결과를 확인한 뒤 다음 단계를 붙입니다(실습 1부터 실습 4까지가 이 순서입니다).