MTCNN
MTCNN에 대해 간단하게 리뷰해보도록 하겠습니다. MTCNN은 최초 논문을 통해 공개된 저자의 버전이 존재하고,
Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks
가공한 버전들이 존재합니다. 하단 링크는 그 중 가장 퍼블릭한 버전입니다.
GitHub - ipazc/mtcnn: MTCNN face detection implementation for TensorFlow, as a PIP package.
파라미터
버전마다 약간의 차이는 존재할 수 있으나 기본적으로 조절할 수 있는 파라미터는 다음과 같습니다.
weights_file
, min_face_size
, steps_threshold
, scale_factor
weights_file
은 말 그대로 가중치를 불러오는 파일을 의미합니다. 여기서의 가중치는 MTCNN을 구성하는 P,R,O network의 가중치를 의미합니다.
min_face_size
는 얼굴로 추정할 최소 크기를 의미하며, 디폴트 옵션은 20입니다.
steps_threshold
는 P,R,O network에 사용하는 threshold를 의미합니다. 쉽게 설명하면 각 모델에서 나온 결과의 신뢰도를 봐서 threshold% 이상이면 결과값을 사용합니다. 디폴트 옵션은 [0.6, 0.7, 0.7] 입니다.
scale_factor
는 스케일링에 사용할 값을 의미하며 기본적으로 0.709가 지정되어 있습니다.
논문 리뷰
MTCNN은 위의 그림과 같이 동작을 진행합니다. 총 3개의 스테이지로 구성되어 있고, 각각이 P-Net, R-Net, O-Net을 의미합니다. CNN의 앞의 MT는 멀티-태스크를 말하며 얼굴 검출, 랜드마크 검출, 그리고 상단의 사각형 모양을 말하는 Bounding box regression 세 개의 태스크를 함께 학습하는 Joint learning 방식을 사용하고 있습니다.
각각의 stage를 담당하는 네트워크들은 다음과 같습니다. 우선 첫 스테이지(P-Net)을 적용하기 전, 원본 이미지를 다양하게 resize해둡니다. 스케일을 줄임으로써 작은 얼굴에 대해서도 잘 찾아낼 수 있다는 장점이 있다고 합니다. P-Net을 보시면 input size가 12x12임을 알 수 있는데, 이미지가 크다면 작은 window에서 얼굴을 검출할 수 없을 수 있지만 다양하게 resize를 진행해둔다면 작은 이미지에서는 충분히 작은 window로도 얼굴 부분을 검출할 수 있을 것입니다.
P-Net(Proposal Network)
Shared parameter가 존재하고, 각각의 태스크로 마지막에 나눠지는 멀티-태스크 러닝으로 보입니다. face classification을 통해 얼굴이 존재하는지 여부 및 확률을, bounding box regression(BBR)으로 박스 좌상단 좌표 및 너비, 크기를, landmark localization으로 5개의 얼굴 랜드마크 좌표(왼쪽, 오른쪽 눈, 코, 입의 왼쪽, 오른쪽)를 얻어냅니다.
찾아낸 얼굴 영역은 다시 원래의 사이즈로 resize합니다. 이후 해당 박스들에 대해 NMS와 BBR를 적용하여 가장 확률이 높은 박스들에 대한 output값들을 남깁니다
R-Net(Refine Network)
R-Net은 위의 P-Net에서 추정한 박스들에 대해 더 정교한 작업을 수행하는 모델입니다. P-Net과의 차이점은 뒤에 FC layer가 추가된다는 점이 존재합니다. 또 다른 차이점은 앞에서 구한 박스들에 대해 input size 24x24로 resize를 진행하는 작업이 필요합니다. R-Net의 output 역시 P-Net과 같이 NMS와 BBR를 적용하여 가장 확률이 높은 박스들에 대한 output값들을 남깁니다.
O-Net(Output Network)
마지막으로 최종 output을 위한 모델인 O-Net을 적용합니다. 모델 깊이가 조금 더 깊어지고, R-Net과 같이 FC layer가 존재합니다. input size가 더 커진점도 확인할 수 있습니다. 이렇게 나온 output이 MTCNN이 최종 결과값입니다.
Loss Function
손실 함수에 대해서 간단하게 정리했습니다.
Face Classification loss
p는 얼굴이 있을 확률을, y^det은 얼굴 여부를 의미합니다. 이들을 활용한 크로스 엔트로피 값을 로스로 사용합니다.
Bounding box Regression loss
Facial landmark Localization loss
이 두개의 로스는 유클리드 거리를 활용하여 사용하는 것으로 보입니다.
최종 로스
적용 후기
MTCNN은 상당히 놓은 성능과, 랜드마크를 함께 표시할 수 있기 때문에 중심을 잡는 용도 등 다양한 활용이 가능하다는 장점이 존재합니다. 다만 프로젝트 적용에 있어서는 생각보다 많은 자원이 사용되며, 특히 속도상에 이점을 가지기가 어려웠고, 최근 코로나 이후 마스크 착용이 대중화되었는데, 이런 마스크 등의 요인으로 랜드마크를 잘 못찾는 등의 문제도 발생했습니다. 결국 최종적으로는 MTCNN 대신 SSD로 프로젝트를 수행하고 있습니다.
Facial Detect 모델들에 대해 리소스, 속도 등의 비교를 참고한 블로그는 다음과 같습니다.
Face detection model 성능 비교(WIDERFace) · Seongkyun Han's blog