python
프로그램 중에서 face_recognition
이라는 라이브러리를 이용하여 실시간으로 얼굴인식을 수행할 수 있도록 만들어 볼 것이다. python
의 face_recognition
라이브러리는 History Of Gradient(HOG) 방식
을 이용하게 된다.
먼저 얼굴인식은 알다시피, 얼굴에 대한 검출이 이루어진 후에 얼굴 인식이 이루어진다.
이 라이브러리에서 얼굴 검출은 다음과 같은 형식으로 각 픽셀에 대한 gradient
가 생성된 이후에 이루어진다.
이 사진은 어두운 부분 쪽으로 해당 pixel
이 gradient
를 생성해 내는 것을 알 수 있다.
이런 식으로 각 픽셀에 대해서 gradient
를 생성하고 기존에 눈, 코, 입과 같은 부분의 gradient
와 유사성을 판단한 후 얼굴이라고 판단되면 얼굴을 검출해 낸다.
이때 이 HOG 방법
만으로는 얼굴 검출에서 어디까지가 얼굴인지 정확히 선을 긋기 어렵다. 따라서 우리는 얼굴에 존재하는 68개의 face landmark
를 이용해서 얼굴임을 검출 해 낼 것이다. 이는 눈,코,입과 얼굴의 윤곽선이 실제 얼굴의 landmark
들과 일치하는 지를 판단해 낸다.
그리고 가장 중요한 face_recognition
에서 이용할 부분인 encoding
은 128개의 특징점을 다른 사람의 특징점과 비교해서 다른 얼굴은 특징점이 멀어질 수 있도록 128개의 값을 설정하게 되는 것을 의미한다.
그래서 다음과 같은 코드로 이미 존재하는 데이터 얼굴의 이미지 값들을 encoding 할 수 있다. (각 사진마다, 128개의 특징점을 찾음)
dirname = 'knowns'
files = os.listdir(dirname)
for filename in files:
name, ext = os.path.splitext(filename)
if ext == '.jpg':
self.known_face_names.append(name)
pathname = os.path.join(dirname, filename)
img = face_recognition.load_image_file(pathname)
try :
face_encoding = face_recognition.face_encodings(img)[0]
except Exception as e :
pass
self.known_face_encodings.append(face_encoding)
이는 저장되어있는 이미지를 불러서 encoding
하여 128개의 특징점 값을 조절하는 부분이다.
이제 얼굴을 인식하려면 known_face_enccodings
에 저장되어있는 encoding
값과 실제로 실시간으로 얼굴을 띄우고 있는 동영상의 frame
에서 얼굴을 찾아내고, encoding
한 값을 비교해야 할 것이다.
self.face_locations = face_recognition.face_locations(rgb_small_frame)
self.face_encodings = face_recognition.face_encodings(rgb_small_frame, self.face_locations)
self.face_names = []
for face_encoding in self.face_encodings:
# See if the face is a match for the known face(s)
distances = face_recognition.face_distance(self.known_face_encodings, face_encoding)
min_value = min(distances)
# tolerance: How much distance between faces to consider it a match. Lower is more strict.
# 0.6 is typical best performance.
name = "Unknown"
if min_value < 0.45:
index = np.argmin(distances)
name = self.known_face_names[index]
다음은 face_recognition
라이브러리에 있는 face_locations
와 face_encodings
를 이용하여, 얼굴을 검출 및 인식하고 이를 통해서 인식한 얼굴의 이름을 저장하는 코드이다.
한 frame
에서 얼굴이 검출 완료 되었을 경우, face_location
에 얼굴의 좌표값을 저장하게 된다. 이 좌표 값은 위에서 설명했던 대로 HOG, face landmark
기술을 사용한 것이다.
이 얼굴의 좌표값을 통해, 해당 얼굴을 얻어내고, 이를 encoding
하여 특정 128개의 값으로 만들어 내는 것이 face_encoding
함수인 것이다.
그래서 검출된 encoding
값을 우리가 이미 훈련시켜서 알아낸 다른 사람들의 얼굴값인 known_face_encodings
와 비교하여, 가장 두 특징점 사이의 거리가 작은(가장 비슷한) value
를 저장하고, 이 value
가 설정한 적정수준 (위 코드는 45%) 이하라면 (0일 수록 비슷한 얼굴이라는 뜻) 인식한 얼굴의 이름 값을 return
한다.
이를 main
에서 keyboard
에 'q'
가 들어오기 전까지 while
문을 돌려 수행하게 된다.