[CCTVWithAI] (2021.07.22) 개발 일지 | Dlib face_recognition으로 얼굴 인식하기

Hotaek Han·2021년 7월 22일
1

CCTVWithAI

목록 보기
16/25

🔎 얼굴 인식 하기

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 라이브러리를 불러온다.

import face_recognition

▦ 미리 준비한 두 장의 사진을 load_image_file()로 불러온다.

known_image = face_recognition.load_image_file("JisungPark.jpg")
unknown_image = face_recognition.load_image_file("JisungPark2.jpg")

아래부터가 새로운 내용이다.

▦ face_encodings() 메소드로 주어진 이미지 내의 얼굴들의 정보를 리스트로 불러온다.

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 임을 알 수 있다.

여기를 참고하는 것이 좋다.

▦ compare_faces()로 얼굴의 특징 값을 비교하여 같은 사람인지 판단하기

results = face_recognition.compare_faces([jisungPark_encoding], unknown_encoding)

역시 마찬가지로 compare_faces()에 대한 문서를 보자.


설명에서 알 수 있는 것처럼, 매개 변수로 얼굴 값의 list를 받고, 확인하고자 하는 얼굴 값을 전달하면 bool 값으로 이루어진 list를 반환하게 된다.

본 예제에서는 한 명의 사람만 비교했지만, 여러 명의 얼굴 값을 한꺼번에 전달하여 같은 사람이 몇이나 되는지도 찾을 수 있다.

최종 실행 결과

[True]



오늘 구현한 내용에 대해 Jeynman과 이야기하다가 정말 괜찮은 아이디어가 떠올랐다.

구글의 서비스 중 하나인 구글 포토는 갤러리에 저장된 인물을 (사용자에게 물어봄으로써) 비교하여 같은 인물끼리 저장하는 기능이 있다. 이 기능이 구글 포토 서비스의 얼굴 인식률을 높여주는 지는 모르겠는데, 우리 프로젝트에도 이러한 원리를 이용하여 정확도를 향상시킬 수 있지 않을까 하는 생각이 들었다.

그 방법은 face_recognition의 얼굴 특징 점들에 대한 데이터를 향상시키는 방법이다. 얼굴의 생김새에 따라 face_encodings()에 대한 반환 값은 128차원의 벡터로 생성된다고 했다. 그렇다면 같은 인물의 사진 여러 장에 대한 특징 값들을 추출한 다음, 그것들을 훈련 데이터로 삼아 이미 저장된 특징 값을 '학습'시킨다면, 그 정확도를 높일 수 있지 않을까?

오오....

0개의 댓글