Face Recognition Tutorial
두 사진을 받아 얼굴 정보를 인코딩(encoding)하여 얼굴의 특징을 검출해낸 후, 비교하여 같은 사람인지 확인하는 예제를 수행하였다. 드디어 프로젝트와 관련성이 큰 활동이다.
import face_recognition
known_image = face_recognition.load_image_file("JisungPark.jpg")
unknown_image = face_recognition.load_image_file("JisungPark2.jpg")
jisungPark_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
results = face_recognition.compare_faces([jisungPark_encoding], unknown_encoding)
print(results)
'JisungPark.jpg'
'JisungPark2.jpg'
import face_recognition
known_image = face_recognition.load_image_file("JisungPark.jpg")
unknown_image = face_recognition.load_image_file("JisungPark2.jpg")
아래부터가 새로운 내용이다.
jisungPark_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
준비한 각각의 사진은 한 개의 얼굴만이 존재한다.
face_encodings()의 return 자료형은 얼굴 정보의 list이다.
따라서 [0]번째에 해당하는 얼굴 정보를 jisungPark_encoding과 unknown_encoding 변수에 저장해준다.
그렇다면 반환된 list 각각의 요소는 어떤 자료형을 가질까?
>>> print(type(jisungPark_encoding))
<class 'numpy.ndarray'>
>>> print(jisungPark_encoding.shape)
(128,)
위의 두 줄의 코드로 우리는 face_encodings()의 return 자료형이 128차원의 ndarray 임을 알 수 있다.
여기를 참고하는 것이 좋다.
results = face_recognition.compare_faces([jisungPark_encoding], unknown_encoding)
역시 마찬가지로 compare_faces()에 대한 문서를 보자.
설명에서 알 수 있는 것처럼, 매개 변수로 얼굴 값의 list를 받고, 확인하고자 하는 얼굴 값을 전달하면 bool 값으로 이루어진 list를 반환하게 된다.
본 예제에서는 한 명의 사람만 비교했지만, 여러 명의 얼굴 값을 한꺼번에 전달하여 같은 사람이 몇이나 되는지도 찾을 수 있다.
[True]
오늘 구현한 내용에 대해 Jeynman과 이야기하다가 정말 괜찮은 아이디어가 떠올랐다.
구글의 서비스 중 하나인 구글 포토는 갤러리에 저장된 인물을 (사용자에게 물어봄으로써) 비교하여 같은 인물끼리 저장하는 기능이 있다. 이 기능이 구글 포토 서비스의 얼굴 인식률을 높여주는 지는 모르겠는데, 우리 프로젝트에도 이러한 원리를 이용하여 정확도를 향상시킬 수 있지 않을까 하는 생각이 들었다.
그 방법은 face_recognition의 얼굴 특징 점들에 대한 데이터를 향상시키는 방법이다. 얼굴의 생김새에 따라 face_encodings()에 대한 반환 값은 128차원의 벡터로 생성된다고 했다. 그렇다면 같은 인물의 사진 여러 장에 대한 특징 값들을 추출한 다음, 그것들을 훈련 데이터로 삼아 이미 저장된 특징 값을 '학습'시킨다면, 그 정확도를 높일 수 있지 않을까?
오오....