基于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_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上此项目还拥有丰富的模型文件,根据自己所需下载使用(目前我还没太搞懂,如果有大佬可以,可以写篇博客介绍一下)

下面是检测后的图片

        至此项目就算是跑通了。

        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.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)

        相似度矩阵:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/132866.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能基础——Python:运行效率与时间复杂度

人工智能的学习之路非常漫长&#xff0c;不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心&#xff0c;我为大家整理了一份600多G的学习资源&#xff0c;基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

浅析CC中的点云配准为什么效果好于PCL?

公众号致力于分享点云处理&#xff0c;SLAM&#xff0c;三维视觉&#xff0c;高精地图相关的文章与技术&#xff0c;欢迎各位加入我们&#xff0c;一起交流一起进步,有兴趣的可联系微信&#xff1a;cloudpoint9527。本文来自点云PCL博主的分享&#xff0c;未经作者允许请勿转载…

最新大麦订单生成器 大麦订单图一键生成

1、8.6全新版 本次更新了四种订单模板生成 多模板自由切换 2、在软件中输入生成的信息&#xff0c;这里输入的是商品信息&#xff0c;选择生成的商品图片&#xff0c;最后生成即可 新版大麦订单生成 四种模板图样式展示 这个样式图就是在大麦生成完的一个订单截图&#xff…

大数据毕业设计选题推荐-生产大数据平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

内网安全-基础设施构建-cobaltstrike远控工具beacon使用

kali在CS文件目录下&#xff0c;打开终端,运行命令&#xff1a; /teamserver 192.168.77.128 123456 在windows中双击bat文件&#xff1a; 填写图下信息&#xff1a; 双击运行&#xff0c;CS上线 自查方法&#xff1a;1、kali与物理机可互通 2、物理机与windows10跳板…

[SHCTF]web方向wp

[SHCTF]web方向wp [WEEK1]babyRCE题目源码wp [WEEK1]1zzphp题目源码wp [WEEK1]ez_serialize题目源码wp [WEEK1]登录就给flag题目wp [WEEK1]生成你的邀请函吧~题目源码wp [WEEK1]飞机大战题目wp [WEEK1]ezphp题目源码wp [WEEK2]no_wake_up题目源码wp [WEEK2]MD5的事就拜托了题目…

人工智能在汽车业应用的五项挑战

在汽车行业扩展人工智能应用时需要注意的问题 随着更多企业投资于汽车人工智能 (AI) 解决方案&#xff0c;我们也愈加接近大规模部署 5 级全自动驾驶汽车。汽车行业的组织如果希望加入这场 AI 带来的颠覆性变革&#xff0c;就应该已提前考虑如何成功和大规模地将人工智能部署到…

C语言每日一题(28) 反转链表

牛客网 BM1 反转链表 题目描述 描述 给定一个单链表的头结点pHead(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1)&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 数据范围&#xff1a; 0≤n≤1000 要求&#xff1a;空间复…

LCD1602设计(1)

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

stm32超声波测距不准的解决方法(STM32 delay_us()产生1us)

首先要说明一下原理&#xff1a;使用stm32无法准确产生1us的时间&#xff0c;但是超声波测距一定要依赖时间&#xff0c;时间不准&#xff0c;距离一定不准&#xff0c;这是要肯定的&#xff0c;但是在不准确的情况下&#xff0c;要测量一个比较准确的时间&#xff0c;那么只能…

JavaScript从入门到精通系列第三十三篇:详解正则表达式语法(二)

文章目录 一&#xff1a;正则表达式 1&#xff1a; 检查一个字符串中是否有. 2&#xff1a;第二种关键表达 3&#xff1a;第三种关键表达 ​编辑4&#xff1a;第四种关键表达 5&#xff1a;第五种关键表达 6&#xff1a;第六种关键表达 二&#xff1a;核心表达二 1&am…

在程序中链接静态库

现在我们把上面src目录中的add.cpp、div.cpp、mult.cpp、sub.cpp编译成一个静态库文件libcalc.a。 add_library(库名称 STATIC 源文件1 [源文件2] ...) link_libraries(<static lib> [<static lib>...]) 参数1&#xff1a;指定出要链接的静态库的名字 可以是全…

Postgres的级数生成函数generate_series应用

Postgres的级数生成函数generate_series应用 引用&#xff1a;http://postgres.cn/docs/12/functions-srf.html 函数文档 函数 参数类型 返回类型 描述 generate_series(start, stop) int、bigint或者numeric setof int、setof bigint或者setof numeric&#xff08;与参数类型相…

公司注册股东选择几个人合适?

创业初期很多创业者都会选择有注册有限责任公司&#xff0c;有限责任由五十个以下的股东出资设立&#xff0c;每个股东以其所认缴的出资额为限对公司承担有限责任。那么问题来了股东人数选择几个最合适呢&#xff0c;下面上海注册公司网&#xff08;www.91kaiye.cn&#xff09;…

AMD64内存属性详解

本文参考文档为AMD64 Architecture Programmer’s Manual Volume 2: System Programming&#xff0c;版本号3.41&#xff0c;这不是对原英文文档的翻译&#xff0c;但是所有内容的排版都是根据原手册的排版来的&#xff0c;如有与官方文档冲突的内容&#xff0c;以官方文档为准…

【C++破局】C++内存管理之new与deleted剖析

​作者主页 &#x1f4da;lovewold少个r博客主页 ⚠️本文重点&#xff1a;c内存管理部分知识点梳理 &#x1f449;【C-C入门系列专栏】&#xff1a;博客文章专栏传送门 &#x1f604;每日一言&#xff1a;花有重开日&#xff0c;人无再少年&#xff01; 目录 C/C的内存分配机…

向量的点积和外积

参考&#xff1a;https://www.cnblogs.com/gxcdream/p/7597865.html 一、向量的内积&#xff08;点乘&#xff09; 定义&#xff1a; 两个向量a与b的内积为 ab |a||b|cos∠(a, b)&#xff0c;特别地&#xff0c;0a a0 0&#xff1b;若a&#xff0c;b是非零向量&#xff0c;…

测量直线模组时如何降低误差?

直线模组属于高精度传动零部件&#xff0c;是机械行业中不可或缺的零部件之一&#xff0c;其具有高精度、速度快、使用寿命长等特点&#xff1b;如果直线模组的精度受损&#xff0c;则不能达到预期的使用效果&#xff0c;那么我们测量时应该如何减少误差&#xff0c;确保直线模…

【数据结构】二叉树经典例题---<你真的掌握二叉树了吗?>(第一弹)

一、已知一颗二叉树如下图&#xff0c;试求&#xff1a; (1)该二叉树前序、中序和后序遍历的结果。 (2)该二叉树是否为满二叉树&#xff1f;是否为完全二叉树&#xff1f; (3)将它转换成对应的树或森林。 (4)这颗二叉树的深度为多少? (5)试对该二叉树进行前序线索化。 (6)试对…

Vue3路由配置

目录 ​编辑 一&#xff1a;前言 二&#xff1a;配置路由 1、安装路由 2、创建各文件 1&#xff09;views 下的 index.vue 文件 2&#xff09;router 下的 index.ts 3&#xff09;App.vue 文件修改 4&#xff09;main.ts 文件修改 3、一些会遇到的报错 1&#xff09;…