Artificial Intelligence/vision

DeepFace의 analyze 결과 출력 에러 발생 시 (TypeError: list indices must be integers or slices, not str) 해결방법

변화의 물결1 2024. 3. 29. 00:05

 

 

 

안녕하세요.

 

 얼굴인식 혹은 안면인식 오픈소스를 찾다가 python으로 된 DeepFace 프레임워크를 발견했습니다. 간단하게 설치하고, 예제코드를 실행하는 중에 예전 코드로는 출력이 잘 되지 않는 부분이 있어서 간단하게 수정한 것을 남겨 보았습니다.

 


 

1. DeepFace 란

 

 

 

   Deepface is a lightweight face recognition and facial attribute analysis (age, gender, emotion and race) framework for python. It is a hybrid face recognition framework wrapping state-of-the-art models: VGG-Face, Google FaceNet, OpenFace, Facebook DeepFace, DeepID, ArcFace, Dlib, SFace and GhostFaceNet. 

 <출처 : https://github.com/serengil/deepface>

 

- 간단하게 말하면, 경량화한 얼굴인식과 분석(나이, 성별, 감정, 인종)하는 파이썬으로 된 프레임워크입니다.

 

 

2. 설치 및 실행

 

   처음에 PyCharm에서 가상환경 만들어서 실행했는데 모델 다운로드 속도와 컴퓨터 사양 (i5, gtx1070) 이 좋지 않아서 느렸습니다. 그러나 실행에는 문제없었습니다. 그래서 그냥 colab에서 다시 테스트하였습니다.

 

 

1) DeepFace 설치

 

   DeepFace는 소스 다운로드해서 설치할 수도 있지만, 간단하게 pip로 설치했습니다.

 

 

!pip install deepface

 

 

 

 

2) 간단한 코드 확인

 

  기본적인 코드에서는 간단하게 detectFace 함수를 사용하고 있는데, "Function detectFace is deprecated. Use extract_faces instead."라는   이상 권장하지 않는다는 메시지가 나와서 extract_faces 변경했습니다.

 

  먼저 테스트할 사진을 올리고 코드를 실행시키면 얼굴 부분만 출력되는 것을 확인할 수 있습니다. 런타임 유형을 TPU GPU로 해야 빠르게 작동하는 것을 알 수 있습니다.

 

원본 이미지 확인

 

 

  DeepFace.extract_faces 함수사용해서 얼굴 추출

 

 

 

  

import cv2
import matplotlib.pyplot as plt
from deepface import DeepFace

img_path = "oli1.jpg"

img = cv2.imread(img_path) # 이미지 확인
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

# 얼굴 검출 모델 목록 (원하는 모델 선택 사용)
detection_models = ['opencv', 'ssd', 'dlib', 'mtcnn', 'retinaface', 'mediapipe']

# 얼굴 검출 및 정렬 진행
face = DeepFace.extract_faces(img_path=img, target_size=(224, 224), detector_backend=detection_models[4])

# 얼굴 영역 확인
plt.imshow(face[0]['face'])

 

 

3. analyze 리턴 사용 시 에러 발생 부분

 

1) 테스트 코드 추가

  

actions = ['age', 'gender', 'race', 'emotion']
demography = DeepFace.analyze("oli1.jpg",actions = actions)

print("Age: ", demography["age"])
print("Gender: ", demography["dominant_gender"])
print("Emotion: ", demography["dominant_emotion"])
print("Race: ", demography["dominant_race"])

 

 

2) 에러 발생

 

  actions 마다 필요한 가중치 파일을 다운로드한 다음에 demography 변수에 결과를 저장합니다. 그 후에 출력하는 중에 아래와 같이 에러가 발생합니다.

 

  리스트 형인데 문자열 인덱스를 사용해서 리스트에 접근하려고 해서 오류가 발생했다는 것입니다. 현재 DeepFace(0.0.89)에서는 리턴 값 형태가 변경되었다고 추측됩니다. 그래서 이전 글에 올라온 소스로 하면 동일한 에러가 발생할 것입니다.

 

"TypeError: list indices must be integers or slices, not str"

 

 

  

4. 해결방법

 

1) 간단하게 정수 인덱스 코드 추가

 

 

 

 

actions = ['age', 'gender', 'race', 'emotion']
demography = DeepFace.analyze("oli1.jpg",actions = actions)

# 분석 결과가 리스트의 첫 번째 요소에 있으므로 이를 선택
result_dict = demography[0]

print("\n")
print("Age: ", result_dict["age"])
print("Gender: ", result_dict["dominant_gender"])
print("Emotion: ", result_dict["dominant_emotion"])
print("Race: ", result_dict["dominant_race"])

 

 

2) for 문을 사용

 

  for문으로 demography_objs의 각 요소(element)가 demography라는 변수에 할당(assign) 시킵니다.

 

 

 

 

actions = ['age', 'gender', 'race', 'emotion']
demography_objs = DeepFace.analyze("oli1.jpg",actions = actions)

for demography in demography_objs:
  print("Age: ", demography["age"])
  print("Gender: ", demography["dominant_gender"])
  print("Emotion: ", demography["dominant_emotion"])
  print("Race: ", demography["dominant_race"])

 

 

  위와 같이 코드를 실행시키면 4가지 결과 정보를 확인할 수 있으며, print(demography_objs)를 하면 상세한 정보(구조체) 형태로 값을 확인할 수 있습니다.

 

  DeepFace에 많은 사진을 이용해 본 것은 아니지만, 나이는 조금 젊게 보는 것 같고 헤어스타일과 화장 등으로 여성이 구분되는 듯하며 모든 항목에서 잘 맞는다고 말하기에는 부족함이 있다고 느겼습니다.

 

 그리고 테스트하는 것은 쉬울 수 있으나 내부적인 알고리즘이나 원리를 알려면 공부가 필요합니다. 참고 삼아  원리에 대한 읽을거리가 있어 공유드립니다.

 

https://www.geeksforgeeks.org/deep-face-recognition/

 

Deep Face Recognition - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

 

감사합니다.

 

 

<참고사이트>

1. serengil/deepface

https://github.com/serengil/deepface/

2. deepface 0.0.89

https://pypi.org/project/deepface/

3. 사진 : 올리비아 핫세(허시) Olivia Hussey

 

 

 

반응형