페이지

2021년 8월 17일 화요일

안면 인식 시스템은 어떻게 작동하는 걸까?

 안면 확인 vs 안면 인식

안면 확인(face verification)은 안면 영상과 해당 사람의 이름이나 ID 등을 입력했을 때, 데이터베이스로부터 해당 ID나 이름을 찾아서 입력된 영상이 저장된 영상과 맞는 지를 확인하는 시스템이다. 즉 입력 이름과 ID에 해당하는 영상 이 맞는지를 매칭하는 1:1 시스템이다. 반면, 안면 인식(face recognition)은 다수(N )의 안면 이미지가 데이터베이스에 저장 되어있으면서 안면 이미지가 입력되면 그 저장 되어있는 다수의 안면 이미지 중 하나에 해당하는 지를 인식하는 시스템으로 N:1 의 경우의 수로 비교를 수행한다

One Shot Learning

안면 인식은 입력된 영상 하나만을 기준으로 판별을 해야 한다는 점에서 One Shot Learning 의 예이다. 즉 아래 그림 1과 같이, 출입구의 카메라에 얼굴을 비추면, 입력된 얼굴 ①을 보고 기존 데이터베이스에 저장된 얼굴 이미지 중에 있는 ❶ 을 맞춰야 하는, 즉 하나 혹은 매우 작은 수의 훈련 샘플/이미지로부터 정보를 학습해야 하는 객체 분류, One Shot Learning 의 예 인 것이다. 이것은 영상 분류에 있어서 수백, 수천 이상의 훈련 샘플/이미지와 매우 큰 데이터세트가 필요하다는 일반 인식에 역행한다. 역사적으로 딥러닝은 하나의 입력 데이터를 가지고 훈련을 해 야하는 One Shot Learning에 매우 취약해온 것이 사실이다.

 

<그림 1. One Shot Learning>

 

자 이제 4명의 직원을 대상으로 훈련을 마친 상태에서 만약 아래 그림 2와 같이 새로운 직원 ②가 입사하면 어떻게 될까? 이제 직원이 5명이 되었고 그러면 5명을 대상으로 훈련을 다시 해야 할까? 만약 직원이 1000명이고 매달 10명씩 새롭게 직원이 늘거나 퇴사한다면? 인원 변동이 있을 때마다 컨볼루션 심층 신경망을 통한 훈련을 매번 다시 해야 한다는 말일까? 이런 방식의 문제 접근법은 그리 좋은 방법이 아닌 것 같다.

 


<그림 2. 상시적인 직원 변동이 있는 모델 훈련의 한계 >

 

유사도 함수(similarity function) 학습

이 문제를 해결하기 위해 위의 그림 2 의 ①과 ❶ 을 이미지 벡터의 유사도를 측정하는 방법으로 접근한다. 만약 ①과 ❶의 이미지의 차이가 허용 값 안에 들어온다면 우리는 두 이미지는 같다라고 판정한다. 예를 들어, 허용 값을 0.3 이내라고 정하였다면, ①과 ❶의 비교는 0.1 그리고 왼쪽의 나머지 3명의 값은 이 값보다 모두 크다면 당연히 ①과 ❶은 같은 사람이라고 판단하는 것이다. ① 은 ❶의 사람이 안경을 쓴 이미지로 이미지 벡터의 유사도가 같다라는 범위로 나타날 것이다.

자 그럼 새롭게 입사한 ②의 경우는? 마찬가지로 ②의 이미지가 데이터베이스에 저장만 되면, 새로운 직원 ②의 입력이 들어왔을 때, 바로 전에 ①과 ❶의 수순을 똑 같이 거치면서 두 이미지 사이의 유사도를 측정하여 판별할 것이다. 별도로 전체 데이터베이스에 있는 이미지들의 훈련 필요 없이 말이다.  

자 그러면 이렇게 ①과 ❶처럼 두개의 이미지를 입력 받아 유사도를 비교하는 함수는 어떻게 만들어지는 것일까?

샴 신경망 네트워크(Siamese Neural Network)

샴 쌍둥이라는 말을 들어본 적이 있으리라고 생각한다. 이와 같이 샴 (영어 발음은 사이어미스) 신경망 네트워크는 두개의 서로 다른 입력 이미지를 같은 네트워크 구조와 같은 파라미터(weight)를 공유하며 사용하여 출력되는 각각의 최종 벡터를 비교 연산하기위해 쓰이는 심층신경망을 일컫는다.

아래 그림 3과 같이 두 사람의 안면 이미지를 입력으로 하여 convolution, pooling, fully connected layer를 거쳐 128 바이트의 feature 벡터를 출력으로 만들어 냄으로써 샴 네트워크 구성을 완성한다. 두 네트워크는 파라미터 및 네트워크 구조가 동일하기 때문에 최종 출력으로 나온 예를 들어, 128 바이트 크기의 feature 벡터라고 하면, 이 벡터 숫자들의 유사도를 측정함으로써 앞에서 살펴본 것과 같이, 두 입력 이미지의 유사도가 어떠 한지 비교할 수 있게 된다. 입력되는 두 안면 영상 이미지가 다르기 때문에 네트워크와 파라미터가 동일하게 구성되었지만, 128 바이트 크기로 출력되는 feature 벡터 숫자들도 허용 치 이상으로 다르게 나올 것이다. , 이 두 128 바이트 크기의 벡터 간에 유클리드 공간에서의 거리를 측정하여 떨어진 거리가 허용치 안에 들어오느냐 여부를 가지고 유사도를 측정할 것이다.



<그림 3. Siamese Neural Network>

지금까지 살펴본 샴 네트워크에 대해서 좀 더 자세히 살펴보고 싶은 분들은 여기 를 눌러 관련 논문을 살펴보기 바란다.

학습 목표

 앞의 그림 3의 최종 출력인 feature vector 128 bytes를 예로 들어보자. 128 bytes 크기로 인코딩된 벡터들 간의 유클리드 공간의 거리를 비교하여 유사도를 측정하는 학습 목표를 달성하기 위하여 3중 손실 (triplet loss) 함수라는 개념을 살펴보고자 한다. 아래 그림 4와 같이 우선 ①과 같이 입력이 되는 이미지인 anchor 이미지 A 가 있고, 그와 비교되는 같은 이미지인 ❶ 의 positive 이미지 P 의 한 쌍이 있다. 오른쪽은 입력이 되는 이미지인 anchor 이미지 A 가 있고 그와 비교되는 다른 이미지인 ②의 negative 이미지 N 이 있다. 결국 목적하고자 하는 학습 목표는 ③ 식에 표시된 바와 같이, A P 간의 거리 d(A, P) A N 간의 거리 d(A, N) 보다 작아야 하는 것이다. 그런데 여기서 +α 가 식 안에 있는 것이 눈에 띈다. +α 가 있는 이유는 다음과 같다.

 

3(Triplet) 손실 함수

 그런데 식 ③ 을 가만히 보면, d(A, P) = 0 , d(A, N) = 0 이면 결국 +α 가 없다면 양쪽이 모두 0 일 경우 합산이 0 이 되어 결국 식 ③ 을 쉽게 만족하게 된다. 우리가 원하는 것은 d(A, P) 가 아주 사소한 숫자라도 간직해서 상대적으로 d(A, N)의 큰 숫자보다 월등히 비교될 수 있는 정도를 원하는 것이다. +α 는 그러한 역할을 위해 마진(margin)으로 부여되는 것이다. 이러한 마진의 역할은 결국 d(A, P) d(A, N) 이 둘 간의 거리 경계를 확연히 차이가 나도록 벌려 놓은 역할을 한다는 정도로 이해하자.

 


<그림 4. 3(triplet) 손실>


아래 그림 5의 손실 함수를 살펴보자. 우리의 목표 함수는 밑줄 친 부분 ④ 가 0 보다 작아야 max() 값이 최소화 될 것이다. max(A, 0) 형태의 손실 함수가 최소화 되려면, A 값이 0 보다 작을 때, 즉 아래 그림 4의 ④번 식이 0 보다 작을 때, 결국 손실 0 을 리턴 할 것이기 때문이다. 여기서 좌측의  
 A P 그리고 A N 간의 3(triplet) 함수임을 의미한다.

 


<그림 5. 손실 함수>

 

 위에서 살펴본, 안면 이미지 하나 당 128 bytes feature vector 를 갖는 3중 손실(triplet) 함수를 사용하여 최고 성능(state of the art)을 달성했다는 FaceNet 에 대한 자세한 내용을 참고하실 분들은 이 논문 을 참고.

 

훈련 데이터 세트의 고려

 만약 3중 손실 함수를 사용하여 훈련용 데이터를 준비한다면 사람 당 10개 정도의 서로 다른 안면 이미지(동일 사람의 서로 다른 이미지, 즉 연령대 별로 변한 이미지나, 안경을 쓴 경우, 혹은 머리 모양이 바뀐 경우 등)를 데이터베이스에 저장하는 것이 좋다. 인식하기위한 입력 이미지(Anchor) 와 동일 인물의 다른 안면 이미지(Positive)를 비교하는 훈련 d(A, P)을 위해서 한 사람 당 약 10개 정도의 서로 다른 안면 이미지가 필요하다는 얘기다1,000명을 대상으로 안면 인식 시스템을 훈련시킨다면, 전체 10,000 개의 안면 이미지가 필요하다는 뜻이다실제 기업에서는 몇 십 만명, 몇 백만명 혹은 몇 천만명의 직원들을 대상으로 안면 인식시스템을 구축하기도 한다. 이럴 경우, 미리 해당 기업이 사전 훈련(pre-trained) 시켜 놓은 모델들을 가져 다가 전이학습으로 사용할 수도 있다. 이럴 경우에도, 지금까지 살펴본 기본적인 Siamese 네트워크와 3중 손실(Triplet Loss) 함수를 이해하는 것은 도움이 될 것이다.

 

유사도 함수를 학습하는 이진 분류 접근법

지금까지 샴(Siamese) 네트워크의 파라미터를 공유하는 3(triplet) 손실 방식을 살펴보았는데 아래 그림 6과 같이 샴 네트워크의 파라미터를 공유하는 방식은 동일한데 생성된 128 바이트의 임베딩된 feature 벡터 쌍을 이진 분류를 통과하여 1 이면 동일, 0 이면 이질 안면 이미지로 분류하는 이진 분류 문제 해결 방식으로 접근하는 또 다른 방법이 있다. 이 방식 역시 괜찮은 성능을 보여준다고 한다.

 


   <그림 6. 이진 분류 접근법>

  자 그러면 Logistic Regression Unit 은 실제로 무슨 일을 하는 것일까? 아래 그림 7을 보면 밑줄이 그어진 ⑤ 번 항을 보면 결국 128 바이트로 임베딩된 i j  두개의 서로 다른 안면 이미지에 대해 유클리드 공간의 거리를 구하는 것이다. 앞에 붙은 k=1 부터 128까지라는 수식   

  은 결국 이 두개의 128 바이트 임베딩 벡터를 1부터 128개 벡터 각각에 대해 두 i, j 쌍의 거리를 비교하여 그 값을 더한다는 뜻이다. 이 값이 0 에 가까우면 두 이미지는 같은 인물 즉 1의 값을, 거리가 멀어지면 다른 인물 즉 0 으로 이진 분류 하는 방식이다.

 


<그림 7. logistic regression unit 함수>

현장 적용 팁

  아래 그림 8 처럼, 예를 들어 10,000 명의 직원들의 안면 이미지를 미리 샴 네트워크를 통하여 128 바이트 임베딩 feature 벡터를 각각 10,000 만들어서 데이터베이스에 저장해 놓았다고 가정해보자. 아래 그림처럼 이제 새로 입사한 신입사원의 안면 인식을 훈련할 때에는, 해당 신입사원만 기존의 샴 네트워크의 파라미터와 동일하게 훈련을 진행하여 128 바이트의 feature 임베딩 벡터를 생성하고, 이를 또 다른 비교 대상 이미지에게 훈련을 진행할 필요 없이, 데이터베이스에 사전훈련되어 저장되어 있는 128 바이트 임베딩 벡터만 가지고 신입사원의 128 바이트 임베딩 벡터와 비교하면 되는 것이다. 이렇게 함으로써 소위 새로운 이미지 하나의 입력 샘플 만으로 유사도를 판별하는 one shot 학습이 구현되는 것이다. 이렇게 되면, 실제 모든 임직원의 안면 이미지 사진을 보유할 필요없이 사전 연산된 임베딩 벡터들만으로 유사도 비교가 일어나므로 상당한 양의 컴퓨터 연산 부하를 줄일 수 있다.

 

 


<그림 8. 사전 훈련된 임베딩 사용>

 

결언

  지금까지 살펴본 바와 같이, 두 쌍의 이미지를 샴 네트워크를 이용하여 그것이 3중 손실 함수이건 혹은 이진 분류 방식이건 결국 이 두 비교 이미지 간에 훈련을 통한 임베딩 벡터의 유사도 비교를 통한 접근법으로 안면 인식을 처리할 수 있음을 살펴보았다. 두개의 컨볼루션 네트워크를 구성하고 그 둘 간의 네트워크 구조와 파라미터를 공유하며 최종적으로 출력된 임베딩된 벡터를 비교하여 유사도를 측정하는 개념은 비단 안면인식에만 적용될까 라는 생각이 든다. 예를 들어, 특정 암질환에 대한 종양의 이미지를 각각 동종의 10가지 이미지를 보유한다면 새로운 종양 이미지가 입력되었을 때, 기존의 저장된 종양과 과연 같은 것이 있는 지 유사도를 탐지하는데 사용될 수 있지 않을까? 특히나 저장된 이미지 데이터베이스에 꾸준한 in, out 이 있고 매번 그럴 때 마다 훈련을 다시 하지 않아도 되는, one shot learning 의 이러한 접근법은, 딥러닝 이 요구하는 대용량의 데이터 필요를 넘어 많은 응용분야에 적용될 수 있는 여지가 있어 보인다.

댓글 없음:

댓글 쓰기