일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Spring
- airflow
- ip
- Packet
- Trino
- CVAT
- EC2
- java
- aws s3
- JavaScript
- kubeadm
- AWS
- Kafka
- helm
- PostgreSQL
- Python
- Network
- kubectl
- grafana
- zookeeper
- docker
- jvm
- log
- Vision
- OS
- MAC address
- kubernetes
- CSV
- Operating System
- tcp
- Today
- Total
JUST WRITE
[Vision] GraphDB로 얼굴인식을?!?!(3) - GraphDB로 얼굴 인식하기 본문
GraphDB로 얼굴인식하기
저번 포스팅에서 deepFace를 통해서 이미지에서 얼굴 feature를 추출하여 Neo4j에 Node에 저장하였습니다.
이미지의 파일명과 feature을 단순히 저장만 하였습니다.
이번 포스팅에서는 feature끼리의 연관성을 분석해서 간단한 얼굴인식 App까지 구성해보겠습니다.
비슷한 얼굴(Node)끼리 연결
GraphDB는 Data간의 관계를 생성하여 관계를 통해 Data를 검색할때 빠른 속도를 자랑합니다.
Data가 많아지더라도 관계를 형성한 Node끼리는 빠르게 검색이 가능합니다.
이번 예제에서 얼굴이 비슷한 Node끼리 연결하여 동일 인물의 이미지를 빠르게 검색하도록 합니다.
deepFace에서 FaceNet 모델을 통해서 Feature를 추출하였습니다.
같은 사람의 이미지들에서 나온 Feature값들은 비슷하게 나올 것입니다.
문제는 Feature가 단순 숫자가 아닌 128개의 vector(128 dimension vectors)입니다.
[-1.9001230001449585, 0.14744120836257935, -0.11796704679727554, 0.7688429355621338, -0.2456592470407486, -0.7263094186782837, -1.4544627666473389, -0.36939164996147156, -0.4963371455669403, -0.625996470451355, -1.0333112478256226, -1.4616738557815552, 0.6773026585578918, 1.1607612371444702, 0.3862890303134918, -2.197268009185791, -0.10383227467536926, -1.4481403827667236, -1.6098600625991821, -0.920630931854248, -0.7623332738876343, -0.7827050089836121, 2.5376434326171875, 0.9184980392456055, -0.9058929085731506, -0.1980665624141693, -1.4358941316604614, -0.17103900015354156, 0.08050911873579025, -2.1836230754852295, -0.4482170045375824, -2.372814178466797, 0.8219810128211975, -0.5035268664360046, 2.2479257583618164, 0.4101051092147827, 0.9424976706504822, -0.2971058189868927, 1.0624897480010986, 0.20330488681793213, 0.5647933483123779, -1.164377212524414, -0.5913680791854858, -0.5493995547294617, 0.19713400304317474, -0.34674668312072754, 0.010340433567762375, 0.38787606358528137, 0.03546207398176193, -2.315988540649414, -0.015681199729442596, 0.3513249158859253, -1.2019131183624268, -1.680356740951538, -0.9626284837722778, 1.5268831253051758, 1.2544113397598267, -0.4359591603279114, -0.3478536903858185, -0.70393306016922, 1.4458659887313843, -0.9314494132995605, -1.1684271097183228, -1.0273295640945435, -3.3464741706848145, 1.4065561294555664, 0.7093473672866821, 0.23971225321292877, 0.7484557032585144, 0.44174352288246155, 0.32544997334480286, 0.7473701238632202, 0.6492915153503418, -1.214106559753418, 0.5404251217842102, 0.3466396927833557, 1.5452187061309814, 0.38982683420181274, -0.5924679636955261, -1.5980708599090576, 0.10369446128606796, 0.3023301959037781, -0.6706048250198364, 0.6024853587150574, -0.2647956609725952, -0.5470790266990662, -0.061838194727897644, -1.73363196849823, -0.15962544083595276, -0.20741449296474457, 0.37870272994041443, -1.279491662979126, 0.2855834662914276, 0.8674377202987671, -1.0238369703292847, 0.8320710062980652, 0.9812828302383423, 2.3534860610961914, -1.638110876083374, -0.4526148736476898, -0.2550731301307678, -0.6078175902366638, 0.19456319510936737, 1.5692318677902222, 1.680235505104065, 0.010885201394557953, 1.3930425643920898, -1.8812872171401978, -0.6157886385917664, 1.6965055465698242, -0.8068280816078186, 1.8338429927825928, 0.5224859714508057, -0.45539551973342896, -1.3971960544586182, 0.020415209233760834, -0.517164945602417, -1.553054928779602, -1.3016211986541748, 0.023798290640115738, -0.699013352394104, -0.7829242944717407, -0.3102078437805176, 0.1560126394033432, 0.536147952079773, -0.04715786129236221, 0.7677124738693237, 0.8587148189544678]
Euclidean Distance
거리(Distance)를 계산하는게 일종의 유사도(Similarity)를 계산하는 것입니다.
128 Dimension Vector간의 거리를 계산하기 위해서 유클리디안 거리를 이용합니다.
유클리디안 거리는 여러 차원의 거리를 계산할때 쓰이는 공식입니다.
유클리드 기하학 원론에서 피타고라스의 정리가 나옵니다.
피타고라스의 정리는 삼각형 빗변의 길이 공식이기도 하지만 두 점 사이의 거리는 구하는 공식입니다.
유클리디안 거리는 각 차원의 차를 제곱해서 모두 더한 값의 제곱근입니다.
이번 Feature의 유사도를 유클리디안 거리를 통해 구해보도록 하겠습니다.
Neo4j Plugin인 GDS(Graph Data Science)에서 유클리디안 거리를 계산해주는 function을 제공합니다.
해당 function을 통해서 Feature가 유사한 Node끼리 Relation을 생성합니다.
아래 Cypher Query를 통해 생성합니다.
MATCH (p1:Face)
MATCH (p2:Face)
WHERE ID(p1) <> ID(p2)
WITH p1, p2
, gds.similarity.euclideanDistance(p1.embedding, p2.embedding) as distance
WHERE distance < 10
MERGE (p1)-[e:SAME]-(p2)
SET e.distance=distance
- 유클리디안 거리 10보다 작은 Node끼리 Relation 생성
- Relation Property로 유클리디안 거리 설정
[참고사이트]
'AI' 카테고리의 다른 글
하이퍼 파리미터 튜닝(1) - Tracking System Mlflow 세팅 (0) | 2024.10.12 |
---|---|
[Vision] Click 한 번에 Segmentation?! - CVAT에 SAM 적용 (0) | 2024.01.17 |
[Vision] GraphDB로 얼굴인식을?!?!(2) - deepFace로 얼굴 이미지 Feature 추출 (0) | 2023.05.07 |
[Vision] GraphDB로 얼굴인식을?!?!(1) - neo4j 구축하기 (0) | 2023.04.29 |
[Vision] 엔지니어의 Yolo 도전기(3) - Yolo 모델 Train (0) | 2023.04.27 |