人脸检测实战-insightface

news2024/9/22 7:40:35

目录

简介

一、InsightFace介绍 

二、安装

三、快速体验

四、代码实战

1、人脸检测

 2、人脸识别

五、代码及示例图片链接


简介

目前github有非常多的人脸识别开源项目,下面列出几个常用的开源项目:

1、deepface

2、CompreFace

3、face_recognition

4、insightface

5、facenet

6、facenet-pytorch

开源的人脸检测项目非常多,本文介绍一下insightface的使用方法。首先给出insightface的官方效果图:

 再看一下insightface的网图检测效果:

效果展示结束,下面进入详细的介绍。

一、InsightFace介绍 

insightface是一个开源的基于Pytorch和MXNet实现的2D/3D人脸分析工具,它实现了多个SOTA人脸识别、人脸检测、人脸对齐算法,并对训练和部署进行了优化。目前insightface主分支要求PyTorch 1.6+/MXNet=1.6-1.8,python 3.x。

二、安装

insightface安装非常简单,使用如下命令:

pip install insightface

安装onnxruntime用于推理(有gpu就把onnxruntime替换为onnxruntime-gpu):

pip install onnxruntime

三、快速体验

insightface给出了代码体验示例,文件路径为examples/demo_analysis.py,直接运行该文件,可以得到以下结果:

 注意:可能遇到以下报错“AttributeError: module 'numpy' has no attribute 'int'.”

AttributeError: module 'numpy' has no attribute 'int'.
`np.int` was a deprecated alias for the builtin `int`. To avoid this error in existing code, use `int` by itself. Doing this will not modify any behavior and is safe. When replacing `np.int`, you may wish to use e.g. `np.int64` or `np.int32` to specify the precision. If you wish to review your current use, check the 
release note link for additional information.

解决方法:找到安装包目录的face_analysis.py文件,比如\xxxx\envs\blog\lib\site-packages\insightface\app\face_analysis.py,将该文件内的所有np.int替换为‘int’(记得带上‘’),如以下代码(该报错可能由于numpy版本问题引起):

   def draw_on(self, img, faces):
        import cv2
        dimg = img.copy()
        for i in range(len(faces)):
            face = faces[i]
            box = face.bbox.astype('int')           #      《=====看这里
            color = (0, 0, 255)
            cv2.rectangle(dimg, (box[0], box[1]), (box[2], box[3]), color, 2)
            if face.kps is not None:
                kps = face.kps.astype("int")         #      《=====看这里
                #print(landmark.shape)
                for l in range(kps.shape[0]):
                    color = (0, 0, 255)
                    if l == 0 or l == 3:
                        color = (0, 255, 0)
                    cv2.circle(dimg, (kps[l][0], kps[l][1]), 1, color,
                               2)
            if face.gender is not None and face.age is not None:
                cv2.putText(dimg,'%s,%d'%(face.sex,face.age), (box[0]-1, box[1]-4),cv2.FONT_HERSHEY_COMPLEX,0.7,(0,255,0),1)

            #for key, value in face.items():
            #    if key.startswith('landmark_3d'):
            #        print(key, value.shape)
            #        print(value[0:10,:])
            #        lmk = np.round(value).astype(np.int)
            #        for l in range(lmk.shape[0]):
            #            color = (255, 0, 0)
            #            cv2.circle(dimg, (lmk[l][0], lmk[l][1]), 1, color,
            #                       2)
        return dimg

四、代码实战

examples/demo_analysis.py已经给出了使用示例,下面对部分代码进行解释,并给出测试结果。

1、人脸检测

使用如下代码即可得到人脸检测的结果:

import cv2
import numpy as np
from insightface.app import FaceAnalysis

app = FaceAnalysis(name='buffalo_sc')   # 使用的检测模型名为buffalo_sc
app.prepare(ctx_id=-1, det_size=(640, 640))  # ctx_id小于0表示用cpu预测,det_size表示resize后的图片分辨率  

img = cv2.imread("multi_people.webp")  # 读取图片
faces = app.get(img)   # 得到人脸信息
rimg = app.draw_on(img, faces)   # 将人脸框绘制到图片上
cv2.imwrite("multi_people_output.jpg", rimg)        # 保存图片

结果如下:

 2、人脸识别

检测到人脸之后,通常将人脸编码为特征向量,再通过特征向量的相似度对比判断2个人脸是否为一个人,下面给出从图片中识别指定人脸的代码,以上图为例,目标人脸为最左侧的人脸,如下图:

 识别的代码如下:

import cv2
import numpy as np
from insightface.app import FaceAnalysis

app = FaceAnalysis(name='buffalo_sc')   # 使用的检测模型名为buffalo_sc
app.prepare(ctx_id=-1, det_size=(640, 640))  # ctx_id小于0表示用cpu预测,det_size表示resize后的图片分辨率  

img = cv2.imread("multi_people.webp")  # 读取图片
faces = app.get(img)   # 得到人脸信息

# 将人脸特征向量转换为矩阵
feats = []
for face in faces:
    feats.append(face.normed_embedding)
feats = np.array(feats, dtype=np.float32)

# 提取目标人脸向量
target = cv2.imread("target.png")
target_faces = app.get(target)   # 得到人脸信息
target_feat = np.array(target_faces[0].normed_embedding, dtype=np.float32)

# 人脸向量相似度对比
sims = np.dot(feats, target_feat)
target_index = int(sims.argmax())

rimg = app.draw_on(img, [faces[target_index]])   # 将人脸框绘制到图片上
cv2.imwrite("multi_people_output_target.jpg", rimg)        # 保存图片

最后的效果如下:

五、代码及示例图片链接

代码及示例图片链接

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Moonbeam生态支持有哪些?

Moonbeam作为波卡生态中最活跃的底层公链之一,自上线以来就致力于构建生态,并通过XCM和GMP等技术实现了多链部署的愿景。通过举办针对不同主题的黑客松、建立生态增长基金、设计项目孵化计划和提供开发奖励等方式,Moonbeam持续推动链上生态的…

基于规则指导的知识图谱推理协作代理学习(2019)7.27

基于规则指导的知识图谱推理协作代理学习 摘要介绍问题和准备工作问题公式基于符号的方法基于游走的方法 RuleGuider模型架构实体代理策略网络 模型学习奖励设计训练过程 实验实验设置数据集实验结果消融研究人工评估 总结 摘要 基于 行走模型 是通过在提供可解释决策的同时实…

【C++】-多态的经典题目

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

解密C++多态机制:发挥对象的多样性,实现更加智能的程序设计

目录 一.多态1.多态的用处2.多态的实现3.虚函数4.override 和 final5.重载重写与重定义6.虚函数表 一.多态 1.多态的用处 众所周知C语言的三大特性:封装、多态、继承。其中多态就是去完成某个行为,但是会根据不同的对象产生不同的状态,所以…

Windows SMB 共享文件夹 排错指南

1 排错可能 是否系统名称为全英文格式 如果不是则 重命名 根据如下排错可能依次设置 1,在运行里面输入"secpol.msc"来启动本地安全设置,\ 然后选择本地策略–>安全选项 -->网络安全LAN 管理器身份验证级别,\ “安全设置”…

操作系统知识点总结

操作系统知识点总结: 第一章:操作系统概述 1.1操作系统的概念: ​ 操作系统是一种系统软件,与其他系统软件和应用软件不同,它有自己的基本特征。它的四大基本特征也就是并发,共享,虚拟,异步。 1.2操作系统的特征(四大…

前端开发信息套路:信息是如何传值

文章目录 前言信息组件化的难点:组件信息流通信息流通信息流通分类通知直接调用回调函数发布订阅全局缓存使用建议 总结 前言 作为一个写了好几个月的Uniapp小程序的打工狗,我总结了一下在前端中信息是如何传递的,得出了一个比较标准化的信息…

thinkphp6 验证码验证结果失败,可能是session开启位置错了!!!

搞了一下下午&#xff0c;始终提示验证码不正确 然后百度得到的结果都是&#xff1a;开启session&#xff0c;但是我开启了就是管用 <?php // 全局中间件定义文件 return [// 全局请求缓存// \think\middleware\CheckRequestCache::class,// 多语言加载// \think\middle…

【人人都看懂的漫画算法】边打扑克边学插入排序算法,彻底搞懂时间复杂度

博主&#xff1a;爱码叔 个人博客站点&#xff1a; icodebook.com 公众号&#xff1a;漫话软件设计 微博&#xff1a;程序员涛哥 专注于软件设计与架构、技术管理。擅长用通俗易懂的语言讲解技术。对技术管理工作有自己的一定见解。文章会第一时间首发在个站上&#xff0c;欢迎…

如何评判算法好坏?复杂度深度解析

如何评判算法好坏&#xff1f;复杂度深度解析 1. 算法效率1.1 如何衡量一个算法好坏1.2 算法的复杂度 2 时间复杂度2.1 时间复杂度的概念2.1.1 实例 2.2 大O的渐进表示法2.3 常见时间复杂度计算举例 3 空间复杂度4 常见复杂度对比5 结尾 1. 算法效率 1.1 如何衡量一个算法好坏 …

Android Studio import的代码报红提示找不到,但正常编译运行

Android Studio import的代码报红提示找不到&#xff0c;但正常编译运行 解决方案&#xff1a; &#xff08;1&#xff09;关闭退出Android Studio。 &#xff08;2&#xff09;删掉当前工程项目目录下的.idea和.gradle文件夹。 &#xff08;3&#xff09;Invalidate Caches…

uni-app之微信小程序实现‘下载+保存至本地+预览’功能

目录 一、H5如何实现下载功能 二、微信小程序实现下载资源功能方面与H5有很大的不同 三、 微信小程序实现文件&#xff08;doc,pdf等格式&#xff0c;非图片&#xff09;下载&#xff08;下载->保存->预览&#xff09;功能 四、图片预览、保存、转发、收藏&#xff1…

MMdetection框架速成系列 第07部分:数据增强的N种方法

MMdetection框架实现数据增强的N种方法 1 为什么要进行数据增强2 数据增强的常见误区3 常见的六种数据增强方式3.1 随机翻转&#xff08;RandomFlip&#xff09;3.2 随机裁剪&#xff08;RandomCrop&#xff09;3.3 随机比例裁剪并缩放&#xff08;RandomResizedCrop&#xff0…

F12开发者工具的简单应用

目录 elements 元素 1、元素的定位和修改 2、UI自动化应用 console 控制台 sources 源代码 network 网络 1、定位问题 2、接口测试 3、弱网测试 performance 性能 memory 存储 application 应用 recorder 记录器 界面展示如下&#xff08;设置中可以切换中英文&am…

云共享平台:助力企业数字化转型的利器

随着互联网技术的不断发展&#xff0c;云共享平台正在成为企业发展必不可少的工具之一。那么&#xff0c;云共享平台到底为企业带来了哪些助力呢&#xff1f; 1. 提高效率 云共享平台可以极大地提高企业的工作效率。传统的企业数据管理通常都需要人工操作&#xff0c;而且往往…

redis数据库与主从复制

目录 一 基本操作 二 执行流程 三 reids持久化 四 rdb和aof持久化的过程 五 为什么会有内存碎片 六 redis组从复制 一 基本操作 set :存放数据 例如 set 键值 内容 set k kokoko k就是键值 kokoko就是内容 get:获取数据 例如 get k 就会出来 k对应的数据 keys 查询键…

【大数据之Flume】三、Flume进阶之Flume Agent 内部原理和拓扑结构

1 Flume事务 2 Flume Agent 内部原理 重要组件&#xff1a; 1、ChannelSelector&#xff08;选择器&#xff09;   ChannelSelector 的作用就是选出 Event 将要被发往哪个 Channel。   &#xff08;1&#xff09;Replicating ChannelSelector&#xff08;复制或副本&#x…

Python实现HBA混合蝙蝠智能算法优化LightGBM回归模型(LGBMRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝙蝠算法是2010年杨教授基于群体智能提出的启发式搜索算法&#xff0c;是一种搜索全局最优解的有效方法…

「前缀和以及差分数组」

文章目录 1 前缀和数组1.1 题解1.2 Code1.3 结果 2 二维矩阵的前缀和数组2.1 题解2.2 Code2.3 结果 3 差分数组 1 前缀和数组 适用于快速频繁的计算一个索引区间内的元素之和&#xff0c;核心思想就是使用一个前缀和数组&#xff0c;然后使用前缀和数组的两个元素之差&#xf…

Postman(一)--接口测试知识准备

1.0 前言 ​ 应用程序编程接口&#xff08;Application Programming Interface, API&#xff09;是这些年来最流行的技术之一&#xff0c;强大的Web应用程序和领先的移动应用程序都离不开后端强大的API。API技术的应用给系统开发带来了便利&#xff0c;但也对测试人员提出了更…