使用Dlib实现人脸识别

部署运行你感兴趣的模型镜像

人脸识别应用87-人脸识别—快手视频讲解
人脸识别应用88-Java调用—快手视频讲解

dlib人脸识别原理基于深度残差网络ResNet-34生成128维人脸特征向量,通过欧氏距离比对实现身份验证‌,其技术流程分为人脸检测、特征提取、编码比对三个阶段。‌‌‌‌

‌核心技术架构‌

‌人脸检测模块‌。

使用HOG(方向梯度直方图)或CNN(卷积神经网络)模型定位人脸区域,支持多角度检测。
输出人脸包围框坐标及置信度得分。‌‌‌‌

‌特征定位与分析‌。

通过预训练模型(如68点或5点关键点定位器)捕捉面部特征。
提取眼睛、鼻子、嘴巴等关键部位的几何关系作为初始特征。‌‌‌‌

‌深度学习特征编码‌。

采用ResNet-34网络提取高阶语义特征。
网络输出128维向量(Face Encoding),通过三元组训练实现:
选取同一人两张照片与不同人一张构建训练集。
优化网络使同一人向量间距<0.6,不同人>1.0。‌‌‌‌

本例包含两个python文件,face_save.py用于提取人脸128D特征数据并记录到csv存档文件中,face_reco.py用于识别人脸,输入图片,根据csv存档文件找出人脸对应姓名。

测试步骤:
1、每人收集多幅人脸图片,保存特定目录中,每人分配一个目录。
比如:personA目录,personB目录
运行face_save.py,输入目录名personA,姓名personA,计算personA的人脸128D特征向量。
再运行一次face_save.py记录personA的人脸128D特征向量。
2、运行face.reco.py,输入用户personA或personB的图片,系统根据存档的人脸特征数据,预测图片上人脸的姓名。

face_save.py

import dlib,os,glob,time
import  cv2
from skimage import io
import csv
import pandas as pd


img_dir = input('Input image dir:')
person_name = input('Input person name:')
if img_dir is None or person_name is None:
    print('请输入  img_dir  & person_name')
    exit()

feat_dir = os.path.join(os.getcwd(),'feat_dir')
if not os.path.exists(feat_dir):
    os.makedirs(feat_dir)

predictor_path = "shape_predictor_68_face_landmarks.dat"
model_path = "dlib_face_recognition_resnet_model_v1.dat"
#加载Dlib模型
#人脸特征提取器
detector = dlib.get_frontal_face_detector()
#人脸关键点标记
predictor= dlib.shape_predictor(predictor_path)
#生成面部识别器
face_rec = dlib.face_recognition_model_v1(model_path)

#返回人脸图128D特征
#参数path_img为图片文件全路径名称
def get_128d_features(path_img):
    img_rd = io.imread(path_img)
    img_gray = cv2.cvtColor(img_rd, cv2.COLOR_BGR2RGB)
    #获得人脸框位置的检测器
    faces = detector(img_gray, 1)
    if len(faces) != 0:
        #获得人脸关键点检测器,predictor(img_gray, faces[0]) img_gray表示输入图片,faces[0]表示人脸框的位置信息
        shape = predictor(img_gray, faces[0])
        #用来计算某个图片的特征值,返回128D向量
        face_descriptor = face_rec.compute_face_descriptor(img_gray, shape)
    else:
        face_descriptor = 0
        print("there is no face")
    return face_descriptor


#计算目录下所有图片人脸128D特征数据,并记录到csv文件
#参数feat_dir为保持每个人人脸特征csv文件所在目录
#参数img_path为目录名称,其下包含人脸图片
#参数csv_name为csv文件名称
def write_into_csv(feat_dir,img_path, csv_name):
    dir_pics = os.listdir(img_path)
    csv_name = feat_dir+'/'+csv_name
    with open(csv_name, "w", newline="") as csvfile:
        writer = csv.writer(csvfile)
        for i in range(len(dir_pics)):
            print("正在读的人脸图像:", img_path + "/" + dir_pics[i])
            #计算人脸128D特征向量
            features_128d = get_128d_features(img_path + "/" + dir_pics[i])
            if features_128d == 0: #未检出到人脸跳过本次循环
                i += 1
            else:
                writer.writerow(features_128d) #将人脸数据写入csv文件

#计算每个人脸特征数据的平均值
def computeMean(feature_path):
    #设置csv文件标题行替位符,避免将第一行数据作为标题
    head=[]
    for i in range(128):
        fe="feature_"+str(i+1)
        head.append(fe)
    rdata = pd.read_csv(feature_path,names=head)
    #计算平均128D向量数据平均值
    meanValue=rdata.mean()
    return meanValue

if __name__ == "__main__":
    #根据输入参数img_dir,遍历目录img_dir下所有人脸图片
    #每张人脸图片计算128D向量数据并记录到csv文件
    write_into_csv(feat_dir, img_dir, person_name+"_feat.csv")

    #遍历每个人的人脸特征csv文件,计算平均值并记录到feature_all.csv文件
    features=os.listdir(feat_dir)
    with open("feature_all.csv", "w", newline="") as csvfile:
        writer = csv.writer(csvfile)
        for fea in features:
            meanValue=computeMean(feat_dir+'/'+fea)
            writer.writerow(meanValue)

face_reco.py

import dlib,os,glob,time
import  cv2
from skimage import io
import csv
import pandas as pd
import numpy as np

img_name = input('Input image name:')
if img_name is None:
    print('请输入  img_name')
    exit()

predictor_path = "shape_predictor_68_face_landmarks.dat"
model_path = "dlib_face_recognition_resnet_model_v1.dat"
#加载Dlib模型
#人脸特征提取器
detector = dlib.get_frontal_face_detector()
#人脸关键点标记
predictor= dlib.shape_predictor(predictor_path)
#生成面部识别器
face_rec = dlib.face_recognition_model_v1(model_path)

#设置csv文件标题行替位符,避免将第一行数据作为标题
head = []
for i in range(128):
    fe = "feature_" + str(i + 1)
    head.append(fe)
face_path="feature_all.csv"
#读取所有人的人脸特征数据
face_feature=pd.read_csv(face_path,names=head)
face_feature_array=np.array(face_feature)
face_list=["Chandler","Joey","Monica"]
cv2.namedWindow("Face Recognition", cv2.WINDOW_KEEPRATIO)
cv2.resizeWindow("Face Recognition", 720,576)

#计算两个人的人脸特征数据的欧式距离
def compute_dst(feature_1,feature_2):
    feature_1 = np.array(feature_1)
    feature_2 = np.array(feature_2)
    dist = np.linalg.norm(feature_1 - feature_2)
    return dist

descriptors = []
faces = []
frame = cv2.imread(img_name) #根据图片文件获取图片数据
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
dets = detector(gray, 1)  #获得人脸框位置的检测器
if len(dets) > 0:
    for index, value in enumerate(dets):
        #获得人脸关键点检测器,predictor(gray, value) gray表示输入图片,value表示人脸框的位置信息
        shape = predictor(gray, value)
        # 在图形窗口标记人脸
        cv2.rectangle(frame, (value.left(), value.top()), (value.right(), value.bottom()), (0, 255, 0), 2)
        #用来计算某个图片的特征值,返回128D向量
        face_descriptor = face_rec.compute_face_descriptor(frame, shape)
        v = np.array(face_descriptor)
        faceLen = len(face_list)
        flag = 0
        for j in range(faceLen):
            #比较输入图片人脸特征与csv文件保存的人脸数据比对
            dis = compute_dst(v, face_feature_array[j])
            #计算欧式距离距离,当距离小于0.56说明能够匹配到人脸
            if (dis < 0.56):
                flag = 1
                #在图形窗口标注匹配人的姓名
                cv2.putText(frame, face_list[j], (value.left(), value.top()), cv2.FONT_HERSHEY_COMPLEX, 0.8,
                            (0, 255, 255), 1, cv2.LINE_AA)
                break
        #如果未匹配到人脸,在图形窗口标注未知
        if (flag == 0):
            cv2.putText(frame, "Unknonw", (value.left(), value.top()), cv2.FONT_HERSHEY_COMPLEX, 0.8, (0, 255, 255), 1,
                        cv2.LINE_AA)

        # 标记人脸关键点
        for pti, pt in enumerate(shape.parts()):
            pos = (pt.x, pt.y)
            cv2.circle(frame, pos, 1, color=(0, 255, 0))

cv2.imshow("Face Recognition", frame)  # 在窗口中显示
exitKey = cv2.waitKey()
if exitKey == 27:
    cv2.destroyWindow("Face Recognition")

在这里插入图片描述
在这里插入图片描述
代码下载:通过网盘分享的文件:Dlib_face.zip
链接: https://pan.baidu.com/s/1U5Ge7wInKP7YD_W4CaO1MQ 提取码: jwp5

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值