dlib의 68점 랜드마크 검출기는 고전 컴퓨터 비전에서 사실상의 표준입니다. 점마다 번호가 정해져 있어 "왼쪽 눈은 36~41번"처럼 부위를 정확히 집어낼 수 있고, 자료도 가장 풍부합니다. 이 장에서는 PART 02에서 찾은 얼굴 영역 안에 68개의 점을 찍고, 그 번호 체계를 익힙니다.
shape predictor와 모델 파일
dlib에서 랜드마크를 담당하는 도구는 shape predictor입니다. 검출기가 찾아 준 얼굴 사각형을 입력으로 받아, 그 안에서 68개 점의 위치를 예측합니다. 이때 미리 학습된 모델 파일 shape_predictor_68_face_landmarks.dat이 필요합니다. dlib 공식 저장소(http://dlib.net/files/)에서 shape_predictor_68_face_landmarks.dat.bz2를 내려받아 압축을 풀고 작업 폴더에 둡니다.
여기서 중요한 전제가 있습니다. shape predictor는 스스로 얼굴을 찾지 못합니다. 반드시 검출기가 준 얼굴 사각형이 함께 있어야 동작합니다. 그래서 코드는 "검출 → 랜드마크"의 두 단계로 짜입니다.
68점 검출 코드
다음 내용을 dlib68.py로 저장합니다.
# 파일: dlib68.py"""dlib 68점 랜드마크를 검출해 점과 번호를 그린다."""import cv2import dlibdetector = dlib.get_frontal_face_detector() # 얼굴 검출(PART 02)predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") # 랜드마크img = cv2.imread("sample.jpg")gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)for rect in detector(gray, 1): # 얼굴 사각형마다 shape = predictor(gray, rect) # 그 안에서 68점 예측 for i in range(68): x, y = shape.part(i).x, shape.part(i).y # 점은 픽셀 좌표 cv2.circle(img, (x, y), 2, (0, 255, 0), -1)cv2.imwrite("dlib68_result.jpg", img)

코드의 흐름이 1장에서 본 그림과 정확히 일치합니다. detector(gray, 1)로 얼굴 사각형을 얻고, 그 사각형 rect를 predictor(gray, rect)에 넘겨 68점 shape를 받습니다. 각 점은 shape.part(i)로 접근하며 .x, .y가 곧 픽셀 좌표입니다(MediaPipe와 달리 비율 환산이 필요 없습니다).
68개 점의 번호 체계
68점의 진짜 강점은 번호가 부위별로 정해져 있다는 점입니다. 이 표만 알아 두면 원하는 부위만 골라 쓸 수 있습니다.
| 번호 | 부위 |
|---|---|
| 0 ~ 16 | 턱선(얼굴 윤곽) |
| 17 ~ 21 | 왼쪽 눈썹 |
| 22 ~ 26 | 오른쪽 눈썹 |
| 27 ~ 35 | 콧대와 콧방울 |
| 36 ~ 41 | 왼쪽 눈 |
| 42 ~ 47 | 오른쪽 눈 |
| 48 ~ 67 | 입술(바깥·안쪽) |
예를 들어 두 눈만으로 정렬을 하고 싶으면 36~41번과 42~47번의 평균을 두 눈 중심으로 쓰고, 졸음을 감지하려면 눈 부위 6점으로 눈의 벌어진 정도를 계산합니다(5장에서 다룹니다). 부위별 번호를 외울 필요는 없고, 이 표를 그때그때 참고하면 됩니다.
실무 팁. 점을 일일이
range(68)로 돌리는 대신, 자주 쓰는 부위를 슬라이스로 묶어 두면 편합니다. 예컨대LEFT_EYE = list(range(36, 42))처럼 정의해 두면 코드가 읽기 쉬워지고 실수도 줄어듭니다. 68점은 번호가 고정이라 이런 상수 정의가 안전하게 통합니다.
5점 모델이라는 가벼운 선택
정렬만 빠르게 하고 싶다면 68점은 과합니다. dlib은 더 가벼운 shape_predictor_5_face_landmarks.dat(5점)도 제공합니다. 두 눈과 코 부근 5점만 주므로 정렬 전용으로 빠르고, 사용법은 모델 파일 이름만 바꾸면 동일합니다. 표정이나 자세까지 보려면 68점, 정렬만 필요하면 5점으로 고르세요.
이 장에서 기억할 것
dlib 68점 검출은 "검출기로 얼굴 사각형을 얻고 → shape predictor로 그 안에서 68점을 예측"하는 두 단계이며, 점은 픽셀 좌표로 바로 나옵니다. 68개 점은 턱·눈썹·눈·코·입으로 번호가 고정되어 있어 부위별로 다루기 쉽고, 정렬만 필요하면 5점 모델로 가볍게 갈 수 있습니다. 다음 장에서는 훨씬 촘촘한 468점을 실시간으로 주는 MediaPipe FaceLandmarker를 만납니다.