PART 01에서 빌드 지옥을 감수하면서까지 conda로 설치한 dlib이, 드디어 제 역할을 합니다. dlib의 기본 얼굴 검출기는 HOG와 SVM이라는 두 고전 기법을 결합한 것으로, Haar Cascade보다 정면 얼굴을 더 안정적으로 잡고 오검출도 적습니다. 딥러닝만큼 무겁지 않으면서 고전치고는 꽤 견고한, 중간 지대의 검출기입니다.
HOG와 SVM, 두 단어 풀어 보기
이름이 어렵지만 두 단어를 나눠 보면 어렵지 않습니다.
- HOG(Histogram of Oriented Gradients, 방향 기울기 히스토그램)는 이미지의 밝기가 어느 방향으로 변하는지를 작은 칸마다 모아 정리한 것입니다. 얼굴은 눈·코·입 경계에서 밝기가 특정 방향으로 변하는 고유한 무늬를 만드는데, HOG는 이 무늬를 숫자로 요약합니다.
- SVM(Support Vector Machine, 서포트 벡터 머신)은 "이 HOG 무늬가 얼굴인가 아닌가"를 가르는 분류기입니다. 미리 수많은 얼굴과 비얼굴 무늬를 학습해, 둘을 가르는 경계선을 그어 둡니다.
정리하면 dlib 검출기는 이미지에서 HOG 무늬를 뽑아 SVM으로 얼굴 여부를 판정하는 방식입니다. Haar가 명암 패턴을 봤다면, HOG는 밝기 변화의 방향을 본다는 점이 다릅니다. 이 방향 정보 덕분에 조명 변화에 조금 더 강합니다.
코드로 검출하기
dlib 검출기는 사용법이 놀라울 만큼 간단합니다. 다음 내용을 hog_detect.py로 저장합니다.
# 파일: hog_detect.py"""dlib HOG + SVM 검출기로 얼굴을 찾아 사각형을 그린다."""import cv2import dlib# dlib 기본 정면 얼굴 검출기(HOG + SVM)detector = dlib.get_frontal_face_detector()img = cv2.imread("sample.jpg")# dlib은 RGB 순서를 기대하므로 OpenCV의 BGR을 변환한다rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 두 번째 인자 1은 업샘플 횟수: 이미지를 키워 작은 얼굴까지 찾는다faces = detector(rgb, 1)for d in faces: # dlib은 좌상단·우하단 좌표를 제공한다 cv2.rectangle(img, (d.left(), d.top()), (d.right(), d.bottom()), (0, 255, 0), 2)print(f"검출된 얼굴: {len(faces)}개")cv2.imwrite("hog_result.jpg", img)

여기서 두 가지 디테일을 짚어 둡니다. 첫째, dlib은 색 순서를 RGB로 기대하므로 OpenCV가 읽어 온 BGR 이미지를 변환해 넘깁니다. 둘째, dlib이 돌려주는 사각형은 .left(), .top(), .right(), .bottom()처럼 좌상단·우하단 좌표를 메서드로 제공합니다. 앞 장의 Haar가 (x, y, w, h)였던 것과 표기 방식이 다른데, 그래서 1장에서 두 표기법을 미리 익혀 둔 것입니다.
업샘플 횟수의 역할
detector(rgb, 1)의 두 번째 인자는 업샘플(upsample) 횟수입니다. 이미지를 그 횟수만큼 키운 뒤 검출하므로, 값을 올리면 멀리 있는 작은 얼굴까지 잡을 수 있습니다. 다만 이미지가 커지는 만큼 검출 시간도 늘어납니다. 보통 0이나 1을 쓰고, 단체 사진처럼 작은 얼굴이 많을 때만 2로 올립니다.
| 업샘플 값 | 효과 | 속도 |
|---|---|---|
| 0 | 큰 얼굴 위주, 가장 빠름 | 빠름 |
| 1 | 일반적인 균형 (권장) | 보통 |
| 2 | 작은 얼굴까지, 단체 사진용 | 느림 |
Haar와 비교하면
dlib HOG는 Haar Cascade보다 정면 얼굴 검출이 더 정확하고 오검출이 적습니다. 대신 약점도 공유합니다. 둘 다 정면에 최적화되어 있어, 옆얼굴이나 크게 기울어진 얼굴에는 여전히 약합니다. 속도는 Haar가 조금 더 빠른 편입니다.
실무 팁. dlib 검출기에는 HOG 방식 말고 CNN(딥러닝) 방식도 있습니다.
dlib.cnn_face_detection_model_v1을 쓰면 옆얼굴까지 훨씬 잘 잡지만, GPU 없이는 매우 느립니다. CPU 환경에서 정면 위주라면 HOG, GPU가 있고 다양한 각도를 잡아야 하면 CNN을 고려하세요. 다만 각도와 정확도가 중요하다면 다음 장들의 딥러닝 검출기가 더 나은 선택인 경우가 많습니다.
이 장에서 기억할 것
dlib의 기본 검출기는 밝기 변화의 방향을 요약한 HOG 무늬를 SVM으로 분류하는 고전 기법으로, dlib.get_frontal_face_detector() 한 줄로 불러 쓰고 업샘플 횟수로 작은 얼굴 대응을 조절합니다. Haar보다 정확하지만 여전히 정면에 강하다는 고전의 한계는 공유합니다. 다음 장부터는 이 한계를 본격적으로 넘어서는 딥러닝 검출기들로 들어갑니다. 그 첫 주자는 OpenCV에 내장된 DNN과 YuNet입니다.