혜랑's STORY

[정리] 기계학습(Machine Learning, 머신러닝)은 즐겁다! Part 4 본문

무지성 작업실/WSS 세미나 - Face Recognition

[정리] 기계학습(Machine Learning, 머신러닝)은 즐겁다! Part 4

hyerang0125 2021. 9. 8. 16:47
 

기계 학습(Machine Learning, 머신 러닝)은 즐겁다! Part 4

딥러닝(Deep Learning)을 사용한 최신 얼굴 인식(Face Recognition)

medium.com

 

딥러닝(Deep Learning)을 사용한 최신 얼굴 인식(Face Recognition)

사람이 사진에 직접 태그를 하던 것과 달리 요즘 Facebook에서 사진을 업로드면 사람들에 대한 태그를 자동으로 달아준다.

Facebook에서 이전에는 태그를 추가해야만 했지만 이제는 사진에 사람들에 대한 태그를 자동으로 달아준다.

이 기술을 얼굴 인식(face recognition)이라고 한다. 페이스북의 알고리즘은 친구사진에 단 몇 번만 태그를 달아도 바로 그 얼굴을 인식 할 수 있다. (98%의 정확도로 얼굴을 인식할 수 있음)

#1. 매우 복잡한 문제에 기계 학습을 사용하는 방법

지금까지 주택 가격 예측하기, 기존 데이터를 기반으로 새로운 데이터 생성하기 그리고 이지미에 특정 객체가 있는지 여부를 알려주가와 같은 단 한 가지 단계(step)만 있는 독립된 문제를 해결하기 위해 기계학습을 사용하였다. 이러한 종류의 문제는 하나의 기계 학습 알고리즘을 선택하고 데이터를 제공(feed)해서 결과를 얻으면 해결할 수 있다.

그러나 얼굴인식은 일련의 여러가지 관련된 문제들을 해결하는 과정이다.

  1. 먼저 사진을 보고 그 안에 있는 모든 얼굴을 찾아야 한다.
  2. 각 얼굴에 초점을 맞추고 얼굴이 이상한 방향으로 틀어졌거나 또는 조명이 안좋은 상황이라도, 여전히 같은 사람이라는 것을 이해할 수 있어야 한다.
  3. 눈이 얼마나 큰지, 얼굴은 얼마나 긴지 등과 같이 다른 사람들과 구분하는데 사용하는 얼굴의 고유한 특징을 찾아 낼 수 있어야 한다.
  4. 마지막으로 그 얼굴의 고유한 특징을 기존에 알고 있느느 모든 사람들과 비교해서 그 사람의 이름을 결정해야 한다.

인간은 일상의 모든 사물의 얼굴 또는 표면을 발견하고 인식하는 일을 너무나도 잘한다.

그러나 컴퓨터는 (아직까지) 이러한 높은 수준의 일반화를 할 수 없기 때문에, 이 프로세스를 분리해서 각 단계별로 수행하는 방법을 가르쳐야 한다.

즉, 얼굴 인식을 분리해서 각  단계별로 문제를 해결하고 현 단계의 결과를 다음 담계로 넘겨주는 경로(pipeline)를 만들어야 한다. (몇가지 기계 학습 알고리즘을 함께 연결할 것이다.)

얼굴을 인식하기 위한 기본 경로(pipeline)의 동작 방식

#2. 단계별 얼굴 인식

전체적인 중요 아이디어를 배우고 나서 OpenFace와 dlib을 사용해 Python으로 자신 만의 얼굴인식 시스템을 만드는 방법을 배우게 될 것이다.

Step 1: 모든 얼굴 찾기

경로(pipeline)에서 첫 번째 단계는 얼굴 검출(face detection)이다. 당연하게도 얼굴을 구별하기 위해서는 먼저 사진 상에서 얼굴을 찾아야 한다.

지난 10년 사이 아무 카메라나 사용해 봤다면, 얼굴 인식 기능이 들어있는걸 본적이 있을 것이다.

얼굴 인식은 카메라의 중요한 기능이다. 카메라가 얼굴을 자동으로 인식할 수 있다면, 사진을 찍기 전에 모든 얼굴에 확실하게 초점을 맞춰줄 수 있기 때문이다. 이 기능을 경로(pipeline)의 다음 단계로 넘길 이미지 영역을 찾는데 사용할 것이다.

Histogram of Oriented Gradients(또는 줄여서 HOG)라 불리는 2005년에 발명 된 방식을 사용할 것이다.

이미지에서 얼굴을 찾기위해 이미지를 흑백으로 바꾸는 것부터 시작할 것이다. 왜냐하면 얼굴을 찾는데 색상 데이터는 필요 없기 때문이다.

그런 다음 한 번에 하나씩 이미지의 모든 단일 픽셀들을 살펴 보자. 모든 단일 픽셀에 대해 이를 직접 둘러싸고 있는 픽셀들 또한 살펴보자.

목표는 해당 픽셀이 이를 직접 둘러싸고 있는 픽셀들과 비교해서 얼마나 어두운지 알아내는 것이다. 이를 통하여 이미지가 어두워지는 방향을 나타내는 화살표를 그리고자 한다.

이 한개의 픽셀과 이 픽셀에 인접한 픽셀들을 살펴 보면, 이미지는 오른쪽 상단으로 갈수록 어두워진다.

이미지의 모든 픽셀에 대해 이 프로세스를 반복하면 결국 모든 픽셀이 화상표로 바뀌게 된다. 이러한 화살표들을 그래디언드(gradients)라고 부르고, 이를 통해 전체 이미지에서 밝은 부분으로부터 어두운 부분으로의 흐름을 알 수 있다.

픽셀을 그래디언트(gradients)로 바꿔야하는 이유는 이미지의 밝기가 변하는 방향만 고려하면 정말 어두운 이미지와 정말 밝은 이미지에 대한 완전히 동일한 표현(representation)을 얻게되기 때문이다.

그러나 모든 단일 픽셀에 대해 그래디언트를 저장하면 너무 자세하다. 따라서 이미지의 기본 패턴을 알 수 있도록, 높은 수준에서 밝음/어둠의 기본 흐름만을 보는 것이 더 좋다.

이를 위해, 이미지를 각각 16x16 픽셀의 작은 정사각형들으로 분해한다. 각 정사각형에서, 얼마나 많은 그래디언트가 주요 방향(윗쪽, 우상쪽, 오른쪽, 등)을 얼마나 가리키고 있는지 세어 볼 것이다. 그런 다음 이 사각형을 가장 강한 화살표 방향으로 바꿀 것이다.

결과적으로, 원본 이미지를 얼굴의 기본 구조가 심플한 방법으로 표시되는 매우 간단한 표현(representation)으로 변환하게 된다.

이 HOG 이미지에서 얼굴을 찾기 위해서 해야 할 일으느 많은 훈련 얼굴 이미지로부터 추출 된 잘 알려진 HOG 패턴과 가장 유사하게 보이는 부분을 이미지에서 찾는 것이다.

이 기술을 사용하면 어떠한 이미지에서도 얼굴을 쉽게 찾을 수 있다.

Step 2: 얼굴의 위치교정(Posing)과 투영(Projection)

이미지에서 얼굴들만을 분리해 냈다. 그러나 이제 얼굴이 다른 방향을 보고 있으면 컴퓨터에게는 전혀 다르게 보이게 되는 새로운 문제를 해결해야 한다.

인간은 두 이미지 모두 동일 인물이라는 것을 쉽게 인식할 수 있지만, 컴퓨터는 이 사진들을 완전히 다른 두 사람을 보게된다.

이를 해결하기 위해 각각의 사진을 비틀어 눈과 입술이 항상 표준 위치에 올 수 있도록 해보자.

그렇게 하기 위해서 face landmark estimation이라고 하는 알고리즘을 사용할 것이다. 기본적인 아이디어는 모든 얼굴에 존재하는 68개의 랜드마크(landmarks)라 부르는 특정 포인트(턱의 상단, 눈 바깥의 가장자리, 눈썹 안쪽의 가장자리, 등)를 찾아내는 것이다.

기계 학습 알고리즘을 훈련시켜 어떤 얼굴에서든 이러한 68개의 특정 포인트들을 찾을 수 있도록 하자.

모든 얼굴에 표시할 68개의 랜드마크(landmarks)

테스트 이미지에 68개의 얼굴 랜드마크를 표시한 결과이다.

이 기술을 동일하게 사용해서 Snapchat의 실시간 3D 얼굴 필터를 구현할 수도 있다.

눈과 입이 어디에 있는지를 알게되었으므로, 이제는 눈과 입이 최대한 가운데로 올 수 있도록 이미지를 간단하게 회전(rotate)하고, 크기를 조정(scale)하고 비틀(shear) 것이다. 여기서 3d 변형(3d warps)를 사용하지는 않는다. (이미지 왜곡이 생기기 때문) 평행선을 보존하는 회전(rotation) 및 크기 조절(scale)과 같은 기본적인 이미지 변환방법(affine transformations)만을 사용할 것이다.

이제 얼굴이 옆으로 돌아가 있어도, 눈과 입을 이미지상에서 대략 동일한 위치에 맞출 수 있다. 이렇게 함으로써 다음 단계가 훨씬 더 정확해질 것이다.

Step 3: 얼굴 인코딩

이제 문제의 핵심인 실제로 얼굴을 구별하는 단계이다.

얼굴 인식을 가장 간단하게 접근하는 방법은 앞서 Step 2에서 찾아낸 모르는 얼굴을 이미 태그가 달린 사람들의 모든 사진과 직접 비교하는 것이다. 모르는 얼굴과 매우 비슷하게 보이는 이미 태그가 달린 얼굴을 찾게되면, 분명히 같은 사람일 것이다.

그러나 Facebook과 같은 사이트는 이미 태그가 달린 모드느 얼굴과 새롭게 업로드된 사진을 일일이 반복해서 비교하기에 너무 많은 사진이 있다. (시간이 너무 오래걸림)

따라서 필요한 것은 각 얼굴에서 몇 가지 기본 측정값을 추출하는 방법이다. 그런 다음에 모르는 얼굴을 이 방법으로 측정하면, 이 측정값과 가장 가까운 값을 가지는 얼굴을 찾을 수 있다. 예를 들어, 각 귀의 크기, 눈 사이의 간격, 코의 길이 등을 측정해 볼 수 있다.

가장 신뢰할 수 있는 얼굴 측정 방법

얼굴의 데이터베이스를 만들기 위해 얼굴에서 어떤 측정값을 수집해야 할까? 최근 연구자들은 컴퓨터가 수집할 측정 값을 스스로 파악하도록 하는 것이 가장 정확한 접근 방법임을 알게 되었다. 딥러닝은 얼굴의 어느 부분이 특정에 있어 중요한 것인지 파악하는 일을 인간보다 더 잘 수행한다.

해결책은 바로 Part 3에서 했던 것처럼 딥 컨볼루션 신경망(Deep Convolutional Neural Network)을 훈련시키는 것이다. 그러나 우리가 마지막으로 했던 것처럼 사진에서 객체를 인식하도록 신경망을 훈련시키는 대신, 각 얼굴에 대해 128개의 측정값을 생성하도록 훈련시킬 것이다.

훈련과정은 3 개의 얼굴 이미지를 차례대로 확인하는 것이다.

  1. 훈련용 아는 사람의 얼굴 사진 적재(load)
  2. 동일한 아는 사람의 다른 사진 적재
  3. 전혀 다른 사람의 사진 적재

그리고 알고리즘은 세 개의 이미지 각각에 대해 현재 생성하고 있는 측정값을 확인한다. 그런 다음, 1과 2 이미지에 대해 생성한 측정값은 서로 좀 더 가깝게 하고 2와 3의 측정 값은 좀 더 멀어지도록 신경망을 조금 조정한다.

수천 명의 다른 사람들의 수백만 개의 이미지에 대해 이 단계를 수백만번 반복하면, 신경망은 각 사람에 대한 128개의 측정값을 신뢰성 있게 생성하는 방법을 배우게 된다. 동일한 사람의 10개의 다른 사진에 대해서 대략적으로 동일한 측정값을 제공해야 한다.

기계학습을 하는 사람들은 각 얼굴에 대한 128개의 측정값을 임베딩(embedding)이라고 부른다. 사진과 같이 복잡한 원시 데이터(raw data)를 컴퓨터가 생성한(computer-generated) 숫자값의 목록으로 축소한다는 아이디어는 기계 학습(트그히 언어 번역)에서 많이 사용되고 있다.

우리의 얼굴 이미지 인코딩 하기

임베딩(embeddings)을 생성할 수 있도록 컨볼루션 신경망을 훈련시키는 프로세스는 많은 양의 데이터와 컴퓨터 자원을 필용로 한다. 그러나 일단 신경망이 훈련을 마치면, 이전에 절대 본 적도 없는 얼굴에 대해서도 측정값을 생성할 수 있다. 따라서 이 단계는 딱 한 번만 수행하면 된다. 

이미 만들어진 것(OpenFace)을 활용하여 얼굴 이미지로부터 각 얼굴에 대한 1218개의 측정값을 얻어보자.

그런데 이러한 128개의 숫자들이 정확히 얼굴의 어느 부분을 측정한 것인지 사람은 알 수 없다. 그러나 여기서 중요한 점은 동일한 사람의 다른 두개의 사진에 대해 거의 같은 숫자를 생성하는가 이다.

Step 4: 인코딩에서 사람의 이름 찾기

마지막으로 해야 할 일은 테스트 이미지에서 가장 근접한 측정값을 갖고 있는 사람을 데이터베이스에서 찾아내는 것이다. 다양한 분류 알고리즘으르 사용할 수 있겠지만, 간단한 선형 SVM 분류기(classifier)를 사용할 것이다.

새로운 테스트 이미지로부터 측정값을 가져와 가장 매칭되는 아는 사람이 누구인지 알려주는 분류기(classifier)를 훈련시키고 테스트 해보자.

Will Ferrell, Chad Smith, Jimmy Falon 각각에 대한 20장 정도의 사진들에 대한 임베딩으로 분류기를 훈련시켰다.

그런 다음에 세명이 쇼에서 서로 같은 사람인척 하는 유명한 유튜브 비디오의 모든 프레임에서 분류기를 실행해 봤다.

잘 동작하는 것을 볼 수 있다.

#3. 직접 실행해 보기

지금까지 진행한 단계들을 검토해보자.

  1. 이미지의 단순화된 버전을 만들어주는 HOG 알고리즘을 사용해 사진을 인코딩한다. 이 단순화된 이미지에서 얼굴의 일반 HOG 인코딩(generic HOG encoding)과 가장 유사하게 보이는 부분을 찾는닫.
  2. 얼굴의 주요 랜드마크(landmarks)를 찾아 얼굴의 포즈(pose)를 알아낸다. 이 랜드마크를 찾으면, 이를 이용해서 눈과 입이 중앙에 오도록 이미지를 변형시킨다.
  3. 얼굴의 특징들을 측정하는 방법을 알고 있는 신경망에 중심을 맞춘 얼굴 이미지를 전달한다. 그리고 128개의 측정값을 저장한다.
  4. 과거에 측정해 놓은 모든 얼굴에 대해, 이 얼굴의 측정값에 가장 가까운 사람이 누구인지 확인한다.

이제 모든것이 어떻게 동작하는지 알게 되었다.