赞
踩
目录
埋个坑,后续再写,笔者在安装过程中遇到了一些问题。
直接打开github搜索insightface即可找到,或者点击下面的连接直接跳转。
deepinsight/insightface: State-of-the-art 2D and 3D Face Analysis Project (github.com)
从github上下载完成功,使用pycharm 打开,目录如下,笔者认为最终要的是在使用红框框处的两个文件夹,我们先讲解python-package。
我们首先要在pycharm 中的终端执行一下 python-package中的setup.py这个文件
具体操作如下,先跳转到python-package目录下,
然后执行: python setup.py build_ext -i
如下图所示执行成功。
其实笔者在这一部分是有疑惑的,这个setup.py文件的作用是什么?笔者不太懂,如果有大佬明白,希望可以指教一下。
按照官方介绍,我们使用示例代码进行检测,先在python-package目录下创建 test.py文件(一定要在python-package目录下)
然后将下列代码输入,然后运行就可以得到检测图片
- import cv2
- import numpy as np
- import insightface
- from insightface.app import FaceAnalysis
- from insightface.data import get_image as ins_get_image
-
- app = FaceAnalysis(allowed_modules=['detection'],providers=['CUDAExecutionProvider', 'CPUExecutionProvider'],download=False)
- app.prepare(ctx_id=0, det_size=(640, 640))
- img = ins_get_image('t1') #不用带后缀,图片放到./insightface/python-package/insightface/data/images
- faces = app.get(img)
- print("faces::::", faces)
- print("len:", len(faces))
- rimg = app.draw_on(img, faces)
- cv2.imwrite("./ldh_out put.jpg", rimg)
- cv2.imshow("frame", rimg)
- if cv2.waitKey(0) & 0xFF == ord('Q'):
- cv2.destroyAllWindows()
第一次运行会自动下载模型,如果网速十分拉胯的话,可以选择自己去github上下载,然后把模型解压放在下方图片中红色框框中的地址。
我也把模型下载链接放在这了:buffalo_l.zip - Google 云端硬盘
下载的模型文件,测试的使用除det_10g.onnx必须使用,其他四个模型文件根据自己所需使用。 此外github上此项目还拥有丰富的模型文件,根据自己所需下载使用(目前我还没太搞懂,如果有大佬可以,可以写篇博客介绍一下)
下面是检测后的图片
至此项目就算是跑通了。
exampes文件夹中也给大家提供了一些事例,大家可以自行去理解,运行,run一下。注意将这些文件放在pythoh-package目录下运行。
目前这一部分我还没有完全做完,先讲一下我的思路,以及现在做的一些工作。
前面进行的只是人脸检测,可以检测到图片中的人脸,并不能检测到图片中的人脸是谁。
那么思路就是,先建立一个人脸数据库,然后检测出人脸数据库中每个人的人脸特征数据(接下来我打算使用embedding 特征),存储在一个文件中,当我们需要检测人脸时,我们先将存储人脸数据特征G的文件读入内存,然后使用模型检测出需要检测的人脸的人脸特征T,然后将T特征与G特征使用一定方法对比(欧氏距离,余弦距离等),选出与之最相似的人脸。
下列是我初始写的计算相似度的代码
- import argparse # 导入参数解析模块
- import cv2 # 导入OpenCV模块
- import sys # 导入sys模块
- import numpy as np # 导入NumPy模块
- import insightface # 导入insightface模块
- from insightface.app import FaceAnalysis # 从insightface.app中导入FaceAnalysis类
- from insightface.data import get_image as ins_get_image # 从insightface.data中导入get_image函数
- import time
- assert insightface.__version__>='0.3' # 断言版本不低于0.3
-
- parser = argparse.ArgumentParser(description='insightface app test') # 创建参数解析器,设置描述为'insightface app test'
- # 通用设置
- parser.add_argument('--ctx', default=0, type=int, help='ctx id, <0 means using cpu') # 添加参数'--ctx',默认值为0,类型为整数,帮助信息为'ctx id, <0 means using cpu'
- parser.add_argument('--det-size', default=640, type=int, help='detection size') # 添加参数'--det-size',默认值为640,类型为整数,帮助信息为'detection size'
- args = parser.parse_args() # 解析参数
-
- app = FaceAnalysis() # 创建FaceAnalysis实例
- app.prepare(ctx_id=args.ctx, det_size=(args.det_size,args.det_size)) # 准备分析器,设置ctx_id和det_size
- t= time.time()
- img = ins_get_image('t1') # 获取图像't1'
- # t= time.time()
- faces = app.get(img) # 识别图像中的人脸
- e = time.time()
- print("识别人脸:", e-t)
- # assert len(faces)==6 # 断言人脸数量为6
- rimg = app.draw_on(img, faces) # 在图像上绘制检测到的人脸
- cv2.imwrite("./t1_output.jpg", rimg) # 将结果图像保存为"t1_output.jpg"
-
- # 然后打印两两人脸之间的相似度
- feats = [] # 创建空列表feats
- test = []
- for face in faces: # 遍历每个人脸
- feats.append(face.normed_embedding) # 将人脸的嵌入特征加入feats列表
- test.append(faces[0].normed_embedding)
- test = np.array(test, dtype=np.float32)
- feats = np.array(feats, dtype=np.float32) # 将feats转换为NumPy数组,数据类型为np.float32
- a = time.time()
- sims = np.dot(feats, feats.T) # 计算feats和其转置之间的点积,得到相似度矩阵
- b = time.time()
- print(sims) # 输出相似度矩阵
- print("用时1:", b-a)
-
- # 使用landmark_2d_106 计算相似度
- land = []
- for face in faces:
- land.append(face.landmark_2d_106)
- land = np.array(land, dtype=np.float32) # 将feats转换为NumPy数组,数据类型为np.float32
- def euclidean_distance(landmarks1, landmarks2):
- # 计算两组特征点之间的距离
- distances = np.sqrt(np.sum((landmarks1 - landmarks2)**2, axis=1))
- # 返回平均距离作为匹配度
- return np.mean(distances)
- dist_matrix = np.zeros((len(land), len(land)))
- # 计算欧氏距禮以进行人脸比对
- c = time.time()
- for i in range(len(land)):
- for j in range(len(land)):
- dist_matrix[i, j] = euclidean_distance(land[i], land[j])
- print("The distance matrix between the faces is:", dist_matrix)
- d = time.time()
- print("用时2:", d-c)
相似度矩阵:
我们以test.py代码为例
前几行都是导包,直接到第七行代码:
app = FaceAnalysis(allowed_modules=['detection'],providers=['CUDAExecutionProvider', 'CPUExecutionProvider'],download=False)
我们先不纠结这里面参数啥的,这行代码创建了一个实例,然后最大的作用就是加载读入了本地的那些模型文件。加载主要过程如下图我画红框的部分。大家可以自己debug理解一下。
第八行代码就是设置了一些参数
app.prepare(ctx_id=0, det_size=(640, 640))
第九行代码就是获取要检测的图片
img = ins_get_image('t1') #不用带后缀,图片放到./insightface/python-package/insightface/data/images
第十行就是进行检测了
faces = app.get(img)
过程大概将就是先使用下面的人脸检测模型把人脸都检测出来。
接着使用剩余的模型检测各种人脸特征。
检测到了六张人脸
一张人脸包含如下数据
这里并没有人脸特征数据,因为第七行代码中我们设置了参数:
allowed_modules=['detection'],删除后就可以检测人脸特征
创作不易,求点赞,求关注,求收藏。水平有限,如有误解之处,求指正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。