[AI] insightface 사용해보기
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.int을 np.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