FaceNet의 논문의 제목은 FaceNet: A Unified Embedding for Face Recognition and Clustering이다. (링크)
저자는 Florian Schroff, Dmitry Kalenichenko, James Philbin다.
FaceNet은 Re-identification을 해결하려는 논문이다.
Re-identification이란 해당 인물이 다른 얼굴면을 보이거나 할 때도 여전히 같은 사람인지 인식 할 수 있느냐의 문제다.
Abstract
최근의 Face recognition과 face verification은 발전했지만 여전히 문제가 남아있다. FaceNet에서는 얼굴 이미지를 compact Euclidean space로 매핑해서 얼굴 유사도를 학습한다. 이를 통해서 얼굴 인식, 얼굴 검증, 얼굴 클러스터링을 쉽게 수행하고자 한다. Deep CNN을 이용해서 얼굴을 벡터로 표현한 embeddings 임베딩 자체를 학습한다. 이때 matching pairs, not matching pairs의 tiples를 활용한다.
Labeled Faces in the Wild (LFW) 데이터 셋에서는 99.6%의 정확도 accuracy를, YouTube Faces DB에서는 95.2%를 달성했다. 또한 harmonic embeddings와 harmonic triple loss를 제시했다.
3. Method
베이스 네트워크로 GoogLeNet을 사용한다.
Figure 2에 나와있듯이 Input image을 CNN에 넣어서 나온 feature map을 L2 normalization을 적용한 embedding을 도출한다.
도출된 임베딩을 아래 Figure 3에 나온 triplet loss를 통해서 얼굴 이미지들 간의 관계를 학습한다.
한 사람 A의 identity가 있을 때 기준이 되는 얼굴 이미지를 anchor, A의 또 다른 얼굴 이미지는 positive, 전혀 다른 사람 (가령 B)의 얼굴 이미지는 negative가 된다.
Triplet Loss
The embedding은 $f(x) \in \mathbb{R}^d$로 표기하고 $x$는 이미지이며 $d$-dimensional Euclidean space에 있는 벡터다.
여기서는 모든 임베딩을 d-dim hypersphere로 제한(constrain) 했으며 이는 L2 norm $|| f(x) ||_2$ = 1로 제한한다는 뜻이다.
Triplet loss를 통해서 다음의 조건을 만족하고자 한다.
Anchor image는 $x_i^{a}$, positive image는 $x_i^{p}$, negative image는 $x_i^{n}$로 표기한다.
$|| f( x_i^{a} ) - f( x_i^{p}) ||_2^{2} + \alpha < || f( x_i^{a} ) - f( x_i^{n} ) ||_2^{2}$
그리고 $\forall (x_i^{a}, x_i^{p}, x_i^{n}) \in \mathcal{T}$
이때 $\mathcal{T}$는 training data의 모든 가능한 triplets (혹은 triples)이며 cardinality는 $N$이다.
Triplet Selection
$ || f( x_i^{a} ) - f( x_i^{p}) ||_2^{2} $이 $ x_i^{a} $에 대해서 최대가 되는 $x_i^{p}$는 hard positive가 된다.
반대로 $ || f( x_i^{a} ) - f( x_i^{n}) ||_2^{2} $이 $ x_i^{a} $에 대해서 최소가 되는 $x_i^{n}$는 hard negative다.
하지만 매번 argmin과 argmax를 계산하는 것은 실질적으로 불가능하다 (infeasible).
이를 위해서 아래의 두 가지 방법이 가능하다.
- Generate triplets offline every n steps. n steps 마다 데이터의 subset에 대해서 argmin과 argmax를 계산한다.
- Generate triplets online. mini-batch 내에서 argmin과 argmax를 계산해서 hard positive/negative를 얻는다.
저자들은 identity 마다 40 장의 얼굴 사진을 선택했으며 이를 통해 미니 배치를 구성한다.
모든 anchor-positive pairs를 사용하지만 negative의 경우 일부만 사용한다.
Offline generation을 수행했으나 좋은 성능을 담보하지 못했다.
따라서 $|| f( x_i^{a} ) - f( x_i^{p}) ||_2^{2} < || f( x_i^{a} ) - f( x_i^{n} ) ||_2^{2}$를 만족하는 negative를 골랐고 이를 semi-hard라고 불렀다. 실험에서는 SGD를 사용해서 최적화를 수행했으며 mini batch의 사이즈는 약 1,900 exemplars다.
PyTorch에서는 TripletMarginLoss로 구현할 수 있다. (링크)
import torch.nn as nn
import torch
triplet_loss = nn.TripletMarginLoss(margin=1.0, p=2, eps=1e-7)
anchor = torch.randn(100, 128, requires_grad=True)
positive = torch.randn(100, 128, requires_grad=True)
negative = torch.randn(100, 128, requires_grad=True)
output = triplet_loss(anchor, positive, negative)
output.backward()
DCNs
Table 1과 Table 2에서 볼 수 있듯이 크게 2가지 NN 구조를 사용해서 실험했다.
4. Datasets and Evaluation
Evaluation은 아래와 같이 설정했다.
D($x_i, x_j$)는 L2 distance (= Euclidean distance)다.
Hold-out Test set
Identity는 서로 다르지만 같은 분포 (same distribution)을 지니는 테스트 셋을 사용했다.
이를 위해서 데이터를 5개의 disjoint splits로 나누었다.
Personal Photos
총 12k개의 이미지
Academic Datasets
Labeled Faces in the Wild (LFW)을 사용했는데 unrestricted, labeled outside data의 standard protocol을 따랐다.
또한 mean classification accuracy와 standard error of the mean을 보고했다.
Youtube Faces DB의 경우 LFW와 유사하게 진행하였으나 pairs of images 대신 pairs of videos를 사용했다.
5. Experimants
더 큰 사이즈의 모델은 곧 더 많은 FLOPS를 요구하며 이는 더 좋은 성능을 내는 경향을 보인다.
하지만 computation 시간과 리소스가 더 많이 필요한 computation과 accuracy의 trade-off가 보인다.
대체로 큰 모델일수록 좋지만 NN3는 상대적으로 작은 크기지만 성능이 견줄만함을 확인할 수 있다.
데이터의 퀄리티 (픽셀 수가 많을수록)가 좋을수록 트레이닝 이미지 수가 더 많을수록 좋은 결과가 나온다.
하지만 일정한 수준 이상부터는 성능의 폭이 감소한다.
Embedding 차원의 경우 512가 256 보다 더 좋지 않는 현상이 발생한다.
마지막으로 LFW에서 잘못 분류된 케이스와 Face 클러스터링 결과를 첨부한다.
Appendix의 Harmonic 관련 두 가지는 생략한다.
References:
'Computer Vision' 카테고리의 다른 글
RetinaNet Focal Loss (2017) 논문 리뷰 (0) | 2025.04.07 |
---|---|
DeepPose (2014) 논문 리뷰 (0) | 2025.04.07 |
DenseNet (2017) 논문 리뷰 (0) | 2025.04.07 |
SSD (2016) 논문 리뷰 (0) | 2025.04.07 |
CAM (2015) 논문 리뷰 (0) | 2025.04.07 |