前言
基于开源服务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