最近研究了一下人脸识别算法,初步实现了基础的人脸识别。
源码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
图52
图31
到此最基础的insightface人脸识别已经完成。