AI 탐구노트

DeepFace를 이용한 안면 속성 분석 (표정,연령 등) 본문

DIY 테스트

DeepFace를 이용한 안면 속성 분석 (표정,연령 등)

42morrow 2024. 10. 30. 12:38

 

1.개요

1.1. 얼굴 속성 분석이란

 

얼굴 인식 기술이 점점 대중화되면서, 이에 대한 사용자의 반응도 각기 다르게 나타나고 있습니다. 특히 많은 사용자들은 자신의 얼굴이 카메라에 노출되거나 그로 인해 개인정보가 수집될 가능성에 대해 민감하게 반응합니다. 사용자는 편리한 서비스 제공의 필요성을 이해하면서도, 어디까지나 그 ‘편리함’이 본인의 프라이버시를 지켜주며 이뤄지기를 원하죠. 반면, 서비스 제공자는 더 나은 맞춤형 서비스를 위해 다양한 인구 통계 데이터를 얻고 싶어 합니다. 사용자 성향에 맞춘 광고 제공, 감정에 따른 콘텐츠 추천 등 다양한 가능성이 열려 있기에 그만큼 데이터의 확보가 중요하게 여겨지죠. 이처럼 양쪽의 입장이 뚜렷하게 나뉘는 상황에서 AI 기술이 과연 이 간극을 어떻게 좁힐 수 있을지 궁금해집니다.

 

이런 갈등 속에서 얼굴 속성 분석 기술은 민감한 개인정보를 보호하는 동시에, 서비스 제공자의 데이터 수요를 충족시키는 대안이 될 수 있습니다. 얼굴 속성 분석은 개별 사용자를 특정하는 정보가 아닌, 익명성을 보장한 상태에서 인구 통계적 특성을 파악하는 방법입니다. 예를 들어, 사용자의 나이대나 성별, 감정 상태와 같은 정보는 제공하지만, 누구인지 특정할 수 있는 민감한 데이터는 수집하지 않습니다. 이런 데이터들은 집합적으로 활용될 때 사용자 경험 개선에 큰 도움이 됩니다. 광고를 예로 든다면, 특정 연령대나 성별이 자주 방문하는 시간대, 또는 감정적 반응이 긍정적인 광고 소재가 무엇인지 알 수 있어 사용자에게 더 적합한 콘텐츠를 제공하는 데 활용될 수 있습니다. 개별 사용자의 신원 정보를 알지 않아도 성향에 맞춘 서비스를 제공하는 것이 가능한 것이죠.

 

AI가 이러한 얼굴 속성 분석 방식을 통해 사용자와 서비스 제공자 간의 간극을 좁힐 수 있는 이유는 익명화된 인구 통계 데이터를 바탕으로 상호 신뢰를 높이기 때문입니다. 이러한 기술을 활용하면 개인별 식별 없이도 원하는 서비스의 수준을 유지할 수 있고, 사용자 역시 ‘나의 정보를 수집하고 활용하는 것이 아니라 집단적 데이터로 활용된다’는 인식 속에서 안심하고 서비스를 사용할 수 있습니다. AI는 이 과정을 통해 민감한 개인 정보를 침해하지 않으면서도 서비스의 편의성을 유지하는 타협점을 제공하는 셈입니다.

 

 

1.2 테스트 대상 솔루션

 

이번 글에서는 공개된 모델과 도구를 이용해 영상 속에 등장하는 인물들의 얼굴 속성을 분석하고 추출하는 것을 해 보겠습니다. 대상이 되는 것은 deepface로 얼굴인식 외에도 얼굴의 속성 (나이, 성별, 감정 및 인종)을 분석할 수 있는 프레임워크인데, 내부적으로는 VGG-Face, FaceNet, OpenFace, DeepFace, DeepID, ArcFace, Dlib, SFace 등의 모델을 wrapping하고 있습니다. 즉,  각각의 모델들을 개별적으로 환경설정할 필요없이 골라서 쓸 수 있다는 얘기입니다. deepface는 공개된 지는 좀 됐는데 그 뒤에 추가적인 업데이트가 계속 되어오고 있습니다. 

 

참고로 아래는 deepface에서 지원되는 인식, 감지 모델들을 보여주고 있습니다. 

 

그림 : face recognition 백엔드 모델들 (출처 : Deeface github repo)

 

그림 : Face detection & alignment 모델 지원

 

2.환경 구성

2.1. 가상환경 생성

$ conda create -n deepface python=3.11
$ conda activate deepface

 

2.2. DeepFace 다운로드 및 패키지 설치

 

해당 기능을 제공하는 deepface 패키지를 이용합니다.  필요한 패키지는 함께 설치됩니다. 생각보다 많은 패키지 (예: tensorflow, opencv, mtcnn, flask, retina_face 등등)이 설치됩니다. 

$ pip install deepface

# 실행 시 Tensorflow에서 keras 모듈을 필요로 합니다.
$ pip install tf-keras

 

또는 github repo의 소스를 이용하는 방법으로 하셔도 됩니다. 

$ git clone https://github.com/serengil/deepface.git
$ cd deepface
$ pip install -e .

 

2.3. 사전 학습 모델 가중치 다운로드

실행 시 필요한 백엔드 모델들을 자동으로 다운로드하므로 별도의 가중치 다운로드가 필요치 않습니다. 얼굴 분석 기능을 돌려보면 age, gender, expression 등 개별 모델들을 다 다운받기 때문이죠. 다만, 선택한 모델에 따라 경우에 따라서는 특정 모델과 관련된 패키지를 설치하라는 메시지가 뜰 수 있는데 로그 상에 표시된 사항대로 설치를 진행하면 됩니다. 

 

2.4. 테스트 용 데이터 다운로드

deepface의 github repo에 공개되어 있는 dataset 상의 이미지들을 이용하겠습니다. 

 

deepface/tests/dataset at master · serengil/deepface

A Lightweight Face Recognition and Facial Attribute Analysis (Age, Gender, Emotion and Race) Library for Python - serengil/deepface

github.com

 

특정 폴더를 다운로드 받는 방법은 이전에 작성한 다음 글을 참고하세요.

 

Github repository의 특정 폴더만 다운로드하는 법

1.개요 Github Repository 전체를 Clone 하지 않고 하부에 있는 특정 폴더의 파일만 다운로드 받고자 합니다. 이유는 해당 Repository에서 제공하는 코드는 사용하지 않지만, 공개된 이미지나 데이터셋 혹

42morrow.tistory.com

 

3.테스트 코드

테스트에 사용한 코드는 아래와 같습니다. if 문은 각 부분을 하나씩 테스트 해 보기 위한 것이니 실행하고자 하는 것에 맞는 것으로 선택하시면 됩니다. 

from deepface import DeepFace
from PIL import Image

# 안면 인식 백엔드 모델들
models = [
  "VGG-Face", "Facenet", "Facenet512", "OpenFace", "DeepFace", "DeepID", 
  "ArcFace", "Dlib", "SFace", "GhostFaceNet", 
]

# 감지 및 정렬 백엔드 모델들
backends = [
  'opencv', 'ssd', 'dlib', 'mtcnn', 'fastmtcnn','retinaface', 
  'mediapipe','yolov8','yunet','centerface',
]

# 안면 유사도 분석
metrics = ["cosine", "euclidean", "euclidean_l2"]


if 0: # 1.두 사진에서 동일인 여부 판별 (verification)
  result = DeepFace.verify(
    img1_path = "dataset/img1.jpg",
    img2_path = "dataset/img2.jpg",
    model_name = models[0],
    distance_metric = metrics[0],
    detector_backend = backends[0],
  )

if 0: # 2.폴더(DB) 내 동일한 인물 찾기 (recognition)
  dfs = DeepFace.find(
    img_path = "dataset/img1.jpg",
    db_path = "./dataset",
    model_name = models[1],
    distance_metric = metrics[2],
  )

if 0: # 3.안면 특징점 임베딩값 (embeddings)
  embedding_objs = DeepFace.represent(
    img_path = "dataset/img1.jpg",
    model_name = models[2],
  )

if 0: # 4.얼굴 속성 분석 (facial analysis)
  objs = DeepFace.analyze(
    img_path = "dataset/img1.jpg", 
    actions = ['age', 'gender', 'race', 'emotion'],
    detector_backend = backends[3],
  )

if 0: # 5.얼굴 영역 추출 및 정렬
  objs = DeepFace.extract_faces(
    img_path = "dataset/img1.jpg", 
    detector_backend = backends[4],
  )
 

if 1: # 6.카메라의 영상 스트림으로 실시간 분석
  DeepFace.stream(db_path = "dataset")

 

4.테스트 결과

 

4.1. 두 사진의 동일인 여부 판별 (verification)

 

{'verified': True, 'distance': 0.413676, 'threshold': 0.68, 'model': 'VGG-Face', 'detector_backend': 'opencv', 'similarity_metric': 'cosine', 'facial_areas': {'img1': {'x': 339, 'y': 218, 'w': 768, 'h': 768, 'left_eye': (850, 524), 'right_eye': (571, 517)}, 'img2': {'x': 524, 'y': 201, 'w': 491, 'h': 491, 'left_eye': (858, 388), 'right_eye': (663, 390)}}, 'time': 2.12}

 

4.2. 폴더(DB) 내 동일한 인물 찾기 (recognition)

img1.jpg가 안젤리나 졸리의 사진인데, 동일 폴더에 아래와 같이 포함된 것을 보여줍니다. 검색된 사진 가운데 couple.jpg는 안젤리나 졸리와 전 남편이었던 브래드 피트가 함께 있는 사진입니다. 

[                         identity  ...  distance
0              ./dataset/img1.jpg  ...  0.000000
1             ./dataset/img11.jpg  ...  0.596905
2              ./dataset/img7.jpg  ...  0.630545
3  ./dataset/img11_reflection.jpg  ...  0.630973
4             ./dataset/img10.jpg  ...  0.634968
5              ./dataset/img4.jpg  ...  0.661619
6            ./dataset/couple.jpg  ...  0.681980
7              ./dataset/img6.jpg  ...  0.685915
8              ./dataset/img2.jpg  ...  0.688328
9              ./dataset/img5.jpg  ...  0.693481

 

 

4.3. 안면 특징점 임베딩값 (embeddings)

[{'embedding': [-0.5402745008468628, 0.32142946124076843, -0.9510715007781982, -0.658436119556427, 0.9199150204658508, -0.48374444246292114, 1.9727234840393066, 1.3705884218215942, 0.28502756357192993, -0.8275978565216064, -0.1290021687746048, 1.447482705116272, 0.5489557981491089, -1.8298084735870361, -1.6478402614593506, 0.2985033094882965, 0.18562425673007965, -0.11836867034435272, -0.6524710655212402, -1.136047601699829, -0.2709304988384247, 0.636145293712616, -1.4449926614761353, -0.3234444856643677, 0.4206863343715668, 0.8960549831390381, 0.3974342942237854, -1.4883925914764404, -0.566838264465332, 0.38833853602409363, 0.3526798188686371, -0.952433168888092, 1.6092506647109985, -0.8504400253295898, -0.10600200295448303, 0.4001097083091736, 0.3321925401687622, -0.5144964456558228, 0.38610774278640747, -0.373660147190094, 0.31893521547317505, -3.0288729667663574, 0.07926283776760101, -0.6028822064399719, -1.2004642486572266, 0. ...

 

4.4. 얼굴 속성 분석 (facial analysis) 

[{'age': 29, 'region': {'x': 435, 'y': 172, 'w': 560, 'h': 837, 'left_eye': (863, 522), 'right_eye': (582, 518)}, 'face_confidence': 0.97, 'gender': {'Woman': 99.99227523803711, 'Man': 0.00771851118770428}, 'dominant_gender': 'Woman', 'race': {'asian': 5.028232932090759, 'indian': 12.646105885505676, 'black': 2.6449406519532204, 'white': 33.912888169288635, 'middle eastern': 18.738949298858643, 'latino hispanic': 27.028879523277283}, 'dominant_race': 'white', 'emotion': {'angry': 6.249409498432534e-17, 'disgust': 1.6032065799467416e-32, 'fear': 5.017198744555422e-23, 'happy': 100.0, 'sad': 1.083640377883238e-13, 'surprise': 1.5794619301692792e-10, 'neutral': 2.136194970914218e-08}, 'dominant_emotion': 'happy'}]

 

4.5. 얼굴 영역 추출 및 정렬

[{'face': array([[[0.68235294, 0.69411765, 0.69019608],
        [0.68627451, 0.68627451, 0.68627451],
        [0.68235294, 0.69019608, 0.68627451],
        ...,
        [0.19607843, 0.19607843, 0.19215686],
        [0.18431373, 0.18431373, 0.17254902],
        [0.18431373, 0.18039216, 0.16470588]]]), 'facial_area': {'x': 422, 'y': 174, 'w': 587, 'h': 825, 'left_eye': (865, 521), 'right_eye': (582, 517)}, 'confidence': 1.0}]

 

 

4.6. 카메라 영상 스트림으로 실시간 분석

사진 :웹캠 입력으로 실시간 분석 진행하는 예시

 

 

 

5.테스트 후기

몸 동작을 파악하기 위한 keypoint 기반의 pose 예측을 제외하고는, 대부분의 모델들이 안면(얼굴)에 대한 분석을 위주로 하는 경우가 많습니다. 그만큼 안면은 많은 정보를 파악할 수 있는 부분이라는 얘기죠. 간단한 설정과 코드만으로 이렇게 다양한 정보를 취득할 수 있도록 만들어진 deepface는 초보자도 쉽게 이용할 수 있는 훌륭한 도구라 생각됩니다. 경량화와 전송속도 최적화 등이 적용되면 임베디드 보드나 엣지 서버 등에서 충분히 활용할 수 있을 것 같기도 하구요. 

 

하지만, 다양한 영상에서 테스트를 해 보시면 금방 이해하실 것이라 생각되는데, 제 경우처럼 간단한 데모 테스트를 하는데는 문제가 없겠지만, 실제 서비스를 해야 한다면 당연히 모델의 성능 향상을 위한 파인튜닝이나 전이학습 같은 과정이 있어야 합니다. 

 

 

이번 글에서는 안면 속성을 분석하는 모델의 테스트를 진행해 봤습니다.