지금까지의 검출기들은 속도와 편의에 무게를 두었습니다. 이번 장의 RetinaFace와 MTCNN은 방향이 다릅니다. 조금 느리더라도 옆얼굴, 작은 얼굴, 가려진 얼굴까지 끝까지 잡아내는 고정밀 검출기입니다. 정확도가 생명인 출입 통제나 대규모 얼굴 검색의 앞단에 주로 쓰입니다.
MTCNN — 단계적으로 정밀해지는 검출
MTCNN(Multi-task Cascaded Convolutional Networks)은 세 개의 작은 신경망을 단계로 연결한 검출기입니다. 1단계에서 얼굴 후보를 잔뜩 뽑고, 2단계에서 가짜 후보를 걸러 내고, 3단계에서 박스를 정교하게 다듬으며 눈·코·입 5개 랜드마크까지 찾아 줍니다. Haar의 캐스케이드 아이디어를 딥러닝으로 옮긴 셈인데, 단계마다 점점 정밀해지기 때문에 정확도가 높습니다.
mtcnn 패키지로 설치하며, 사용법은 간단합니다.
# 파일: mtcnn_detect.py"""MTCNN으로 얼굴과 5개 랜드마크를 검출한다."""import cv2from mtcnn import MTCNNdetector = MTCNN()img = cv2.imread("sample.jpg")rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # MTCNN은 RGB 입력# 결과: [{"box":[x,y,w,h], "confidence":0.99, "keypoints":{...}}, ...]results = detector.detect_faces(rgb)for r in results: x, y, w, h = r["box"] cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) for name, (px, py) in r["keypoints"].items(): cv2.circle(img, (px, py), 2, (0, 0, 255), 2) cv2.putText(img, f"{r['confidence']:.2f}", (x, y - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1, cv2.LINE_AA)cv2.imwrite("mtcnn_result.jpg", img)
detect_faces는 검출마다 박스 (x, y, w, h), 신뢰도, 그리고 keypoints라는 딕셔너리(왼눈·오른눈·코·왼입꼬리·오른입꼬리)를 돌려줍니다. 박스와 랜드마크를 함께 주는 점이 다음 PART의 정렬 작업에 유용합니다.
RetinaFace — 가장 견고한 검출
RetinaFace는 현재 가장 정확한 얼굴 검출기 중 하나로 꼽힙니다. 작고 흐릿한 얼굴, 심하게 기울거나 일부 가려진 얼굴까지 잘 잡아내며, 5개 랜드마크도 함께 제공합니다. 파이썬에서는 retina-face 패키지로 가장 쉽게 쓸 수 있습니다.
# 파일: retinaface_detect.py"""RetinaFace로 고정밀 얼굴 검출."""import cv2from retinaface import RetinaFace# 이미지 경로를 넘기면 얼굴별 정보를 딕셔너리로 돌려준다faces = RetinaFace.detect_faces("sample.jpg")img = cv2.imread("sample.jpg")# faces = {"face_1": {"score":..., "facial_area":[x1,y1,x2,y2], "landmarks":{...}}, ...}for key, info in faces.items(): x1, y1, x2, y2 = info["facial_area"] cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) for name, (px, py) in info["landmarks"].items(): cv2.circle(img, (int(px), int(py)), 2, (0, 0, 255), 2) cv2.putText(img, f"{info['score']:.2f}", (x1, y1 - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1, cv2.LINE_AA)cv2.imwrite("retinaface_result.jpg", img)

RetinaFace는 박스를 facial_area라는 키에 (x1, y1, x2, y2) 형태로 담아 줍니다. MTCNN과 출력 모양이 다르므로, 여러 검출기를 섞어 쓸 때는 1장에서 익힌 좌표 변환으로 형식을 통일하면 편합니다.
정확도의 대가는 속도
이 두 검출기는 정확도가 높은 대신 느립니다. 특히 GPU 없이 CPU만으로 돌리면 한 장에 수백 밀리초가 걸려, 실시간 웹캠 처리에는 버겁습니다. 그래서 쓰임새가 갈립니다.
| 검출기 | 강점 | 약점 | 어울리는 곳 |
|---|---|---|---|
| MTCNN | 정확, 랜드마크 제공 | 느림, 큰 이미지에서 더 느림 | 사진 일괄 처리, 등록 단계 |
| RetinaFace | 최고 수준 정확도, 견고함 | 가장 느림(특히 CPU) | 정확도 최우선 작업 |
실무 팁. 고정밀 검출기는 "모든 프레임"이 아니라 "중요한 한 장"에 쓰는 것이 정석입니다. 예를 들어 출입 시스템이라면, 실시간 미리보기는 빠른 MediaPipe로 보여 주다가, 사용자가 게이트 앞에 멈춰 인증하는 결정적 순간에만 RetinaFace로 정확하게 한 번 검출하는 식으로 역할을 나눕니다. 속도와 정확도를 모두 잡는 현실적인 설계입니다.
이 장에서 기억할 것
MTCNN은 세 단계 신경망을 거치며 점점 정밀해지는 검출기이고, RetinaFace는 가장 견고한 고정밀 검출기로, 둘 다 박스와 5개 랜드마크를 함께 제공합니다. 출력 형식은 MTCNN이 (x, y, w, h), RetinaFace가 facial_area의 (x1, y1, x2, y2)로 서로 다릅니다. 정확도가 높은 만큼 느리므로, 실시간에는 빠른 검출기를, 결정적 순간에는 고정밀 검출기를 쓰는 분업이 현실적입니다. 다음 장에서는 속도와 정확도의 균형으로 요즘 큰 인기를 끄는 YOLO 계열 얼굴 검출을 다룹니다.