본문 바로가기
Deep Learning Specialization

Face Recognition [Deep Learning Specialization #11]

by ALTERww 2022. 7. 28.
320x100

Coursera의 Deep Learning Specialization - Week 4의 강의를 수강하면서 필기한 내용을 바탕으로 정리한 글입니다.

 

지난 주차에는 Detection Algorithm을 살펴 보았습니다.

이번 주차에는 Face Recognition을 살펴 보겠습니다.

 

Verification vs. Recognition

Verification(인증)은 사진과 ID가 주어지면, 사진 속 인물과 ID가 일치하는 지를 판단하여 True / False를 내보냅니다.

반면, Face Recognition(안면인식)은 k명에 대한 정보가 담긴 데이터베이스가 있을 때, 사진 속에 데이터베이스에 존재하는 사람이 있는지, 있다면 누가 있는지를 알려줍니다. 인증과 다르게 일대다 메커니즘으로, 훨씬 어렵고 복잡합니다.

 

 

One Shot Learning

안면인식이 현실에서 사용되는 경우 대부분의 입력은 처음 본 사람입니다. 지금까지 배웠던 딥러닝 모델들은 학습 데이터와 테스트 데이터가 비슷했는데, 이러한 경우 학습 데이터가 매우 부족합니다. 이렇게 딱 1번 본 사진을 통해 결과를 예측해야 하는 학습을 One Shot Learning이라고 합니다.

해당 학습에서는 "Similarity" 함수를 이용합니다. 두 이미지의 차이 정도를 산출하는 함수입니다. 작을수록 두 이미지가 유사하다고 판단할 수 있습니다.

그래서 d값이 threshold 이하이면 같은 사람으로 판단하게 됩니다.데이터베이스 속 모든 이미지들에 대해 Similarity를 수행하여 가장 작은 값을 가진 사진의 인물이구나! 하고 판단합니다.

 

 

Siamese Network(샴 네트워크)

샴 네트워크는 "쌍둥이"를 의미하는 Siamese에서 따온 이름입니다.

  • 두 입력 이미지에 대해 두 사람이 같은 사람인지를 판단하는 네트워크가 있습니다.
  • 각 입력에 대해 같은 가중치 및 파라미터를 가진 신경망을 통과합니다. 가중치가 같은 신경망은 하나의 함수(Function)와 같고, 이를 강의에서는 "Encoding한다"고 표현했습니다.
  • 얻은 결과 사이의 거리를 L1 norm, L2 norm 등으로 계산합니다. 여기에서는 L2 norm을 이용했습니다. 이 값이 두 이미지의 차이이고, Similarity 함수값이 됩니다.
  • 소량의 데이터, 즉 One-shot Learning으로 사용이 가능합니다.

 

 

Triplet Loss

분류 모델에서 수많은 데이터를 분류하기 위한 손실 함수로 Triplet Loss를 고안하였습니다.

Triplet은 이름에 맞게 3가지 데이터를 매개변수로 받습니다.

  • Anchor A : 기준 Data
  • Positive P : 같은 Class의 Data
  • Negative N : 다른 Class의 Data

기준 Data인 Anchor와의 거리를 Positive와는 가깝게, Negative와는 멀게 하는 것이 본 손실 함수의 목표입니다.

우선, 조건에 따라

d(A,P) <= d(A,N)

위 식을 만족하게끔 모델을 학습하게 됩니다. 그런데 위 식을 만족한다 하더라도, 두 값의 차이를 여유 있게 만드는 것이 모델 성능에 더 도움이 될 것입니다. 따라서 Margin alpha를 두어 일정 거리 이상을 유지하게 합니다.

d(A,P) + alpha <= d(A,N)

그렇다면, 두 값의 차이만큼이 손실 값이 됩니다. 

L(A,P,N) = max(0, d(A,P) + alpha - d(A,N))

일반적으로 Triplet Loss 방식은 Triplet 쌍이 어떻게 선택되는지에 따라 학습이 달라집니다.

  • Loss 값이 0인 경우, Train하기 쉽습니다.
  • Loss 값이 양수이지만 margin 값을 넘지 못하는 경우, 조금 어렵습니다. Semi-hard Triplet이라고 합니다. 
  • Loss 값이 큰 양수인 경우, Negative가 Positive보다 Anchor에 가까운 경우입니다. Hard Triplet이라고 합니다.

따라서 Loss값이 큰 Triplet 쌍을 찾아 학습 데이터로 이용하는 것이 중요합니다.

1000명에 대한 사진 10000장이 데이터셋으로 사용된다고 할 때, A-N 쌍의 종류는 A-P 쌍의 종류보다 훨씬 많습니다. 그 중에서 Loss값이 큰 쌍의 비율은 크지 않으므로, batch를 나눈 뒤 random하게 선택하게 하여 Loss가 큰 Triplet 쌍을 최대한 많이 학습에 사용되도록 합니다.

그리고 A와 P는 같은 사람이기 때문에, 쌍으로 된 데이터를 구성하기 위해 적어도 한 사람당 10장의 사진은 필요합니다. 

학습이 끝난 후에는 One-shot Learning이 가능하지만, 학습을 위해서는 최소 10장은 있어야 합니다.

 

 

 

Face Recognition + Binary Classification

안면 인식 문제를 이진 분류로 해석하여 해결하기도 합니다.

이미지를 같은 파라미터를 가진 NN에 통과시켜 (= Encoding) 128개의 feature vector로 나타내고, 목표 이미지의 128개 feature vector와의 차이를 계산하여 결과를 0 또는 1로 예측합니다. 활성 함수가 Sigmoid인 것을 볼 수 있습니다.

 

 

목표 이미지는 아래처럼 데이터베이스에서 이미 계산된 값을 불러와 시간을 아낄 수 있습니다. Siamese NN을 이용하면 이미 인코딩된 값들이기 때문입니다.

 

 

Deep ConvNet Learning

깊은 합성곱 신경망의 학습이 가지는 의의를 직관적으로 정리해 보겠습니다.

  • Layer가 깊을수록 고차원적이고 복잡한 특징을 찾아내는 데 사용됩니다.
  • Layer가 얕을수록 저차원적이고 간단한 특징을 찾아내는 데 사용됩니다.

 

 

Neural Style Transfer

이미지 Content를 새로운 Style과 결합하여 새 이미지 Generate를 만드는 모델입니다.

 

 

비용함수 J(G)는 content의 비용 함수 J_content와 style의 비용 함수 J_style 그리고 상대적인 가중치를 의미하는 알파, 베타값으로 이루어집니다.

J_content

content의 비용 함수는 입력 이미지 C와 생성된 이미지 G를 비교합니다. 사전에 학습된 ConvNet을 활용합니다.

특정 Layer를 선택하여 그 활성값의 거리 차이를 구하는데, Layer가 깊으면 두 이미지가 너무 다를 것이고 Layer가 얕으면 너무 비슷할 것입니다. 그러니 적당한 Layer를 선택합니다.

두 이미지에 대한 활성값을 계산하여 거리 차이를 구합니다. 이 값이 최소가 되도록 모델을 학습시킵니다.

 

 

J_style : Style cost function

Style은 이미지에서 여러 채널 간 활성값들 사이의 상관(Correlation)을 의미합니다.

하나의 레이어를 통과했을 때, 같은 위치에 위치한 각 채널의 활성값들의 상관관계를 확인하는 작업을 합니다.

따라서 각 레이어 별로, Style Image에 대해 활성값들의 상관관계를 측정하고 더합니다. 이렇게 구한 행렬을 Style Matrix, 혹은 Gram Matrix라고 말합니다.

 

생성된 이미지 Generate에 대해서도 똑같이 구한 뒤, 레이어별 두 행렬의 거리 차이를 계산하여 J_style을 구하게 됩니다.

전체 신경망에 대한 J_style은 각 레이어 별 J_style에 lambda를 곱하는데, 낮은 Layer와 높은 Layer의 가중치를 조절하기 위한 Hyper-parameter입니다. 

 

댓글