Python--Dlib人脸识别演示Demo

前言

基于开源服务Dlib实现人脸识别功能Dome演示

环境

windows/linux均可实现

  • python 3.8.3
  • dlib
  • numpy
  • cmake

代码

  • 人脸数据录入时将文件名称定义为用户名称,形成人脸数据通用户名称的键值对应关系,对此循环计算人脸数据特征值集合
"""
从图片中获取人脸并进行人脸识别检测
"""

import glob  # 文件操作模块
import os  # 操作系统功能接口函数
import dlib  # 人脸识别库
import numpy as np  # 数据处理库
from fastapi import FastAPI
import uvicorn

# 业务路由声明
app = FastAPI()

# 声明descriptors,用于存放已知图片对应的人脸特征向量
descriptors = []

# 声明face_data_path,用于存储用户人脸图像
# windows
face_data_path = r"G:\\02 FaceProject\\01-data\\"

# 声明face_test_path,用于存储用户人脸测试图像集
# windows
face_test_path = r"G:\\02 FaceProject\\02-test\\"

# 声明names,用于存放于人脸特征向量对应的名字。
names = []

# 正向人脸检测器将图像
detector = dlib.get_frontal_face_detector()

# Dlib 人脸特征点识别模型
# windows
predictor = dlib.shape_predictor(r"G:\\02 FaceProject\\shape_predictor_68_face_landmarks.dat")

# Dlib 人脸识别模型
# windows
face_rec = dlib.face_recognition_model_v1(r"G:\\02 FaceProject\\dlib_face_recognition_resnet_model_v1.dat")


# 遍历image_file_path目录下所有.jpg文件
@app.get("/logging_data/", tags=['遍历人脸库信息'])
def logging_data():
	print("遍历image_file_path目录下所有.jpg文件============================================================================")
	# 每次重新遍历之前清空信息
	descriptors.clear()
	names.clear()
	for image in glob.glob(os.path.join(face_data_path, "*.jpg")):
		name = list(os.path.basename(str(image)).split("."))[0]
		# if name not in names:
		names.append(name)
		img = dlib.load_rgb_image(image)
		# 1.人脸检测
		dets = detector(img, 1)

		for k, d in enumerate(dets):
			# 2.关键点检测
			shape = predictor(img, d)
			# 3.计算特征值向量(人脸描述符)
			descriptor = face_rec.compute_face_descriptor(img, shape)
			# 转换numpy数组
			v = np.array(descriptor)
			# if v not in descriptor:
			descriptors.append(v)


# 单张人脸识别检测(图片路径)
@app.get("/face_alone/{file_name}", tags=['单张人脸识别检测'])
def face_alone(file_name: str):
	print("单张人脸识别检测================================================================================================")
	face_name = face_common(face_test_path + file_name)
	print(face_name)
	return face_name


# 图片集人脸识别检测(图片集路径)
@app.get("/face_all/{image_file_path}", tags=['人脸集检测'])
def face_all(image_file_path):
	print("图片集人脸识别检测===============================================================================================")
	face_list = []
	for f in glob.glob(os.path.join(image_file_path, "*.jpg")):
		face_name = face_common(f)
		face_list.append(face_name)
	print(face_list)
	return face_list


# 公共人脸识别检测接口
def face_common(file_path: str):
	print("公共人脸识别检测================================================================================================")
	print("face_common names:" + str(names))
	img = dlib.load_rgb_image(file_path)
	# 使用 detector 检测器来检测图像中的人脸
	dets = detector(img, 1)
	for k, d in enumerate(dets):
		# 获取人脸特征点
		shape = predictor(img, d)
		# 计算特征值向量
		face_descriptor = face_rec.compute_face_descriptor(img, shape)
		# 将当前待判断的图片特征向量转化为 current
		current = np.array(face_descriptor)
		# 计算欧式距离,识别人脸
		# 设置阈值
		tolerance = 0.4
		# 设置该图片名字初值为:Unknow
		current_name = "UnKnow name"
		# 遍历已存放的图片特征值descriptor[]
		print("face_common descriptors.length:" + str(len(descriptors)))
		for i in range(len(descriptors)):
			# 计算欧式距离
			distance = np.linalg.norm(descriptors[i] - current)
			# 对欧式距离进行判断
			if distance < tolerance:
				current_name = names[i]
				return current_name
				break


# 测试
face_add("ZhaoYang")
face_all(r"G:\\02 FaceProject\\05-test")
face_alone(r"G:\\02 FaceProject\\04-data\\StefanieSun.jpg")
# 服务启动更新人脸库
logging_data()


# 服务启动
if __name__ == '__main__':
	uvicorn.run(app=app, host="127.0.0.1", port=24401, workers=1)

模块下载

  • dilb
      链接:dilb
      提取码:2cuy
      官网:dilb
  • numpy
      链接:numpy
      提取码:zekd
      官网:numpy
  • cmake
      链接:cmake
      提取码:l26v
  • 人脸特征点识别模型
      链接:特征点识别模型
      提取码:kaiu
  • 人脸识别模型
      链接:人脸识别模型
      提取码:9xbe

参考链接

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悄悄接

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值