insightface 人脸检测与识别

news/2024/11/24 1:43:01/

参考:https://huaweicloud.csdn.net/638088d7dacf622b8df89c0c.html

insightface模型下载可能需要连接外网,模型自动下载保存再models\buffalo_l下,人脸注册自动保存再face_db目录下

1、具体人脸录入

python face_label.py --picture 刘亦菲.jpg --register Ture
python face_label.py --picture 杨幂.jpg --register Ture
(运行后会把照片保存一份到face_db目录下)
在这里插入图片描述

2、具体检测识别人脸

python face_label.py --picture 11.jpg --recognition Ture (11.jpg是一种杨幂照片)
在这里插入图片描述

运行后结果:
在这里插入图片描述
如果检测的是face_db目录不存在的图片,这里找的一张黄晓明照片:
python face_label.py
–picture 22.jpg --recognition Ture
在这里插入图片描述

运行结果,结果未知默认显示unknown:

3、 一对多图像库检索加速

embedding是实时检测的单个人头像embedding,可以

## 单个人头像embedding
embedding = np.array(face.embedding).reshape((1, -1))
embedding = preprocessing.normalize(embedding)
## 图库里所以图片faces_embeddings 
for file in files:input_image = cv2.imdecode(np.fromfile(os.path.join(root, file), dtype=np.uint8), 1)user_name = file.split(".")[0]face = self.model.get(input_image)[0]embedding = np.array(face.embedding).reshape((1, -1))embedding = preprocessing.normalize(embedding)faces_embedding.append({"user_name": user_name,"feature": embedding})
faces_embeddings = []
for com_face in faces_embedding:faces_embeddings.append(com_face["feature"])

计算相似度:
print(“cosine”, (faces_embeddings @ embedding.T))

在这里插入图片描述

代码

face_label.py 代码

import osimport cv2
import insightface
import numpy as np
from sklearn import preprocessing
import argparseclass FaceRecognition:def __init__(self, gpu_id=0, face_db='face_db', threshold=1.24, det_thresh=0.50, det_size=(640, 640)):"""人脸识别工具类:param gpu_id: 正数为GPU的ID,负数为使用CPU:param face_db: 人脸库文件夹:param threshold: 人脸识别阈值:param det_thresh: 检测阈值:param det_size: 检测模型图片大小"""self.gpu_id = gpu_idself.face_db = face_dbself.threshold = thresholdself.det_thresh = det_threshself.det_size = det_size# 加载人脸识别模型,当allowed_modules=['detection', 'recognition']时,只单纯检测和识别self.model = insightface.app.FaceAnalysis(root='./',#   allowed_modules=None,allowed_modules=['detection', 'recognition'],providers=['CUDAExecutionProvider'])self.model.prepare(ctx_id=self.gpu_id, det_thresh=self.det_thresh, det_size=self.det_size)# 人脸库的人脸特征self.faces_embedding = list()# 加载人脸库中的人脸self.load_faces(self.face_db)# 加载人脸库中的人脸def load_faces(self, face_db_path):if not os.path.exists(face_db_path):os.makedirs(face_db_path)for root, dirs, files in os.walk(face_db_path):for file in files:input_image = cv2.imdecode(np.fromfile(os.path.join(root, file), dtype=np.uint8), 1)user_name = file.split(".")[0]face = self.model.get(input_image)[0]embedding = np.array(face.embedding).reshape((1, -1))embedding = preprocessing.normalize(embedding)self.faces_embedding.append({"user_name": user_name,"feature": embedding})# 人脸识别def recognition(self, image):faces = self.model.get(image)results = list()for face in faces:# 开始人脸识别embedding = np.array(face.embedding).reshape((1, -1))embedding = preprocessing.normalize(embedding)user_name = "unknown"for com_face in self.faces_embedding:r = self.feature_compare(embedding, com_face["feature"], self.threshold)if r:user_name = com_face["user_name"]results.append(user_name)return results@staticmethoddef feature_compare(feature1, feature2, threshold):diff = np.subtract(feature1, feature2)dist = np.sum(np.square(diff), 1)if dist < threshold:return Trueelse:return Falsedef register(self, image, user_name):faces = self.model.get(image)if len(faces) != 1:return '图片检测不到人脸'# 判断人脸是否存在embedding = np.array(faces[0].embedding).reshape((1, -1))embedding = preprocessing.normalize(embedding)is_exits = Falsefor com_face in self.faces_embedding:r = self.feature_compare(embedding, com_face["feature"], self.threshold)if r:is_exits = Trueif is_exits:return '该用户已存在'# 符合注册条件保存图片,同时把特征添加到人脸特征库中cv2.imencode('.png', image)[1].tofile(os.path.join(self.face_db, '%s.png' % user_name))self.faces_embedding.append({"user_name": user_name,"feature": embedding})return "success"# 检测人脸def detect(self, image):faces = self.model.get(image)results = list()for face in faces:result = dict()# 获取人脸属性result["bbox"] = np.array(face.bbox).astype(np.int32).tolist()# result["kps"] = np.array(face.kps).astype(np.int32).tolist()# print(np.array(face.landmark_3d_68))# result["landmark_3d_68"] = np.array(face.landmark_3d_68).astype(np.int32).tolist()# result["landmark_2d_106"] = np.array(face.landmark_2d_106).astype(np.int32).tolist()# result["pose"] = np.array(face.pose).astype(np.int32).tolist()# result["age"] = face.age# gender = '男'# if face.gender == 0:#     gender = '女'# result["gender"] = gender# 开始人脸识别embedding = np.array(face.embedding).reshape((1, -1))embedding = preprocessing.normalize(embedding)result["embedding"] = embeddingresults.append(result)return resultsif __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--picture', type=str,help="picture adress")# parser.add_argument('--name', type=str,help="user name")parser.add_argument('--register', default=False,help="people register")parser.add_argument('--recognition', default=False,help="people recognition")args = parser.parse_args()# print(args.picture,args.picture.split(".")[0])if args.register:img = cv2.imdecode(np.fromfile(args.picture, dtype=np.uint8), -1)face_recognitio = FaceRecognition()# 人脸注册 录入保存result = face_recognitio.register(img, user_name=args.picture.split(".")[0])print(result) if args.recognition:img = cv2.imdecode(np.fromfile(args.picture, dtype=np.uint8), -1)face_recognitio = FaceRecognition()# 人脸识别results = face_recognitio.recognition(img)for result in results:print("识别结果:{}".format(result))results = face_recognitio.detect(img)for result in results:print('人脸框坐标:{}'.format(result["bbox"]))# print('人脸五个关键点:{}'.format(result["kps"]))# print('人脸3D关键点:{}'.format(result["landmark_3d_68"]))# print('人脸2D关键点:{}'.format(result["landmark_2d_106"]))# print('人脸姿态:{}'.format(result["pose"]))# print('年龄:{}'.format(result["age"]))# print('性别:{}'.format(result["gender"]))

http://www.ppmy.cn/news/278336.html

相关文章

25款美轮美奂的壁纸改变你的心情

越是漂亮&#xff0c;精美的桌面壁纸&#xff0c;越能挑战我们的想象力和影响我们日常的心情。 在这些搜集里面&#xff0c;你会发现非常漂亮和高品质正好你也喜欢的壁纸。有这么多可供选择的出色桌面墙纸&#xff0c;您的桌面永远不会乏味和单调了。好好享受吧&#xff01; …

华为路由器:ospf协议三张表及邻居建立过程

说明&#xff1a;本篇接上一篇继续讲解 拓扑图 为了方便&#xff0c;我把R1/2/3/4/5的router id改成了回环网卡的IP。 ospf协议三张表 邻居表&#xff08;neighbortable&#xff09; OSPF用邻居机制来发现和维持路由的存在&#xff0c;邻居表存储了双向通信的邻居关系OSPF路…

对象进阶、原型-原型链

工厂方法创建对象 我们之前已经学习了如何创建一个对象&#xff0c;那我们要是想要创建多个对象又该怎么办&#xff1f;聪明的同学可能会说&#xff0c;直接在写几个对象不就好了吗&#xff1f;比如下边的代码&#xff1a; var person1 {name: "孙悟空",age: 18,s…

qt 乱码

init() { // 根据配置加载默认语言系统 // 解决中文乱码问题 QTextCodec *codec QTextCodec::codecForName("system"); QTextCodec::setCodecForLocale(codec); } 设置 /execution-charset:utf-8

国有行面试的8种误区回答(上)

从各地区面试情况来看&#xff0c;国有行面试依旧是自我介绍半结构化无领导群面&#xff0c;辅之辩论赛等形式。 从多数地区和岗位面试情况看&#xff0c;我们知道自我介绍几乎是必考面试题&#xff0c;甚至不少地区一面只让作一次自我介绍就结束&#xff0c;可见自我介绍对面试…

JavaSE08_面向对象之继承

JavaSE-08 【继承】 第一章 继承 1.1 继承介绍 继承的概念&#xff1a; 让类与类之间产生关系&#xff08;子父类关系&#xff09;&#xff0c;子类可以直接使用父类中非私有的成员继承是多态的前提&#xff0c;如果没有继承&#xff0c;就没有多态继承主要解决的问题就是共…

一颗明亮的火球从天空划过

我不知道&#xff0c;估计也没有几个普通人能够说清楚。但有一个真实的事件&#xff0c;它被普遍认为是地球存在高级文明&#xff0c;或者地球被外星人保护的最好证明——俄罗斯陨石被击碎事件。 2013年2月15日&#xff0c;俄罗斯南部的车里雅宾斯克&#xff0c;一颗明亮的火球…

河北山东多地出现 UFO专家称这是一颗火流星。

十月二十五日晚上九点半&#xff0c;河北石家庄某高校的一位大学生在操场上看见一只不明物体从空中掠过&#xff0c;恰好有同学用手机拍下了这一画面。画面中&#xff0c;那架 UFO的速度很快&#xff0c;在它的身后留下了一道诡异的绿光&#xff0c;而在它的身后&#xff0c;还…