基于insightface实现的人脸检测,人脸识别,insightface源码讲解。

2023-11-10 18:12

本文主要是介绍基于insightface实现的人脸检测,人脸识别,insightface源码讲解。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.搭建insightface需要的环境

2.下载insightface工程

3.代码工程文件讲解

        3.1 python-package

        3.2 进行测试

        3.3 examples

4. 人脸识别

5.代码理解:


1.搭建insightface需要的环境

        埋个坑,后续再写,笔者在安装过程中遇到了一些问题。

2.下载insightface工程

        直接打开github搜索insightface即可找到,或者点击下面的连接直接跳转。

        deepinsight/insightface: State-of-the-art 2D and 3D Face Analysis Project (github.com)

     

3.代码工程文件讲解

        从github上下载完成功,使用pycharm 打开,目录如下,笔者认为最终要的是在使用红框框处的两个文件夹,我们先讲解python-package。

        3.1 python-package

        我们首先要在pycharm 中的终端执行一下  python-package中的setup.py这个文件

        具体操作如下,先跳转到python-package目录下,

        然后执行: python setup.py build_ext -i

        如下图所示执行成功。

        其实笔者在这一部分是有疑惑的,这个setup.py文件的作用是什么?笔者不太懂,如果有大佬明白,希望可以指教一下。

        3.2 进行测试

        按照官方介绍,我们使用示例代码进行检测,先在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_imageapp = 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上此项目还拥有丰富的模型文件,根据自己所需下载使用(目前我还没太搞懂,如果有大佬可以,可以写篇博客介绍一下)

下面是检测后的图片

        至此项目就算是跑通了。

        3.3 examples

        exampes文件夹中也给大家提供了一些事例,大家可以自行去理解,运行,run一下。注意将这些文件放在pythoh-package目录下运行。

4. 人脸识别

        目前这一部分我还没有完全做完,先讲一下我的思路,以及现在做的一些工作。

前面进行的只是人脸检测,可以检测到图片中的人脸,并不能检测到图片中的人脸是谁。

那么思路就是,先建立一个人脸数据库,然后检测出人脸数据库中每个人的人脸特征数据(接下来我打算使用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.3parser = 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)

        相似度矩阵:

5.代码理解:

        我们以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'],删除后就可以检测人脸特征

        创作不易,求点赞,求关注,求收藏。水平有限,如有误解之处,求指正。

这篇关于基于insightface实现的人脸检测,人脸识别,insightface源码讲解。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/384414

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P