FaceID 어떻게 돌아갈까 (with FaceNet)

in zzan •  5 years ago 

글 쓰는 이유

키오스크에 기존에 등록된 사람이 누가 서있는지 아니면 새로온 사람이 있는지 판단하는 로직이 필요해 이것을 찾아보게 되었다. (사실 현재는 얼굴 인식을 하는 많은 솔루션들이 있어서 돈을 주고 사도 된다.)
그냥 연습삼아 해보는 것이다.
Face recognition 이라는 말보다 아이폰에서 사용되는 FaceID로 잘 알려져 있다. 사실 아이폰에서 얼굴 인식 하는 것은 사진정보만 쓰는 것이 아니라 3d depth정보 까지 같이 되어 있어 좀더 발전된 형태이다.

FaceNet 간단한 설명

https://arxiv.org/pdf/1503.03832.pdf

FaceNet은 2015년에 나온 모델로 기존 과의 가장 큰 차이점은 랜드마크 정보를 필요로 하지 않는다는 것이다.

기존모델들은

위 사진과 같은 랜드마크 정보를 넣어야 해당 사람인지 아닌지 판단할 수 있었는데

FaceNet은 그냥 얼굴 사진만 넣으면 된다.

얼굴 사진을 넣게 되면 (resnet cnn 을 거쳐... embedding 벡터로 얼굴의 특징을 표현하게 된다.)

위와 같은 간단한 모델 구조(Deep architecture 는 논문을 참고하길 바란다)를 가지고 있고 모델에서 나온 embedding 값을 비교하여 train 할때는 Triplet Loss 를 사용한다.

embedding 을 그냥 간단하게 말하면 그냥 얼굴을 특징을 128가지(이 논문에선 그렇다)로 표현하는 것이다.

train할때와는 다르게 classify를 하는 경우 다른 사진의 얼굴과 128 가지의 값의 차이를 비교(L2 norm)해서 0.8(임계점)보다 작으면 같은 사람 크면 다른 사람으로 판단하는 것이다.

구현

사실 구현을 직접 하지 않았다. 이미 많이 구현되어있는 것이 있기 때문에

나는 c++로 구현된 것이 필요해서 아래 코드를 참조했다.
https://github.com/Chanstk/FaceRecognition_MTCNN_FaceNet

여기서 얼굴 사진의 전처리 과정에 opencv 와 호환성이 맞지 않는 부분이 있어 해당 부분만 손봐주니 생각보다 잘 동작한다.

얼굴 부분만 crop해서 판단을 하는데 crop할때도 deep learning(소위 사람들이 말하는 AI) 모델인 MTCNN이 이용되었다.

혹여나 돌리는 사람중에 detector가 crop하지 않은 사진을 사용하게 되면 성능이 떨어질 수 있고 실시간으로 찍는 카메라와 다른 카메라에서 찍은 사진을 사용하는 경우도 성능이 떨어진다. 이런 점을 주의 하기 바란다.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!