AI

[AI] insightface 사용해보기

dud9902 2025. 1. 8. 22:53

insightface란?

InsightFace얼굴 인식(Face Recognition), 얼굴 검출(Face Detection), 얼굴 정렬(Face Alignment) 등을 제공하는 오픈소스 딥러닝 라이브러리

 

 

insightface 테스트 과정

1. insightface 설치를 한다.

pip install insightface

 

2. 예제 코드를 가져온다.

https://github.com/deepinsight/insightface/blob/master/examples/demo_analysis.py

 

insightface/examples/demo_analysis.py at master · deepinsight/insightface

State-of-the-art 2D and 3D Face Analysis Project. Contribute to deepinsight/insightface development by creating an account on GitHub.

github.com

 

import argparse
import cv2
import sys
import numpy as np
import insightface
from insightface.app import FaceAnalysis
from insightface.data import get_image as ins_get_image

assert insightface.__version__>='0.3'

parser = argparse.ArgumentParser(description='insightface app test')
# general
parser.add_argument('--ctx', default=0, type=int, help='ctx id, <0 means using cpu')
parser.add_argument('--det-size', default=640, type=int, help='detection size')
args = parser.parse_args()

app = FaceAnalysis()
app.prepare(ctx_id=args.ctx, det_size=(args.det_size,args.det_size))

img = ins_get_image('t1')
faces = app.get(img)
assert len(faces)==6
rimg = app.draw_on(img, faces)
cv2.imwrite("./t1_output.jpg", rimg)

# then print all-to-all face similarity
feats = []
for face in faces:
    feats.append(face.normed_embedding)
feats = np.array(feats, dtype=np.float32)
sims = np.dot(feats, feats.T)
print(sims)

 

코드설명

 

1. 라이브러리 임포트

import cv2
import numpy as np
from insightface.app import FaceAnalysis
from insightface.data import get_image as ins_get_image
  • cv2: OpenCV 라이브러리, 이미지 처리를 할 때 사용한다.
  • numpy: 배열 연산 및 수학 연산을 위해 사용한다.
  • insightface.app: 얼굴 인식, 분석 등을 위한 라이브러리.
  • insightface.data: get_image 같은 내장 함수를 제공해 샘플 이미지를 바로 불러올 수 있다.

2. 얼굴 분석 엔진 초기화

app = FaceAnalysis()
app.prepare(ctx_id=0, det_size=(640,640))
  • FaceAnalysis()로 얼굴 분석을 담당하는 객체(엔진)를 만든다.
  • app.prepare(ctx_id=0, det_size=(640,640)):
    • ctx_id=0: GPU(또는 CPU) 등 디바이스 설정.
    • det_size=(640,640): 얼굴을 감지할 때 사용할 이미지 크기 설정.

3. 샘플 이미지 불러오기

img = ins_get_image('t1')
  • InsightFace에 기본으로 포함된 샘플 이미지를 불러온다.
  • 't1' 이라는 키워드에 해당하는 이미지를 가져온다.

4. 이미지 내 얼굴 탐지 & 분석

faces = app.get(img)
assert len(faces)==6
  • app.get(img)를 통해 이미지에서 얼굴을 찾아 faces 리스트에 담는다.
  • assert len(faces)==6은 얼굴이 6개라고 가정하고 작성된 코드. 만약 얼굴 개수가 6개가 아니면 에러가 발생한다.

5. 후처리

5-1) 결과 이미지를 파일로 저

rimg = app.draw_on(img, faces)
cv2.imwrite("./t1_output.jpg", rimg)
  • app.draw_on(img, faces)로 탐지된 얼굴 부위를 시각적으로 표시한 이미지를 생성한다.
  • cv2.imwrite를 통해 해당 이미지를 t1_output.jpg로 저장한다.

5-2) 얼굴 간 유사도 계산

feats = []
for face in faces:
    feats.append(face.normed_embedding)
feats = np.array(feats, dtype=np.float32)
sims = np.dot(feats, feats.T)
print(sims)
  • face.normed_embedding에는 얼굴 임베딩(벡터)이 들어있다.
  • feats 리스트에 각 얼굴의 임베딩을 순서대로 저장한 후, np.array로 바꾸어 한 번에 처리하기 쉽게 한다.
  • 유사도 계산(sims):
    • np.dot(feats, feats.T)로 모든 얼굴 임베딩 간의 내적을 구해 2차원 배열 형태로 유사도를 확인할 수 있다.
    • 값이 클수록 두 얼굴 벡터가 비슷하다는 의미이다.

바로 코드를 실행했더니 오류가 발생했다!

 

그래서 onnxruntime을 설치해주었다.

pip install onnxruntime

 

2차 오류가 발생했다.

 

로그 중간에 face_analysis.py를 ctrl을 누르고 클릭한다.

 

그러면 face_analysis.py 파일로 바로 이동이 된다. 여기서 np.intnp.int_로 수정한다.

 

완성된 코드는 이렇다.

#step 1 : import modules
import cv2
import numpy as np
from insightface.app import FaceAnalysis
from insightface.data import get_image as ins_get_image

#step 2 : create inference object(instance)
app = FaceAnalysis()
app.prepare(ctx_id=0, det_size=(640,640))

#step 3 : load data
img = ins_get_image('t1')

#step 4 : inference
faces = app.get(img)
assert len(faces)==6


#step 5 : post processing
#step 5-1 : save result image
# rimg = app.draw_on(img, faces)
# cv2.imwrite("./t1_output.jpg", rimg)

#step 5-2 : face recognition
# then print all-to-all face similarity

face_feats1 = faces[0].normed_embedding
face_feats1 = np.array(face_feats1, dtype=np.float32)

sims = np.dot(face_feats1, face_feats1.T)
print(sims)

 

추가로 아이유 사진 2장을 이용하여 테스트를 해보았다. (사진 2개 다운로드 받기)

#step 1 : import modules
import cv2
import numpy as np
from insightface.app import FaceAnalysis
from insightface.data import get_image as ins_get_image

#step 2 : create inference object(instance)
app = FaceAnalysis()
app.prepare(ctx_id=0, det_size=(640,640))

#step 3 : load data
img1= cv2.imread("iu1.jpg")
img2 = cv2.imread("iu2.jpg")

#step 4 : inference
faces1 = app.get(img1)
faces2 = app.get(img2)
assert len(faces1)==1
assert len(faces2)==1

#step 5 : post processing
#step 5-1 : save result image
# rimg = app.draw_on(img, faces)
# cv2.imwrite("./t1_output.jpg", rimg)

#step 5-2 : face recognition
# then print all-to-all face similarity

face_feats1 = faces1[0].normed_embedding
face_feats2 = faces2[0].normed_embedding
face_feats1 = np.array(face_feats1, dtype=np.float32)
face_feats2 = np.array(face_feats2, dtype=np.float32)

sims = np.dot(face_feats1, face_feats2.T)

print(sims)

 

결과값이 0.4 이상이면 동일인으로 볼 수 있다. (유사도의 경우 회사의 정책에 따라 변경 될 수 있음)

 

 

추가로 InsightFace-REST 모델도 있었다.
https://github.com/SthPhoenix/InsightFace-REST

 

 

GitHub - SthPhoenix/InsightFace-REST: InsightFace REST API for easy deployment of face recognition services with TensorRT in Doc

InsightFace REST API for easy deployment of face recognition services with TensorRT in Docker. - SthPhoenix/InsightFace-REST

github.com