face_recognition을 이용하여 얼굴인식 프로그램 만들기

황동준·2021년 1월 22일
0

참고한 사이트

python 프로그램 중에서 face_recognition이라는 라이브러리를 이용하여 실시간으로 얼굴인식을 수행할 수 있도록 만들어 볼 것이다. pythonface_recognition 라이브러리는 History Of Gradient(HOG) 방식을 이용하게 된다.

먼저 얼굴인식은 알다시피, 얼굴에 대한 검출이 이루어진 후에 얼굴 인식이 이루어진다.
이 라이브러리에서 얼굴 검출은 다음과 같은 형식으로 각 픽셀에 대한 gradient가 생성된 이후에 이루어진다.

이 사진은 어두운 부분 쪽으로 해당 pixelgradient를 생성해 내는 것을 알 수 있다.

이런 식으로 각 픽셀에 대해서 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_locationsface_encodings를 이용하여, 얼굴을 검출 및 인식하고 이를 통해서 인식한 얼굴의 이름을 저장하는 코드이다.
frame에서 얼굴이 검출 완료 되었을 경우, face_location에 얼굴의 좌표값을 저장하게 된다. 이 좌표 값은 위에서 설명했던 대로 HOG, face landmark 기술을 사용한 것이다.
이 얼굴의 좌표값을 통해, 해당 얼굴을 얻어내고, 이를 encoding하여 특정 128개의 값으로 만들어 내는 것이 face_encoding 함수인 것이다.

그래서 검출된 encoding 값을 우리가 이미 훈련시켜서 알아낸 다른 사람들의 얼굴값인 known_face_encodings와 비교하여, 가장 두 특징점 사이의 거리가 작은(가장 비슷한) value를 저장하고, 이 value가 설정한 적정수준 (위 코드는 45%) 이하라면 (0일 수록 비슷한 얼굴이라는 뜻) 인식한 얼굴의 이름 값을 return 한다.

이를 main에서 keyboard'q'가 들어오기 전까지 while 문을 돌려 수행하게 된다.

profile
부담없이 기록하기

0개의 댓글