본문 바로가기
A.I./OpenCV

dlib을 이용한 얼굴 탐색(face detection)

by 채소장사 2020. 7. 1.

▶ dlib 공식 사이트 : Dlib C++ Library

▶ dlib 파이썬 얼굴 탐색 공식 예제 :

    face_detector.py , cnn_face_detector.py 

 

▷ 참고하여 구현한 dlib 얼굴 탐색 예제 : dlib을 이용한 얼굴 탐색 등의 연산

    [정지 이미지] face_detector_from_images.py

    [웹캠 스트리밍] face_detector_from_webcam

    [CNN 모델사용] face_detector_using_CNN


이미지 처리, 선형대수 뿐만 아니라 다양한 머신러닝 알고리즘을 활용할 수 있는 dlib 라이브러리는 C++로 작성된 툴킷이지만, python 패키지로도 설치해 사용할 수 있다. 특히 HOG(Histogram of Oriented Gradients) 특성을 사용하여 얼굴 검출하는 기능이 많이 사용되고 소개된다.

 여기서는 공식예제 중에서 얼굴 탐색에 활용된 함수를 중심으로 설명하여, dlib 라이브러리의 사용방법과 참고할 내용을 밝힌다.


dlib 라이브러리에서는 얼굴 탐색을 위해 HOG특성을 활용하거나 또는 대신 학습된 CNN모델을 사용할 수 있다.

HOG는 픽셀값의 변화로 파악할 수 있는 영상 밝기 변화의 방향을 그래디언트(gradient)로 표현하고, 이로부터 객체의 형태를 찾아낼 수 있다. 얼굴 탐색 이외에도 보행자 검출 등에 활용할 수 있다.

 

dlib의 얼굴 탐색은 기본적으로 HOG 특성을 활용하므로 dlib.get_frontal_face_detector( )를 사용하면 기본 얼굴 검출기를 쓸 수 있다. 기본 얼굴탐색 객체는 사실 만들어진 이미지 피라미드(image pyramid)의 이미지들을 슬라이딩 윈도 방식(sliding window) 방식으로 탐색할 때, HOG특성을 사용한 뒤 그 결과를 분류하는 선형 분류기(linear classifier)를 이용하는 방식으로 구현되어 있다.

 

기본 얼굴탐색 객체를 사용한 얼굴 탐색이나 CNN 모델을 사용한 탐색 모두, dlib 라이브러리에서 제공하는 함수만으로도 쉽게 실행이 가능하다. 따라서 기존에 dlib 활용 예제를 소개한 블로그나 유투브 글들이 dlib에 내장된 GUI 윈도인 image_window를 사용하거나 OpenCV의 cv2.imshow()를 사용하는 정도의 차이만 있을 뿐 큰 차이가 없다. 

그런데 사실 이제는 dlib 라이브러리 사용이 성능 상의 이점이 크지 않고, 라이센스 문제도 신경 쓰지 않을 수도 없다. ( 참고 - face detection model 성능 비교 ) 사용 상의 편의를 유지하면서 성능향상을 꾀하려면, MTCNN( ) 활용이 좋을 것 같고, 성능 향상과 컴퓨팅 리소스 사용에 주목한다면 FaceNet 모델이나 기존 딥러닝 비전 모델들을 wider face같은 데이터 셋에 직접 훈련시켜서 써도 좋다. (그만큼 face detection 관련 연구는 이미 성능향상을 위한 연구보다 활용을 위한 응용연구가 중심을 이루고 있는 것 같다.) 

따라서 여기에서는 간단하게 dlib 라이브러리에 대한 소개 정도를 목적으로 한다.


dlib.get_frontal_face_detector( )를 통해 생성된 기본 face_detecor 객체는 dlib.fhog_object_detector 객체다. 이 객체에 넘겨지는 인자로는 분석하려는 이미지에 대한 numpy 배열과 정밀한 탐색을 위해 이미지를 확대하는 횟수인 upsample_num_times 이다. (테스트 사진에서 fhog_object_detector는 2번 업샘플했었지만, cnn 모델을 사용한 객체는 1번 업샘플로 모든 얼굴을 탐색한 것으로부터 사소한 성능 상의 차이를 알 수 있었다.)

dlib.fhog_object_detector는 정면 얼굴 뿐이 아닌 5개의 sub-detector로서 HOG 필터를 갖는다. run( ) 메소드를 사용한다면, 어떤 서브 디텍터를 사용했는지와 각각에 대한 신뢰점수를 알 수 있다. 계산된 신뢰점수는 얼굴 탐색 범위를 결정할 임계값에 대해서 활용될 수 있다. 더 자세한 내용은 깃허브 구현에 설명된 마크다운 파일에 api 링크를 남겨두었다.


HOG특성 대신 CNN 학습 결과를 사용하려면 dlib.cnn_face_detection_model_v1 과 같은 클래스를 사용하면 된다. cnn_face_detection_modle_v1 객체는 특히 dlib의 컨트리뷰터인 Davis E. King이 제안한 Max-Margin Object Detection방식을 사용하는 mmod_rectangles 객체를 분석결과로 반환해준다.

opencv와 dlib의 image_window에서 시각화하는 방법 정도가 차이를 보여 다소 까다로울 수 있지만, CNN 탐색 객체에 넘겨주는 사전 훈련 모델은 dlib에서 여러가지 파일로서 제공해주므로( dlib 파일들 ) 사용자체는 어렵지 않다. 공식예제에서 처럼 사전훈련모델로서 mmoc_human_face_detector.dat를 사용하였다.

댓글