自学内容网 自学内容网

InsightFace 人脸识别算法实现过程解析

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

源码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:后面地址

在这里插入图片描述

下载完成后的模型:

在这里插入图片描述

运行完成会展示下面图片,并且会在当前文件夹内创建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运行结果:
在这里插入图片描述

图51和图31比较:

在这里插入图片描述

用到的测试图片:

51
图51

52
图52

31
图31

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


原文地址:https://blog.csdn.net/weixin_43366149/article/details/140682843

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!