Python中怎样实现提取人脸特征,方法及操作是什么
Admin 2022-09-13 群英技术资讯 353 次浏览
这篇文章我们来了解“Python中怎样实现提取人脸特征,方法及操作是什么”的内容,小编通过实际的案例向大家展示了操作过程,简单易懂,有需要的朋友可以参考了解看看,那么接下来就跟随小编的思路来往下学习吧,希望对大家学习或工作能有帮助。
安装dlib方法:
Win10安装dlib GPU过程详解
思路:
1、使用dlib.get_frontal_face_detector()方法检测人脸的位置。
2、使用 dlib.shape_predictor()方法得到人脸的关键点。
3、使用dlib.face_recognition_model_v1()方法提取特征。
新建face_embedding1.py,插入代码:
import dlib,numpy import cv2 # 人脸关键点检测器 predictor_path = "shape_predictor_68_face_landmarks.dat" # 人脸识别模型、提取特征值 face_rec_model_path = "dlib_face_recognition_resnet_model_v1.dat"
predictor_path是恋人关键点检测器模型的路径。
face_rec_model_path是提取人脸特征的路径。
# 加载模型 detector = dlib.get_frontal_face_detector() #人脸检测 sp = dlib.shape_predictor(predictor_path) #关键点检测 facerec = dlib.face_recognition_model_v1(face_rec_model_path)# 编码
分别初始化人脸检测、关键点检测、特征编码方法。
image_path='train_images/11.jpg' image = cv2.imread(image_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 人脸检测 dets = detector(image, 1) if len(dets)==1: print('检测到人脸') shape = sp(image, dets[0])# 关键点 # 提取特征 face_descriptor = facerec.compute_face_descriptor(image, shape)#获取到128位的编码 v = numpy.array(face_descriptor) print(v)
读取图片。然后将图片转为RGB格式。
检测人脸。
获取人脸的68个关键点。
获取128位人脸编码。
使用感受: 使用dlib.get_frontal_face_detector()检测人脸效果一般,模糊的人脸检测不出来。速度上也是比较慢。
思路:
这种方法使用 cv2自带的dnn.readNetFromCaffe方法,加载深度学习模型实现人脸的检测。然后继续使用dlib提取人脸特征。
新建face_embedding2.py,插入代码:
import dlib,numpy import cv2 # 人脸关键点检测器 predictor_path = "shape_predictor_68_face_landmarks.dat" # 人脸识别模型、提取特征值 face_rec_model_path = "dlib_face_recognition_resnet_model_v1.dat" prototxt_path = 'deploy.proto.txt' model_path = 'res10_300x300_ssd_iter_140000_fp16.caffemodel'
导入需要的包。
定义模型的路径。
net = cv2.dnn.readNetFromCaffe(prototxt_path, model_path) sp = dlib.shape_predictor(predictor_path) #关键点检测 facerec = dlib.face_recognition_model_v1(face_rec_model_path)# 编码
初始化人脸检测模型、关键点检测模型、人脸特征提取模型。
image_path='train_images/11.jpg' image = cv2.imread(image_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) (h, w) = image.shape[:2] blob = cv2.dnn.blobFromImage(cv2.resize(image, (300, 300)), 1.0, (300, 300), (104.0, 177.0, 123.0)) net.setInput(blob) detections = net.forward() startX, startY, endX, endY = 0, 0, 0, 0 for i in range(0, detections.shape[2]): # extract the confidence (i.e., probability) associated with the # prediction confidence = detections[0, 0, i, 2] # filter out weak detections by ensuring the `confidence` is # greater than the minimum confidence if confidence > 0.5: # compute the (x, y)-coordinates of the bounding box for the # object box = detections[0, 0, i, 3:7] * numpy.array([w, h, w, h]) (startX, startY, endX, endY) = box.astype("int") break rect = dlib.rectangle(startX, startY, endX, endY)
这部分的代码主要是人脸检测逻辑。
读取图片,并将其改为RGB格式。
获取图片的大小。
初始化blob。
net.forward()计算人脸的位置。
遍历检测结果
将坐标转为dlib.rectangle对象。
shape = sp(image, rect) print(shape) # 提取特征 face_descriptor = facerec.compute_face_descriptor(image, shape)#获取到128位的编码 v = numpy.array(face_descriptor) print(v)
计算人脸的关键点。
提取人脸的特征。
使用感受:使用深度学习模型提取人脸特征,无论速度还是准确率都有很大的提高,即使很模糊的图像依然能检测到。
InsightFace 是一个开源的 2D&3D 深度人脸分析工具箱,其中高效地实现了丰富多样的人脸识别、人脸检测和人脸对齐算法,并且针对训练和部署进行了优化,在多项算法测评、比赛获得优胜。
pip install insightface pip install onnxruntime-gpu==1.9.0
注意:onnxruntime安装1.9以下的版本。
新建face_embedding3.py 插入代码:
import insightface import cv2 model = insightface.app.FaceAnalysis() model.prepare(ctx_id=0, det_thresh=0.45) face_img = cv2.imread('train_images/11.jpg') res = model.get(face_img) print('embedding: ', res[0].embedding)
初始化FaceAnalysis()模型。
设置置信度位0.45。
读取图片
使用模型预测。
打印人脸特征res[0].embedding。
除了能人脸特征外,还有一些其他的属性,比如:bbox、kps、landmark_3d_68、landmark_2d_106、age、gender 。可以通过res[0].keys()查看。
使用感受:速度比较慢,精度还行。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
装饰器经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。装饰器的作用就是为已经存在的对象添加额外的功能。
今天给大伙分享一下 Python 爬虫的教程,这次主要涉及到的是关于某 APP 的逆向分析并抓取数据,关于 APP 的反爬会麻烦一些,比如 Android 端的代码写完一般会进行打包并混淆加密加固,所以除了抓包之外,还需要对 APP 进行查壳脱壳反编译等操作。
这篇文章主要为大家详细介绍了python双向循环链表实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这篇文章主要给大家介绍的是关于Python内置函数zip的使用。对于zip()函数,是用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个原则,再返回由这些元组组成的列表。那么具体Python内置函数zip如何使用呢?下面一起来看看。
在pandas中,当经常对数据进行处理,可能会造成数据索引顺序混乱,那么也就会影响数据读取、插入等等操作,因此重置索引的操作就很重要,那么pandas中重置索引怎样做?接下来给大家分享几个方法,大家可以参考。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008