논문 리뷰

FaceNet: Face Recognition의 기본모델

dohyeon2 2024. 12. 12. 12:25

목차

    안녕하세요 윤도현입니다. 오늘 소개할 논문은 2015년 CVPR에 개제된 FaceNet: A Unified Embedding for Face Recognition and Clustering 일명 FaceNet 이라는 논문입니다.

     


    제가 이 논문을 리뷰하는 이유는 최근 진행중인 사이드프로젝트를 개발하는 도중  한가지 문제가 발생했기 때문입니다. 개발한 모델은 Video 내 앵글이나 시점이 달라지는 경우 얼굴을 잘 추적하였지만, Video의 맥락(장소, 출연진이 옷을 갈아입는 경우 등)이 전환될 때 동일한 인물의 ID가 달라지는 문제가 발생했습니다. 그래서 저는 이러한 문제를 해결하기 위해 매 프레임마다 얼굴의 임베딩을 추출하고 임베딩끼리의 유사도를 분석하여 동일 인물끼리 클러스터링하여 Re-Identification 작업을 해주면 되지 않을까? 라는 생각을 하였고 이를 위해 Face Recognition의 동작과정을 좀 더 자세히 알아야겠다고 생각했습니다.

     

    FaceNet의 아이디어

    FaceNet은 각각의 얼굴 이미지를 128차원으로 임베딩하여 유클리드 공간으로 매핑한 뒤 이미지간의 거리(가까울 수록 유사도가 높음)를 기반으로 얼굴을 분류하는 모델입니다. 얼굴 임베딩을 특징 벡터로 사용하여 Face Verification, Face Recognition, Face Clustering 작업을 가능하게 합니다.

     

     

    1. Introduction

    이 논문은 크게 세가지 작업을 위한 통합 시스템을 제안합니다.

    • Face Verification(두 개의 얼굴이 동일한 사람인지 확인): 두 얼굴 간의 유사도를 측정(예: 임베딩 벡터 간 거리 계산)하고, 이를 기준으로 동일 여부를 판단합니다.
    • Face Recognition(이 얼굴이 데이터베이스 내 누구와 일치하는지 확인): 주어진 얼굴 임베딩을 데이터베이스의 모든 얼굴 임베딩과 비교하여, 가장 가까운(유사한) 항목을 찾고, 그 항목에 해당하는 **ID(이름, 사용자 정보 등)**를 반환합니다.
    • Face Clustering(동일 인물끼리 묶어주기): 각 얼굴을 임베딩 벡터로 변환한 뒤, 이 벡터들 간의 거리를 측정하여 유사도를 계산합니다. 결과적으로 같은 클러스터에 속한 얼굴들은 동일한 사람으로 간주됩니다.

    여기서 Face Clustering이 제게 필요한 기능이었습니다. Video의 매 frame에서 얼굴 영역을 Detection+Crop하고 모든 프레임에 걸쳐 같은 사람끼리 묶어주어서 Re-Identification을 하는 것입니다. 이를 통해 동영상의 맥락(장소, 출연진이 옷을 갈아입는 경우 등)이 달라지더라도 안정적으로 Face의 ID를 지정해줄 수 있습니다.

     

    다시 논문으로 넘어가서, 본 논문에서 제안하는 방법은 Deep Convolutional Network를 사용하여 각 이미지마다 유클리드 임베딩을 학습하는 것입니다. 이렇게 되면 네트워크는 임베딩 공간에서 L2 Distance가 얼굴 유사도를 나타내도록 학습됩니다. 쉽게말해 fig 1과 같이 동일한 사람의 얼굴은 짧은 L2 Distance를 갖고, 서로 다른 사람의 얼굴은 긴 L2 Distance를 갖도록 네트워크가 학습됩니다.

    fig 1. L2 Distance를 활용한 분류방법

     

    이렇게 얼굴 임베딩이 생성되면 앞서 설명한 세가지 작업은 다음과 같이 단순화할 수 있습니다.

    • Face Verification: 두 임베딩 간의 거리를 기준으로 임계값을 설정하는 작업
    • Face Recognition: K-NN(최근접 이웃) 분류 작업
    • Face Clustering: 클러스터링 알고리즘(K-means나 병합 클러스터링 등)으로 수행되는 작업

    그렇다면 제가 이 논문에서 알아야할 내용은 어떻게 이미지 내 얼굴을 임베딩하여 유클리드 공간으로 매핑하였는가? 

    이 한가지만 알면 끝입니다!

    2. Related Work

    이전 연구들은 주로 얼굴 임베딩 공간 내에서 선형 변환(PCA or Joint Bayesian)을 사용하여 동일한 얼굴간의 거리를 좁히고, 다른 얼굴끼리 거리를 늘리는 방법을 사용하였습니다. 본 논문에서는 유사한 작업을 triplet loss 라는 새로운 손실함수를 통해 진행하여서 더 높은 성능을 달성하였습니다. Triplet loss는 이 논문에서 매우 중요한 개념이므로 뒤에서 자세하게 설명하겠습니다.

    (이전 연구내용은 논문을 참고해주세요!)

    3. Method

    Figure 2. 모델 구조는 크게 배치 입력 레이어와 딥 컨볼루션 신경망(Deep CNN)으로 구성되며, 이후 L2 정규화를 통해 얼굴 임베딩(face embedding)을 생성합니다. 훈련 과정에서는 이 임베딩을 기반으로 트리플렛 손실(triplet loss)이 적용됩니다.

     

    모델의 흐름을 직관적으로 설명하면 다음과 같습니다.

    • 얼굴 이미지를 Batch로 묶어서 딥 컨볼루션 신경망에 입력
    • 신경망에서 얼굴 이미지의 특징을 추출하고 이를 고차원 벡터로 변환(논문에서는 128차원)
    • 신경망의 출력 벡터를 L2 정규화하여 크기가 1이 되도록 변환
    • L2 정규화된 벡터는 최종적으로 얼굴 임베딩이 됨

    여기서 L2 정규화를 하는 목적은 벡터 간의 유클리드 거리가 얼굴간의 유사성을 나타내도록 만들기 위해서입니다. 

    128차원의 벡터가 L2 정규화를 통해 어떻게 크기가 1이 되는거지??
    :L2 정규화(L2 normalization)**는 벡터의 모든 요소를 벡터의 L2 norm (∥v∥2​)으로 나누는 과정을 의미합니다.
    128차원 벡터 v=[v1,v2,…,v128]의 L2 norm은 다음과 같이 정의됩니다:
    즉, 벡터의 각 성분의 제곱을 모두 더한 뒤, 그 제곱근을 취한게 L2 norm으로 벡터의 각 성분을 나누면 크기가 1이 됩니다.

    즉, 우리는 이미지 x를 d차원 특성 공간 f(x)로 매핑하여 동일한 얼굴들 간의 제곱 거리(squared distance)가 작고, 다른 얼굴들 간의 제곱 거리가 크도록 설계된 임베딩을 만듭니다.

     

    3.1 Triplet Loss

    Triplet의 사전적 의미는 "세 쌍둥이 혹은 세 개가 하나의 그룹을 이룬 것"을 뜻합니다. 본 논문에서는 Anchor(앵커), Positive(양성), Negative(음성) 세 가지 얼굴로 이루어진 하나의 그룹을 뜻한다고 이해하시면 될 것 같습니다.

     

    FaceNet의 학습 과정은 다음과 같습니다.

    Figure 3. Triplet Loss는 Anchor와 Positive는 가깝도록, Anchor와 Negative는 멀어지도록 합니다.

    • 입력 배치(얼굴 이미지들)안에서 임의의 사람(Anchor)에 대해 같은 사람(Positive)과 다른 사람(Negative)을 지정
      (Anchor와 Positive, Negative는 라벨링 데이터가 있기 때문에 구분할 수 있음)
    • 그림과 같이 Anchor와 Positive의 거리는 가까워지고 Negative와의 거리는 멀어지도록 학습 진행

    이러한 과정을 수학적으로 나타낸 것이 triplet loss입니다.

    • 대괄호 안의 첫 번째 항은 Anchor와 Positive 사이의 거리이고, 두 번째 항은 Anchor와 Negative 사이의 거리이며 alpha는 마진을 의미합니다. 따라서 L을 최소화한다는 의미는 Anchor와 Positive 사이의 거리는 작아지도록 하고, Anchor와 Negative 사이의 거리는 커지도록 하는 것을 뜻합니다.

    3.2 Triplet Selection

    • 하지만 모델의 성능을 높이기 위해서는 Hard Positive(같은 사람이지만 다르게 보이는 사람)과 Hard Negative(다른 사람이지만 닮은 사람)와 같이 학습을 방해하는 요소를 제어할 필요가 있었습니다.
    • 그래서 저자는 , 이러한 문제를 해결하기위해 저자는 식 1 Triplet 제약조건(Anchor와 Positive 간 거리가 Anchor와 Negative 간 거리보다 클 때)을 도입하여 특정 트리플렛(어려운 경우)만을 학습에 사용하였습니다.
    • Triplet 제약조건을 위반했다는 뜻은, 같은 사람의 얼굴(Positive)이 다른 사람의 얼굴(Negative)보다 Anchor로부터 더 멀리 있게 되는 상황을 말합니다. 이는 즉, 모델이 제대로 학습되지 않았다는 신호입니다.

    식 1. Triplet 제약조건
    식 2. Hard Positive는 Anchor와 가장 먼 Positive를 선택하는 작업이고, Hard Negative는 앵커와 가장 가까운 Negative를 선택하는 작업입니다.

     

    왜 Hard Positive와 Hard Negative가 중요한가?
    모델이 학습 과정에서 쉬운 예제만 학습한다면, 이는 과소적합(underfitting)을 초래할 수 있습니다.
    - 쉬운 Positive: 이미 Anchor와 충분히 가까운 임베딩. 학습에 더 이상 기여하지 않음.
    - 쉬운 Negative: 이미 Anchor와 충분히 먼 임베딩. 학습에 기여하지 않음.
    Hard Positive와 Hard Negative를 학습한다면,
    - Anchor와 Positive 간 거리를 더 좁히고,
    Anchor와 Negative 간 거리를 더 멀리 벌림으로써 모델이 더 정교한 임베딩 공간을 형성하도록 유도합니다.
    • 즉, 제약 조건을 위반하는 트리플렛(특히 Hard Positive와 Hard Negative)을 찾아 학습하는 것은 모델이 어려운 상황에서 더 잘 작동하도록 훈련하는 데 도움이 됩니다.
    • 이는 모델이 학습 데이터의 쉬운 사례에만 의존하지 않고, 어려운 사례에서도 좋은 일반화 성능을 발휘하도록 도와줍니다.
    • 하지만 저자는 전체 훈련 데이터셋에 대해 이러한 작업을 수행하는 것은 시간과 비용 측면에서 비현실적이라고 언급하였고, 잘못 라벨링된 데이터나 품질이 낮은 이미지는 학습을 지배할 수 있다는 위험성 때문에 선택적으로 트리플렛을 찾아야한다고 언급합니다.
    • 그래서 본 논문에서 저자는 온라인 방식(미니배치 내에서 하드 양성 및 하드 음성을 선택)을 사용하여 제약조건을 위반하는 트리플렛을 찾았습니다.
    • 결과적으로 미니배치 내의 선택된 트리플렛(어려운 경우)만 사용하여 학습을 수행하여서 모든 데이터를 학습하지 않아도 어려운 사례 중심으로 학습된 모델은 사람 얼굴을 잘! 구분하게 됩니다.
    논문을 읽으면서 발생한 궁금증: 데이터셋을 학습하면 얼굴 이미지와 positive, negative 라벨링이 존재하기 때문에 굳이 트리플렛을 찾지 않아도 모든 트리플렛이 학습되는거 아닌가? 그런데 왜 굳이 트리플렛을 찾아서 학습하면 성능이 올라간다는걸까?

    답변
    1. 학습 데이터의 크기때문 
    - N개의 이미지가 있다면, 가능한 트리플렛의 수는 (N×P×N′)(N \times P \times N')(N×P×N′) (각각 Anchor, Positive, Negative)로 매우 큽니다.
    - 따라서, 모든 트리플렛을 학습하려면 막대한 계산 비용이 요구되며, 이는 실질적으로 불가능합니다.

    2. 효과적인 학습을 위해
    - 데이터셋에서 주어진 트리플렛은 대부분 쉬운 트리플렛입니다.
    - 이미 Anchor와 Positive는 가깝고, Anchor와 Negative는 충분히 멀어서 트리플렛 제약조건을 만족합니다.
    - 이렇게 쉬운 트리플렛만 학습하면 모델은 어려운 상황에서 일반화된 성능을 발휘하지 못합니다.

    그래서 본 논문에서는 트리플렛 제약조건을 만족하지 못하는 특정 트리플렛(어려운 경우)만을 선택하여 학습에 사용합니다.

     

    3.1, 3.2 내용 요약: 데이터셋에서 특정 트리플렛을 선택해서 학습하면 성능향상에 도움이 된다!

     

    3.3. Deep Convolutional Networks

    다시 모델 아키텍처로 돌아가보겠습니다.

    Figure 2. 모델 구조는 크게 배치 입력 레이어와 딥 컨볼루션 신경망(Deep CNN)으로 구성되며, 이후 L2 정규화를 통해 얼굴 임베딩(face embedding)을 생성합니다. 훈련 과정에서는 이 임베딩을 기반으로 트리플렛 손실(triplet loss)이 적용됩니다.

    배치단위로 얼굴 이미지가 들어오면 컨볼루션 신경망에서 128차원의 임베딩 벡터가 출력된다고 했습니다.

    이 컨볼루션 신경망은 어떻게 구성되어 있을까요?

    (이번 섹션은 큰 내용은 없습니다. 그냥 어떤 backbone을 사용했구나~ 정도만 알고 넘어가시면 될 것 같습니다.)

     

    본 논문에서 저자는 두 가지 컨볼루션 네트워크 모델을 비교실험했다고 합니다.

    • Zeiler & Fergus 기반 아키텍처는 22개의 layer로 이루어져 있으며, 1억 4천만개의 매개변수와 1.6억 FLOPS를 사용
    • Inception 기반 아키텍처는 Zeiler & Fergus 기반 아키텍처 대비 최대 20배 더 적은 매개변수(6.6~7.5백만 개)와 5배 적은 FLOPS를 사용

    Table 3, Fig5: FaceNet Backbone 성능 정량적 비교

    • Table3과 Table 5는 FaceNet의 Backbone의성능을 비교한 테이블과 그래프입니다. 그 중 NN2(Inception 224x224)의 성능이 가장 좋았다고 합니다.

    4. Dataset and Evaluation

    본 논문에서 학습에 쓰인 데이터셋은 공개되지 않았지만, 테스트 데이터셋은 공개되었습니다.

    총 네 가지 데이터셋에서 모델 성능을 평가하였고, 평가지표는 다음과 같습니다. 

    TA(True Accept): 임계값 d에서 올바르게 동일한 얼굴로 분류된 쌍 (i,j)의 집합

    FA(False Accept): 임계값 d에서 잘못 동일한 얼굴로 분류된 쌍 (i,j)의 집합

    VAR(Validation Rate):

    FAR(False Accept Rate):

     

    • Hold-out TEST 데이터셋: 약 100만 개의 이미지를 포함하는 테스트 데이터세트입니다. 20만개 이미지로 구성된 5개의 sub test dataset으로 나눈 뒤, 각 sub dataset에서 FAR, VAR 비율을 계산하고 평균
    • Personal Photo TEST 데이터셋: 이 테스트 세트는 훈련 세트와 유사한 분포를 가지지만, 수동으로 검증된 매우 정확한 레이블을 포함합니다. 1만 2천장의 이미지를 포함하고, FAR, VAR 비율을 계산
    • LFW(Labeled Faces in the wild) TEST 데이터셋: 얼굴 검증을 위한 사실상 표준 학술 테스트 세트입니다
    • YTF(Youtuve Faces DB) TEST 데이터셋: LFW와 유사한 설정이지만, 이미지 쌍 대신 비디오 쌍을 사용하여 검증을 수행합니다.

     

    5. Experiments

     

    이번 섹션에서는 아래와 같은 실험결과에 대해 설명합니다.

    이는 글로 설명하는 것보다 논문을 참조하는것을 추천드립니다.

    • 연산과 accuracy간의 trade-off
    • CNN 모델 유형마다의 VAL값
    • 이미지 퀄리티에 따른 VAL값
    • 임베딩 벡터 차원에 따른 VAL값
    • 학습데이터 개수에 따른 accuracy값
    • LFW 데이터셋과 Youtube Faces DB에 대한 accuracy값
    • 자체 데이터인 Personal Photos에 대한 face clustering 성능

     

    6. 내 사이드 프로젝트에 적용

    논문을 읽은 후 어떻게 해야 Face Clustering을 할 수 있는지 알게되었습니다. 제가 정리한 Clustering 과정은 다음과 같습니다.

    • 이미지(frame)에서 얼굴 Detection: 원본 이미지(왼쪽 사진과 같은 배경이 포함된 이미지)에서 얼굴 영역(bbox)을 찾아냅니다. MTCNN, Dlib, RetinaFace 등 다양한 얼굴 검출 알고리즘을 이용할 수 있습니다.
    • 얼굴 영역 Crop 및 정렬: 검출된 얼굴 영역을 일정한 크기 및 정면 모습으로 정렬합니다. 이 단계에서 눈, 코, 입 등 랜드마크를 기준으로 얼굴 이미지를 정규화하여, 모델에 일관된 형태의 얼굴만 들어가도록 합니다.MTCNN, Dlib에서 Detection과 통합되어 지원됨.
    • 얼굴 임베딩 추출: 이렇게 정렬된 “얼굴만 포함된 이미지”(두 번째 사진과 비슷한 형태)를 Backbone CNN(Network, 예: FaceNet의 Inception 기반 구조)에 입력합니다. 이를 통해 고차원 임베딩 벡터를 얻습니다.
    • 임베딩 기반 Clustering: 유클리드 거리, 코사인 유사도 등을 사용하여 임베딩끼리의 거리(유사도)를 측정
    • Cluster별 ID 재할당: 클러스터 단위로 동일한 얼굴 무리에게 공통의 ID를 부여합니다.

    따라서 프로젝트는 위 파이프라인에 따라 구현해볼 생각입니다.