insightface 人脸识别算法实现

1,444 阅读2分钟

最近研究了一下人脸识别算法,初步实现了基础的人脸识别。

源码github下载地址:insightface

第一步 解压源码配置环境

1、使用conda虚拟环境创建insightface环境

conda create -n insightface python=3.8

创建环境完成后,激活环境

conda activate insightface

2、insightface环境配置

进入到解压好的insightface文件夹,运行环境安装文件

pip install -r requirements.txt

继续安装以下环境包

pip install opencv-python
pip install onnxruntime
pip install onnx
pip install requests
pip install tqdm
pip install scikit-image
pip install albumentations
pip install matplotlib
pip install opencv-contrib-python

成功安装以上安装包后第一步配置环境圆满完成

第二步 使用原生代码

1、创建代码 进入python-package运行下面指令

python setup.py build_ext -i

import cv2
import numpy as np
import insightface
import insightface.app as insapp
import insightface.data as insdata
 
FaceAna = insapp.FaceAnalysis(allowed_modules=['detection'])
FaceAna.prepare(ctx_id=0, det_size=(640, 640))
img = insdata.get_image('t1')  #图片放在./insightface\data\images文件夹下
faces = FaceAna.get(img)#获取各个人脸特征值

wimg = FaceAna.draw_on(img, faces)
cv2.imwrite("./out put.jpg", wimg)
cv2.imshow("frame", wimg)
cv2.waitKey(0) 

运行该代码后会自动下载检测模型。模型下载地址可以看下图download_path:后面地址

image.png

下载完成后的模型:

image.png

运行完成会展示下面图片,并且会在当前文件夹内创建out put.jpg保存该文件。

ldh_out put.jpg

到此处便可以进行人脸检测和获取人脸的特征值(faces),接下来我们要进行人脸识别。

第三步 人脸识别

我的思路是进行图片对比,通过欧氏距离衡量两张人脸图像的特征向量之间的相似性。

import cv2
import numpy as np
import insightface
import insightface.app as insapp
import insightface.data  as insdata
from sklearn import preprocessing
import math

result = []


#进行图片比对
def feature_compare(feature1, feature2):
    #计算出欧氏距离传给dist
    diff = np.subtract(feature1, feature2)# 使用矩阵相减 feature1 - feature2
    dist = np.sum(np.square(diff), 1) #np.square()矩阵进行平方运算,全部变成正数,再将低于1的值相加,也就是dist值越低越有可能是同一个人
    return dist

#提取两张(仅有一个人脸)的图片的人脸特征值存放到数组中
def get_face_feat(img):    
    faces = app.get(img)
    feature = ()
    for face in faces:        
        feature = np.array(face.embedding).reshape((1, -1))
        feature = preprocessing.normalize(feature)
        box = face.bbox.astype(np.int64)        
        result.append(feature)
  
app = insapp.FaceAnalysis()
app.prepare(ctx_id=0, det_size=(640, 640))
img = insdata.get_image('51')  #不用带后缀,图片放到./insightface/python-package/insightface/data/images
img2 = insdata.get_image('52')

get_face_feat(img)
get_face_feat(img2)
res = []
dist = feature_compare(result[0],result[1])

print('dist:',dist)	#值越小是同一个人的概率越大,我设置的阈值为 1
if(int(dist)<=0.9):
    print("是同一个人!")
if(int(dist)>0.9):
    print("不是同一个人!")

图51和图52运行结果:

image.png

图51和图31比较:

image.png

用到的测试图片:

51.jpg

图51

52.jpg

图52

31.jpg

图31

到此最基础的insightface人脸识别已经完成。