일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- docker
- zookeeper
- Packet
- AWS
- tcp
- OS
- MAC address
- Network
- Kafka
- EC2
- helm
- PostgreSQL
- grafana
- kubectl
- airflow
- Python
- log
- jvm
- Operating System
- kubeadm
- JavaScript
- CVAT
- Vision
- Trino
- java
- ip
- CSV
- Spring
- kubernetes
- aws s3
- Today
- Total
JUST WRITE
[Vision] GraphDB로 얼굴인식을?!?!(2) - deepFace로 얼굴 이미지 Feature 추출 본문
deepFace로 얼굴 이미지 Feature 추출
저번 포스팅에서 GraphDB 중 하나인 Neo4j를 AWS EC2에 설치하였습니다.
이번 포스팅에서는 이미지에서 얼굴의 Feature을 추출해 보도록 하겠습니다.
deepFace란?!
얼굴 이미지의 Feature을 추출해서 Feature들을 비교하여 얼굴 인식을 합니다.
얼굴 인식은 크게 2가지로 나눌 수 있습니다.
- 얼굴검증(Face Verification) -> 2개의 얼굴이 같은지 비교 (1:1)
- 얼굴식별(Face Identification) -> 입력되는 1개의 얼굴이 누구의 얼굴인지 판별 (1:N)
이번에는 얼굴식별을 진행해보려고 합니다.
얼굴의 Feature는 deepFace라는 얼굴 인식 관련 python framework을 이용하였습니다.
얼굴 이미지를 통해 나이, 성별, 감정, 인종 등을 분석할 수 있습니다.
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
정리
deepFace를 통해 이미지에서 얼굴의 Feature를 추출하여 Neo4j에 저장까지 완료하였습니다.
다음 포스팅에서는 샘플 이미지가 아닌 같은 배우의 다른 이미지로 어떤 배우인지 인식하는지 시도해 보겠습니다.
왜 GraphDB를 얼굴인식에 활용하였는지 다음 포스팅에서 확인하실 수 있습니다.
[참고사이트]
'AI' 카테고리의 다른 글
[Vision] Click 한 번에 Segmentation?! - CVAT에 SAM 적용 (0) | 2024.01.17 |
---|---|
[Vision] GraphDB로 얼굴인식을?!?!(3) - GraphDB로 얼굴 인식하기 (0) | 2023.05.11 |
[Vision] GraphDB로 얼굴인식을?!?!(1) - neo4j 구축하기 (0) | 2023.04.29 |
[Vision] 엔지니어의 Yolo 도전기(3) - Yolo 모델 Train (0) | 2023.04.27 |
[Vision] 엔지니어의 Yolo 도전기(2) - Train Dataset 준비 (2) | 2023.04.16 |