Python中提取人脸特征的三种方法详解

作者:AI浩 时间:2023-11-06 09:38:04 

1.直接使用dlib

安装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()检测人脸效果一般,模糊的人脸检测不出来。速度上也是比较慢。

2.使用深度学习方法查找人脸,dlib提取特征

思路:

这种方法使用 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()计算人脸的位置。

遍历检测结果

  • 如果置信度大于0.5,则认为是合格的人脸。

  • 计算出人脸的坐标。

将坐标转为dlib.rectangle对象。

shape = sp(image, rect)
print(shape)
# 提取特征
face_descriptor = facerec.compute_face_descriptor(image, shape)#获取到128位的编码
v = numpy.array(face_descriptor)
print(v)

计算人脸的关键点。

提取人脸的特征。

使用感受:使用深度学习模型提取人脸特征,无论速度还是准确率都有很大的提高,即使很模糊的图像依然能检测到。

3.使用insightface提取人脸特征

InsightFace 是一个开源的 2D&3D 深度人脸分析工具箱,其中高效地实现了丰富多样的人脸识别、人脸检测和人脸对齐算法,并且针对训练和部署进行了优化,在多项算法测评、比赛获得优胜。

安装InsightFace

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()查看。

使用感受:速度比较慢,精度还行。

来源:https://blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/124703863

标签:Python,提取,人脸特征,方法
0
投稿

猜你喜欢

  • Python遍历文件夹和读写文件的实现方法

    2023-07-08 06:02:56
  • 简单谈谈Python流程控制语句

    2023-03-12 12:34:25
  • 用python做游戏的细节详解

    2022-02-08 05:18:39
  • Go微服务项目配置文件的定义和读取示例详解

    2023-06-23 22:48:50
  • pytorch中可视化之hook钩子

    2021-07-30 04:26:23
  • 详解Python遍历字典的键和值

    2021-07-19 23:02:14
  • PHP之CI框架学习讲解

    2023-07-03 21:25:13
  • python中的txt文件转换为XML

    2021-12-05 10:45:48
  • Python中flatten( )函数及函数用法详解

    2023-11-28 04:09:47
  • 在SQL触发器或存储过程中获取在程序登录的用户

    2012-01-29 18:01:32
  • Python+matplotlib绘制不同大小和颜色散点图实例

    2021-12-02 08:50:32
  • django之对FileField字段的upload_to的设定方法

    2023-04-23 09:02:30
  • Python Django实现layui风格+django分页功能的例子

    2023-10-07 00:04:28
  • tensorflow之如何使用GPU而不是CPU问题

    2023-07-06 13:05:48
  • Sql Server2005对现有数据进行分区具体步骤

    2008-06-26 13:18:00
  • Dreamweaver给你的网页盖个章

    2008-02-03 11:35:00
  • php递归删除目录与文件的方法

    2023-09-12 02:02:02
  • Python如何实现感知器的逻辑电路

    2021-01-09 00:41:38
  • 鼠标实现图片的渐有渐无

    2013-06-30 02:49:10
  • python模拟点击网页按钮实现方法

    2021-06-18 21:13:09
  • asp之家 网络编程 m.aspxhome.com