JUST WRITE

[Vision] GraphDB로 얼굴인식을?!?!(2) - deepFace로 얼굴 이미지 Feature 추출 본문

AI

[Vision] GraphDB로 얼굴인식을?!?!(2) - deepFace로 얼굴 이미지 Feature 추출

천재보단범재 2023. 5. 7. 18:45

deepFace로 얼굴 이미지 Feature 추출

deepFace로 얼굴 이미지 Feature 추출

저번 포스팅에서 GraphDB 중 하나인 Neo4j를 AWS EC2에 설치하였습니다.

 

[Vision] GraphDB로 얼굴인식을?!?!(1) - neo4j 구축하기

GraphDB로 얼굴인식을?!?! Face Recognition은 지문, 동공 인식과 더불어 보안 시스템에 많이 활용되고 있습니다. 요즘 Vision과관련한 Project를 준비하다 보니 Vision 관련 논문도 보고 있습니다. 그러다 팀

developnote-blog.tistory.com

이번 포스팅에서는 이미지에서 얼굴의 Feature을 추출해 보도록 하겠습니다.

deepFace란?!

얼굴 이미지의 Feature을 추출해서 Feature들을 비교하여 얼굴 인식을 합니다.

얼굴 인식은 크게 2가지로 나눌 수 있습니다.

  • 얼굴검증(Face Verification) -> 2개의 얼굴이 같은지 비교 (1:1)
  • 얼굴식별(Face Identification) -> 입력되는 1개의 얼굴이 누구의 얼굴인지 판별 (1:N)

이번에는 얼굴식별을 진행해보려고 합니다.

얼굴의 Feature는 deepFace라는 얼굴 인식 관련 python framework을 이용하였습니다.

 

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

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

github.com

얼굴 이미지를 통해 나이, 성별, 감정, 인종 등을 분석할 수 있습니다.

Google FaceNet, Facebook DeepFace 등 다양한 모델을 활용할 수 있습니다.

deepFace를 활용해서 얼굴 이미지에서 Feature를 추출하고 Neo4j에 저장까지 진행하겠습니다.

Feature 추출

이번 예제에서 쓸 이미지는 deepFace에서 제공하는 sample 이미지를 사용하였습니다.

안젤리나 졸리, 레오나르도 디카프리오, 맷 데이먼 등 유명 배우들의 이미지들이 있습니다.

deepFace Github에서 직접 다운로드하여도 되지만 저는 project clone 해서 사용하였습니다.

$ git clone https://github.com/serengil/deepface.git
$ ll deepface/tests/dataset/
total 23M
drwxr-xr-x. 2 ec2-user ec2-user  16K May  7 10:18 .
drwxr-xr-x. 3 ec2-user ec2-user  112 May  7 10:18 ..
-rw-r--r--. 1 ec2-user ec2-user 923K May  7 10:18 couple.jpg
-rw-r--r--. 1 ec2-user ec2-user  41K May  7 10:18 face-recognition-pivot.csv
-rw-r--r--. 1 ec2-user ec2-user 2.2M May  7 10:18 img1.jpg
-rw-r--r--. 1 ec2-user ec2-user 135K May  7 10:18 img10.jpg
-rw-r--r--. 1 ec2-user ec2-user  55K May  7 10:18 img11.jpg
...
...

deepFace에서 활용할 수 있는 모델 중 FaceNet을 통해서 Feature을 추출하였습니다.

이미지에서 얼굴을 검출하는 detector는 mtcnn을 선택하였습니다.

mtcnn은 CNN을 활용하여 높은 속도와 빠른 성능을 보여줍니다.

이미지에서 얼굴을 검출하고 Feature 추출(embedding)하며 Feature는 128 dimension Vector로 나옵니다.

파일명과 Feature인 embedding값을 매핑해서 저장합니다.

import os
from deepface import DeepFace

instances = {}
img_paths = []

for f in os.listdir(img_root_path) :
    if f.endswith(".jpg") :
        img_paths.append(f"{img_root_path}/{f}")
        
for path in img_paths :
    # keys -> ['embedding', 'facial_area']
    name = path.split("/")[2].split(".")[0]
    embedding=DeepFace.represent(img_path=path, model_name="Facenet", detector_backend="mtcnn")[0]['embedding']
    instances[name]=embedding

Neo4j에 Feature 저장

이제 추출한 Feature를 Neo4j에 저장하겠습니다.

Neo4j에서는 python driver를 제공합니다.

Neo4j에서 개발한 bolt라는 protocol로 접속합니다.

Cypher Query Language를 작성해서 파일명과 Feature를 property로 가지는 Node를 생성합니다.

from neo4j import GraphDatabase, basic_auth

neo4j_uri = "bolt://{neo4j_ip}:7687"
driver = GraphDatabase.driver(
    uri=neo4j_uri,
    auth=basic_auth(username, password)
)

session=driver.session()

statements=""
for key, value in instances.items() :
    statements+= f"CREATE ({key}_f:Face {{name:'{key}', embedding:{value}}}) \n"

with session.begin_transaction() as tx:
    tx.run(statements)
    tx.commit()

GPU를 사용하면 더 좋겠지만 이번 예제에서는 CPU 서버로 진행하였습니다.

위 코드들을 실행해봅니다.

정상적으로 실행이 되었다면 이미지 개수만큼 Node가 생성됩니다.

Neo4j Web UI에서 생성한 Node를 확인합니다.

MATCH (n:Face) RETURN n

Neo4j WEB UI

정리

deepFace를 통해 이미지에서 얼굴의 Feature를 추출하여 Neo4j에 저장까지 완료하였습니다.

다음 포스팅에서는 샘플 이미지가 아닌 같은 배우의 다른 이미지로 어떤 배우인지 인식하는지 시도해 보겠습니다.

왜 GraphDB를 얼굴인식에 활용하였는지 다음 포스팅에서 확인하실 수 있습니다.

[참고사이트]

 

728x90
반응형
Comments