본문 바로가기
개발 관련 이야기

FaceNet 논문 리뷰

by 꿈틀쓰 2022. 9. 5.

개요

이 논문에서는 face verification, recognition,  clustering을 위한 통합된 시스템을 제안하고 있다. 간단히 말해서 Deep convolutional network을 통해 Euclidean embedding을 학습하여 Euclidean distance를 통해 사람의 얼굴을 구분하는 아이디어이다. 여기서 말하는 embedding은 triplet loss를 통해서 훈련된다. 즉, 이 논문에서 제안하는 핵심 개념은 embedding이 아니라 triplet loss인 것이다.

 

Triplet Loss

FaceNet 모델은 triplet loss를 통해서 128차원 embedding을 직접 훈련시키고 이 embedding의 distance를 통해서 얼굴 identifying을 수행하는 것이다.

 

Triplet의 원래 뜻은 세쌍둥이, 3연음표로 3개로 이루어진 쌍을 뜻한다. 이 논문에서 말하는 triplet은 3개의 얼굴 set이다. 2개의 매칭 얼굴과 1개의 논매칭 얼굴로 이루어진 set을 가지고, 매칭 얼굴과 논매칭 얼굴을 구분할 수 있도록 loss를 계산해서 훈련에 사용하는 것이다. 이를 Triplet Loss라고 부른다.

 

예를 들어, 위 그림에서 anchor 기준점이 되는 얼굴이다. Positive Negative를 각각 매칭 얼굴, 논매칭 얼굴이라고 하면, anchor를 기준으로 positive랑은 가깝게, negative랑은 멀게 만들어주는 embedding을 학습 시키는 것이 FaceNet의 목적이라고 할 수 있다.

 

embedding을 수식으로 나타내면

이고, x는 input image, d는 embedding의 차원이다. 이 논문에서 d는 128로 사용되었다.

 

두 embedding의 거리는 L2 distance를 사용해서 구한다. anchor에서 positive까지의 거리는 anchor에서 negative까지의 거리보다 작아야 한다는 constraint를 수식으로 나타내면 아래와 같다.

a는 anchor, p는 positive, n은 negative 샘플을 뜻한다. 알파는 positive와 negative의 최소한의 거리(margin)을 의미하는 hyper parameter이다.

 

그리하여 최종적으로 minimized 되어야 할 loss는 다음과 같이 구해진다.

하지만 여기서 의문이 든다. 어떻게 triplet을 만드는가 하는 것이다. 가지고 있는 데이터셋에서 모든 가능한 triplet을 사용하면 쉽게 위 식을 만족하는 경우가 많아서 training이 잘 안되고 slow convegence 문제가 있다고 한다.

 

그렇다면 어떻게 triplet 셋을 효과적으로 만들 수 있을까?

 

Triplet Selection

위에서 언급했던 문제를 다시 정리해보자면, 수식을 이미 만족하는 triplet으로만 학습을 시키면 당연히 loss가 작게 계산되는 경우가 대부분이라 parameter들이 update가 거의 되지 않는 문제가 발생하는 것이다.

 

그럼 이 문제를 해결하려면 반대로 위 수식을 만족하지 않는 triplet을 선택해야하는 것이다. 이를 hard triplet이라고 한다.

 

anchor에서 가장 멀리 있는 positive와,

anchor에서 가장 가까이 있는 negative

를 선택하여 triplet으로 사용하면 된다는 아이디어이다.

 

하지만 여기서 또 문제점이 발생한다.

  1. 전체 데이터셋에서 원하는 positive, negative를 구하는 일을 구현하기 굉장히 어렵다
  2. mislabelling 된 샘플과 질이 안좋은(블러가 심하다던가 얼굴이 많이 가려진 등의) 사진이 대부분 선택될 것이라 제대로 된 loss를 계산하는데 영향을 많이 줄 것이다.

 

위 두 문제점을 해결하기 위해서 저자는 2가지 방안을 제안한다.

  1. 각 n-step 마다 subset of data에서 triplet을 offline으로 생성한다.
  2. mini-batch에서 triplet을 online으로 생성한다.

여기서는 2번 online으로 생성하는 방법에 초점을 맞춰서 실험을 진행했다. 

 

Triplet을 selecting 할 때 또 하나 중요한 점은 mini-batch 안에 최소한의 동일인 샘플이 포함되어 있어야 한다는 것이다. 여기서는 40개의 매칭 얼굴이 mini-batch 안에 있도록 작업을 하였고 무작위의 논매칭 얼굴을 선택해 mini-batch에 포함시켰다.

 

모델 구조

전체적인 구조는 다음과 같다. 각 batch는 DNN을 거쳐 embedding을 output으로 내놓으면 그 결과를 기반으로 triplet loss를 계산하여 backpropagation으로 모델의 parameter를 update하여 training을 수행한다.

 

DEEP ARCHITECTURE는 크게 2가지 아키텍쳐를 기반으로 삼아서 여러 구조를 만들었다.

첫번째는, Zeiler와 Fergus의 CNN(https://arxiv.org/abs/1311.2901)

 

Visualizing and Understanding Convolutional Networks

Large Convolutional Network models have recently demonstrated impressive classification performance on the ImageNet benchmark. However there is no clear understanding of why they perform so well, or how they might be improved. In this paper we address both

arxiv.org

 

두번째는, Inception(https://arxiv.org/abs/1409.4842)

 

Going Deeper with Convolutions

We propose a deep convolutional neural network architecture codenamed "Inception", which was responsible for setting the new state of the art for classification and detection in the ImageNet Large-Scale Visual Recognition Challenge 2014 (ILSVRC 2014). The

arxiv.org

 

이 중에서 제일 성능이 잘 나온 Inception 기반의 NN2 모델의 구조는 아래와 같다.

Architecture of NN2 based on Inception

750만개의 파라미터와 16억개의 FLOP으로 이루어져있다.

 

성능

  • LFW - 99.63%
  • Youtube Faces DB - 95.12%

 

Youtube Face DB에서 성능이 매우 뛰어난 편은 아니지만 이 정도면 꽤 쓸만한 모델이라고 생각한다. 이후의 연구는 성능 개선과 mobile에서도 사용할 수 있는 가벼운 모델 개발에 관심이 있다고 한다.

 

아무튼 이 연구의 핵심은 triplet을 이용해서 모델이 직접 embedding을 산출하고 그 embedding으로 직접 거리를 구해 같은 사람인지를 판별할 수 있다는 점이다.

댓글