Facial Recognition
얼굴 인식은 얼굴 임베딩을 비교해 사람의 신원을 식별하거나 확인합니다. 파이프라인 작동 방식, 검증과 식별의 차이, 편향, 프라이버시를 다룹니다.
얼굴 인식은 얼굴 이미지와 저장된 얼굴을 비교해 사람을 식별하거나 인증하는 생체 인식 기술입니다. 최신 시스템은 딥러닝을 사용해 각 얼굴을 임베딩으로 변환합니다. 임베딩은 흔히 faceprint라고 부르는 숫자 벡터이며, 두 얼굴의 임베딩이 얼마나 유사한지에 따라 같은 사람인지 판단합니다. 얼굴 인식은 휴대폰 잠금 해제, 승객의 공항 게이트 통과 간소화, 온라인 은행 계좌 개설 시 고객 인증 등에 사용됩니다. 또한 사람의 인지 없이 얼굴을 촬영할 수 있기 때문에 컴퓨터 비전 분야에서 가장 엄격하게 규제되는 용도 중 하나입니다.
얼굴 인식의 작동 방식#
인식 시스템은 각 이미지에서 네 단계를 수행합니다:
- 탐지: 얼굴 탐지기가 각 얼굴을 찾아 바운딩 박스와 몇 개의 얼굴 랜드마크를 반환합니다.
- 정렬: 얼굴을 회전하고 크기를 조정한 뒤 잘라내어 눈, 코, 입이 고정된 위치에 놓이게 합니다. 이를 통해 머리 자세와 거리에서 비롯되는 변화를 대부분 제거합니다.
- CNN을 사용한 인코딩: 네트워크는 정렬된 크롭을 고정 길이의 임베딩으로 변환합니다.
- 코사인 유사도를 사용한 매칭: 새 임베딩을 등록된 임베딩과 비교하고 임계값에 따라 일치 여부를 결정합니다. 대규모 배포에서는 빠른 검색을 위해 등록된 faceprint를 벡터 데이터베이스에 저장합니다.
얼굴 탐지는 객체 탐지 문제입니다. WIDER FACE와 같은 얼굴 데이터셋으로 미세 조정한 Ultralytics YOLO26 모델은 엣지 카메라에서 실시간으로 실행되어 후속 단계에 얼굴 박스를 전달할 수 있습니다. 딥러닝 이전의 시스템은 수작업으로 설계된 특징에 의존했습니다. 여기에는 얼굴 랜드마크 간 거리, Eigenfaces, 로컬 바이너리 패턴이 포함됩니다. 조명, 표정, 나이가 바뀌어도 학습된 임베딩이 훨씬 안정적이어서 이러한 특징을 대체했습니다. 2015년 FaceNet은 트리플렛 손실을 사용해 128차원 임베딩을 직접 학습했으며, ArcFace와 같은 마진 기반 손실은 서로 다른 사람의 임베딩을 더 멀리 떨어뜨립니다. 매칭 단계에서는 서로 다른 두 가지 질문을 다룹니다.
검증(1:1)은 휴대폰이 소유자를 확인하는 경우처럼 얼굴이 주장된 신원과 일치하는지 확인합니다. 식별(1:N)은 전체 갤러리를 검색합니다. 예를 들어 출입 통제 시스템은 얼굴을 등록된 모든 직원과 대조합니다. OpenCV Zoo 모델은 몇 줄의 코드로 전체 파이프라인을 실행할 수 있습니다. 아래 코드는 이미지의 얼굴을 등록한 다음, 좌우 반전한 이미지에서 얼굴을 탐지해 해당 갤러리와 대조합니다.
import urllib.request
import cv2
# Download OpenCV Zoo's face detector (YuNet), face recognizer (SFace), and a test image
zoo = "https://github.com/opencv/opencv_zoo/raw/main/models"
urllib.request.urlretrieve(f"{zoo}/face_detection_yunet/face_detection_yunet_2023mar.onnx", "yunet.onnx")
urllib.request.urlretrieve(f"{zoo}/face_recognition_sface/face_recognition_sface_2021dec.onnx", "sface.onnx")
urllib.request.urlretrieve("https://ultralytics.com/images/bus.jpg", "bus.jpg")
img = cv2.imread("bus.jpg")
detector = cv2.FaceDetectorYN.create("yunet.onnx", "", (img.shape[1], img.shape[0]))
recognizer = cv2.FaceRecognizerSF.create("sface.onnx", "")
# Enroll each detected face as an aligned 128-D embedding
gallery = [recognizer.feature(recognizer.alignCrop(img, face)) for face in detector.detect(img)[1]]
# Identify the faces of a mirrored copy against the gallery (SFace match: cosine >= 0.363)
mirror = cv2.flip(img, 1)
for face in detector.detect(mirror)[1]:
probe = recognizer.feature(recognizer.alignCrop(mirror, face))
print([round(recognizer.match(probe, g, cv2.FaceRecognizerSF_FR_COSINE), 2) for g in gallery])[0.87, 0.06]과 [0.09, 0.89]을 출력합니다. 좌우 반전된 각 얼굴은 해당 얼굴 자체의 등록 임베딩과 비교할 때 0.363 임계값보다 훨씬 높은 점수를 얻고, 다른 사람의 임베딩과 비교할 때는 훨씬 낮은 점수를 얻습니다.
얼굴 인식과 관련 용어 비교#
- 얼굴 감지: 이미지에서 얼굴이 있는 위치를 찾지만 누구의 얼굴인지는 판별하지 않습니다. 얼굴 인식의 첫 단계이며 카메라 자동 초점과 얼굴 흐림 처리에도 사용됩니다.
- 얼굴 분석 및 정서 컴퓨팅: 신원을 확인하지 않고 표정, 머리 자세, 나이와 같은 속성을 추정합니다.
- 객체 재식별(Re-ID): 옷차림과 같은 전신 외형을 기준으로 카메라 간 사람을 매칭합니다. 뒤에서 촬영하거나 해상도가 낮아도 작동하지만 짧은 시간 범위에서만 사용할 수 있습니다.
실제 적용 사례#
- 기기 잠금 해제: 휴대폰은 소유자를 1초도 안 되는 시간에 인증합니다. Apple의 Face ID는 30,000개가 넘는 적외선 점을 투사해 깊이 맵을 생성하므로 인쇄된 사진으로는 이를 모방할 수 없습니다.
- 여행 및 국경 통제: 자동 전자 게이트는 여행자의 실시간 사진을 전자여권 칩에 저장된 사진과 비교합니다.
- 신원 인증: 은행과 온라인 서비스는 계좌 개설 시 라이브니스 검사와 함께 셀카를 정부 발급 신분증의 사진과 비교합니다.
- 사진 정리: 사진 앱은 개인 사진 라이브러리에서 얼굴을 그룹화해 사용자가 가족 구성원의 사진을 모두 찾을 수 있도록 합니다.
정확도, 편향 및 스푸핑#
모든 시스템은 두 가지 오류 간 균형을 맞춥니다. 오매칭은 다른 사람을 받아들이고, 미매칭은 올바른 사람을 거부하며, 유사도 임계값이 이 균형을 결정합니다. 과거에 FRVT로 불렸던 NIST 얼굴 인식 기술 평가(FRTE)는 수백만 장의 이미지로 상용 알고리즘을 벤치마크합니다. 2019년 99개 개발자의 알고리즘 189개를 조사한 결과, 대다수 알고리즘에서 인구통계학적 차이에 따른 오탐률 차이가 발견되었으며 이는 알고리즘 편향의 대표적 사례입니다. 사진, 화면 재생, 마스크도 얼굴 인식을 속일 수 있으므로 실제 운영 시스템은 깊이 센서, 적외선 또는 미세한 움직임 분석을 사용해 프레젠테이션 공격 탐지 기능을 추가합니다. 이 기능은 흔히 라이브니스 탐지라고 합니다.
개인정보 보호 및 규제#
Faceprint는 생체 데이터이므로 법률상 매우 민감한 개인정보로 취급됩니다. GDPR에 따르면 사람을 식별하는 데 사용되는 생체 데이터는 명시적인 법적 근거가 필요한 특별 범주에 속합니다. 일리노이주의 Biometric Information Privacy Act는 기업이 faceprint를 수집하기 전에 서면 동의를 받도록 요구합니다. EU AI Act는 규제를 더 강화합니다. 2025년 2월 2일부터 인터넷이나 CCTV 이미지의 무차별적인 스크래핑을 통한 얼굴 인식 데이터베이스 구축과, 엄격하게 정의된 몇 가지 경우를 제외한 법 집행 목적의 공공장소 실시간 원격 생체 식별을 금지합니다.










