프로젝트를 만들기 전에, 전체 그림을 먼저 그려야 합니다. 검출·정렬·인식·감정·라이브니스를 어떤 순서로 잇고, 각 단계를 어떻게 모듈로 나눌지 정하는 일입니다. 이 설계가 탄탄하면 이후 어떤 프로젝트(출입·모니터링·모자이크)든 같은 뼈대를 재사용할 수 있습니다.
전체 파이프라인
얼굴 시스템의 기본 흐름은 PART 02~09를 순서대로 이은 것입니다.
PART 02] B --> C[정렬
PART 03] C --> D{라이브니스
PART 09} D -->|가짜| X[거부] D -->|진짜| E[인식
PART 04~07] C --> F[감정·속성
PART 08] E --> G[결과 활용] F --> G
중요한 설계 결정 두 가지가 여기 담겨 있습니다. 첫째, 라이브니스를 인식 앞 게이트로 둡니다(PART 09). 가짜는 인식까지 가지 않습니다. 둘째, 감정·속성은 인식과 갈라지는 선택적 가지입니다. 필요한 프로젝트에서만 켭니다.
모듈 경계 — 갈아 끼울 수 있게
PART 04·05에서 강조했듯, 각 단계를 함수로 감싸 입력과 출력만 약속하면 내부 구현을 자유롭게 바꿀 수 있습니다. 시스템을 다음과 같은 모듈로 나눕니다.
| 모듈 | 입력 → 출력 | 구현 후보 |
|---|---|---|
detect(image) |
이미지 → 얼굴 박스·랜드마크 | YuNet, RetinaFace |
is_live(face) |
얼굴 → 진짜/가짜 | DeepFace anti_spoofing |
embed(face) |
얼굴 → 임베딩 | InsightFace, SFace |
identify(embedding) |
임베딩 → 이름 | faiss 검색 |
analyze(face) |
얼굴 → 감정·속성 | DeepFace, 블렌드셰이프 |
이렇게 경계를 정해 두면, "검출기를 YuNet에서 RetinaFace로", "인식을 SFace에서 InsightFace로" 바꿔도 나머지 코드는 그대로입니다. PART 06에서 본 "인자 하나로 백엔드 교체"를 시스템 전체 수준으로 끌어올린 것입니다.
공통 뼈대 코드
네 프로젝트가 공유할 뼈대를 함수로 정의합니다. 구체 구현은 앞 PART의 코드를 그대로 끼웁니다.
# 파일: pipeline.py"""검출→라이브니스→인식→감정의 공통 뼈대. 각 단계는 앞 PART 구현을 끼운다."""def process_face(image): faces = detect(image) # PART 02 results = [] for face in faces: if not is_live(face): # PART 09 게이트 results.append({"status": "spoof"}) continue name = identify(embed(face)) # PART 04~07 mood = analyze(face) # PART 08 (선택) results.append({"status": "ok", "name": name, "mood": mood}) return results
이 process_face 하나가 모든 프로젝트의 심장입니다. 출입 통제는 name을 보고 문을 열고, 모니터링은 mood를 집계하며, 모자이크는 identify를 빼고 박스만 씁니다. 같은 뼈대에서 필요한 가지만 켜는 것입니다.
성능과 책임의 설계
조립에는 두 가지를 함께 설계해야 합니다.
- 성능: 무거운 단계(고정밀 검출·인식)를 매 프레임 돌리지 말고, 추적(tracking)이나 프레임 건너뛰기로 예산을 배분합니다(PART 06·07).
- 책임: 무엇을 저장할지 처음부터 정합니다. 임베딩만 저장하고 원본 사진은 버리기, 감정은 개인이 아닌 집계로만 다루기(PART 08), 처리 사실을 고지하기. 설계 단계에서 정한 원칙이 나중에 윤리 문제(PART 11)를 예방합니다.
실무 팁. 파이프라인을 처음부터 완벽하게 만들려 하지 마세요. 먼저
detect와identify만으로 최소 동작을 만들고, 그 위에 라이브니스·감정을 하나씩 얹는 점진적 방식이 안전합니다. 각 단계를 함수로 분리해 두었으니, 빈 함수(항상 통과)로 시작해 점차 진짜 구현으로 채워 갈 수 있습니다.
이 장에서 기억할 것
얼굴 시스템은 검출→정렬→라이브니스(게이트)→인식→감정의 흐름으로 설계하며, 각 단계를 detect·is_live·embed·identify·analyze 같은 함수로 감싸 갈아 끼울 수 있게 만듭니다. 공통 뼈대 process_face 하나로 네 프로젝트를 모두 떠받치고, 필요한 가지만 켭니다. 성능(예산 배분)과 책임(저장 최소화·집계·고지)을 설계 단계에서 함께 정합니다. 다음 장부터 이 뼈대로 실제 프로젝트를 만듭니다. 첫 번째는 FastAPI 출입 통제 시스템입니다.