iBetter Books
수정

face_recognition의 매력은 PART 04에서 배운 임베딩 인식 전체를 함수 두세 개로 끝낸다는 점입니다. 이 장에서는 사진에서 얼굴 인코딩(이 라이브러리가 임베딩을 부르는 이름)을 뽑고, 두 얼굴이 같은 사람인지 비교하는 가장 기본적인 흐름을 익힙니다.

인코딩 = PART 04의 임베딩

face_recognition은 임베딩을 인코딩(encoding)이라 부릅니다. 이름만 다를 뿐 PART 04에서 다룬 그 개념입니다. 단, 이 라이브러리는 dlib 기반이라 임베딩 길이가 128차원입니다(facenet-pytorch의 512차원보다 짧습니다). 길이가 달라도 "같은 사람은 가깝고 다른 사람은 멀다"는 원리는 똑같습니다.

가장 기본이 되는 코드는 다음과 같습니다.

# 파일: encode.py"""사진에서 128차원 얼굴 인코딩을 뽑는다."""import face_recognition# 이미지를 RGB 배열로 읽는다 (이 라이브러리 전용 로더)img = face_recognition.load_image_file("person.jpg")# 사진 속 모든 얼굴의 인코딩 목록 (얼굴 하나당 128차원 배열)encodings = face_recognition.face_encodings(img)print(f"검출된 얼굴: {len(encodings)}개")if encodings:    print(f"인코딩 길이: {len(encodings[0])}")   # 128

load_image_file로 사진을 읽고 face_encodings로 인코딩을 뽑습니다. 이 한 함수가 내부에서 "얼굴 검출 → 랜드마크 → 정렬 → 임베딩"을 모두 처리합니다. PART 02·03에서 단계별로 배운 과정이 여기서는 한 줄에 압축되어 있는 셈입니다. 사진에 얼굴이 여럿이면 인코딩도 여럿 나옵니다.

두 얼굴 비교하기 — 두 가지 방법

인코딩을 뽑았으면 비교는 두 갈래입니다. 참/거짓으로 바로 받거나, 거리 숫자를 받아 직접 판단하거나입니다.

# 파일: compare.py"""두 사진이 같은 사람인지 비교한다."""import face_recognitionimg1 = face_recognition.load_image_file("a.jpg")img2 = face_recognition.load_image_file("b.jpg")enc1 = face_recognition.face_encodings(img1)[0]enc2 = face_recognition.face_encodings(img2)[0]# 방법 1: 참/거짓으로 바로 판정 (tolerance가 임계값)result = face_recognition.compare_faces([enc1], enc2, tolerance=0.6)print("같은 사람?", result[0])# 방법 2: 거리 숫자를 받아 직접 해석 (작을수록 닮음)distance = face_recognition.face_distance([enc1], enc2)[0]print(f"거리: {distance:.3f}")

compare_faces는 PART 04의 임계값 판정을 대신 해 줍니다. tolerance가 바로 그 임계값으로, 거리가 이 값보다 작으면 True(같은 사람)를 줍니다. 반면 face_distance는 판정 없이 거리 숫자만 돌려주어, 우리가 직접 기준을 적용할 수 있게 합니다. 두 함수 모두 첫 인자로 "비교 대상 목록"을 받는데, 이는 다음 장에서 여러 명과 한 번에 비교할 때 진가를 발휘합니다.

tolerance, 기본값 0.6의 의미

tolerance의 기본값은 0.6입니다. PART 04에서 말했듯 이 값은 절대적이지 않습니다. 0.6은 dlib 모델에 맞춘 일반적인 출발점일 뿐, 더 엄격하게 하려면 낮추고(예: 0.5) 더 너그럽게 하려면 높입니다.

tolerance 효과 적합한 곳
0.5 (엄격) 오인 적음, 본인 거부 늘 수 있음 보안 민감
0.6 (기본) 균형 일반
0.65↑ (너그럼) 잘 통과, 오인 늘 수 있음 편의 우선

실무 팁. face_encodings가 빈 리스트를 돌려줄 수 있습니다. 사진에서 얼굴을 못 찾은 경우입니다. 위 예제처럼 [0]으로 첫 인코딩을 바로 꺼내면, 얼굴 없는 사진에서 IndexError로 멈춥니다. 실제 코드에서는 if not encodings: continue처럼 빈 경우를 먼저 거르세요. PART 04의 facenet None 검사와 같은 맥락입니다.

이 장에서 기억할 것

face_recognition은 임베딩을 인코딩이라 부르며(dlib 기반 128차원), face_encodings로 "검출·정렬·임베딩"을 한 줄에 처리합니다. 비교는 참/거짓을 주는 compare_faces(tolerance가 임계값)와 거리를 주는 face_distance 두 가지가 있습니다. 얼굴을 못 찾으면 빈 리스트가 나오니 검사가 필수입니다. 다음 장에서는 여러 사람의 인코딩에 이름표를 붙여 등록부(얼굴 DB)를 만듭니다.