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人脸识别已经完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值