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
'AI' 카테고리의 다른 글
[AI] Recognize Anything 사용해보기1 (0) | 2025.01.09 |
---|---|
[AI] EazyOCR 사용해보기 (0) | 2025.01.09 |
[AI] PyTorch 개념과 설치 방법 (0) | 2025.01.08 |
[AI] Miniforge 사용해보기 (0) | 2025.01.08 |
[AI] Conda 배포판의 특징과 라이선스 (0) | 2025.01.08 |