개요 

Face recognition 발전 방향중 Loss function변화를 통한 성능향상, 그중에서도  Classification loss 에 해당.

 

설명

본 블로그 글중 'Open set/Closed set...'에서도 언급했었는데, Face Recognition은 위 사진처럼 Separable하게 할건지 Discriminative 하게 할건지중 open set을 위해서 단순히 class 별로 분리하는 hyper plane을 찾는것(classification)을 넘어서 추가 클래스를 데비해 같은 클래스끼리 가까이 하고 다른클래스는 멀리 위치 시키는 mapping을 수행해야한다.

center loss는 그것을 수행하기 위한 방법중 하나이다.

 

 

Classification은 다음 사진과 같은 문제가 있다.

같은 클래스내에서도 variation이 있기 때문에 Separable 하더라도 충분히 discrimnative 하지 않다면 Face Recognition 성능 저하를 일으킨다.

-> Center loss 를 이용해 discriminative 하게 만들자.  식은 다음과 같다.

mini batch 안에서 각 class 마다 class center를 정한후 class에 속하는 sample들을 class center와 가깝게 위치하도록 loss 로 잡아준다. 이때 center는 feature가 바뀌게 되면 새롭게 업데이트 된다. 

원래는 모든 데이터셋을 가지고 class 별로 center 를 구하는것이 맞으나 inefficient, impractical 하므로 

1. mini-batch 내에서 center 구함.

2. 매 iteration 마다 각 클래스 내의 feature들을 averaging 하여 center loss 를 구하고 이를 사용하여 center를 업데이트함.

위 두가지 공식을 가지고 구하게 된다. 정리된 식은 다음과 같다. 

적용되는 loss = classification loss + lamda * Center loss

최종 Loss는 inter class간 떨어뜨리기 위한 Classification Loss, intra class내에서 뭉쳐있게 하기 위한 Center loss를 더한값으로 사용하여 Inter는 separate 하면서 동시에 intra는 compact하게 만든다.

 

위 내용들을 적용시킨 최종 러닝 알고리듬은 다음과 같다.

 

 

lambda(intra를 inter에 비해 얼마나 중요시 여길거냐) 에 따른 분류되는 embedding된 data들

 

출처 : Yandong Wen, et al. , "A Discriminative Feature Learning Approach for Deep Face Recognition" 2016, ECCV

출처 : www.slideshare.net/JisungDavidKim/center-loss-for-face-recognition

Triplet Loss

 

개요

Triplet Loss는 앞에 설명한 Contrastive loss 와 같이 Deep learning based Face recognition에서 두가지 기술 발전방향중 Loss function에의한 발전에 속하고 그 중에서 verification loss function에 해당. 간단히 말하면 무작위 데이터셋을 뽑은후 positive pair와 negative 를 sample한후 positive는 가까이, negative는 멀리 배치하는 방법.

 

설명

-Distance based loss function

- Anchor(a), Positive(p), Negative(n) 세가지 input 사용

- 식 

   L=max(d(a,p)−d(a,n)+margin,0).

-> positive sample은 가까이, negative sample 은 멀리배치하도록 학습하게됨. 이때 margin 이 더해져 있기 때문에  negative를 멀리 보내게 됨.

Triplet Mining

개요

Triplet Loss 에 따라 dataset의 카테고리를 나눌 수 있음. 종류는 Easy, Hard, Semi-hard

설명

-Easy triplets = loss 가 0 일때 = Max안의 함수가 음수 일때= n은 멀리, a는 가까이 충분히 분리가 잘 되어있을때

=d(a,p)+margin<d(a,n)

 

-hard triplets = negative가 positive보다 anchor에 가까울때 

=d(a,n)<d(a,p)

 

-Semi-hard triplets = negative가 positive보단 멀리 떨어져 있지만 충분한 margin을 넘진 못해서 Loss가 양수일때

=d(a,p)<d(a,n)<d(a,p)+margin

 

실질적으로 max(~~,0)인 함수이므로 anchor와 positive + margin을 기준으로 negative값에 따라 좌우되게 된다.

그러므로 hard negative, easy negative, semi-hard negative라고도 표현한다. 

위 설명을 그림으로 표기하면 다음과 같다.

 

Training

-Offline Triplet mining : manually triplet 을 만든다음 network에 적용시킨다(positve, anchor, negative pair를 일일히 만든다)

-Onling Triplet mining : training data를 batch 형식으로 주어 batch 내에서 triplet을 생성하게 된다. 이렇게하면 triplet을 random하게 뽑게 하므로 high loss를 가지는 triplet(학습에 영향을 많이 끼치는 중요한 triplet)을 찾는 기회가 생긴다.

batch size가 N이면 최대 N^3의 triplet을 생성 할 수 있다. 한번에 모든 data에 대해 triplet 을 만드는것보다 학습속도가 빨라진다.

 

-실제 구현 코드 

  -offline : github.com/eroj333/learning-cv-ml/blob/master/SNN/Offline%20Triplet%20Mining.ipynb

  -online : github.com/eroj333/learning-cv-ml/blob/master/SNN/Online%20Triplet%20Mining.ipynb

 

eroj333/learning-cv-ml

Contribute to eroj333/learning-cv-ml development by creating an account on GitHub.

github.com

Embedding Space for train data using PCA in Tensorboard.

 

출처 : medium.com/@enoshshr/triplet-loss-and-siamese-neural-networks-5d363fdeba9b

 

+ Recent posts