用dlib进行简单的人脸特征提取特征向量到csv文件中,用knn进行预测识别(代码片段)

干完睡觉 干完睡觉     2023-03-28     192

关键词:

目标要求:基于收集的全班人脸数据实现分类识别,要求基于图片进行比对识别

任务流程大致分为以下过程:

1)模型准备:下载并部署一个人脸特征提取模型(功能包括人脸检测、人脸特征提取,不限算法,比如dlib. paddlehub等)

需要的准备好的Dlib两个模型为

dlib_face_recognition_resnet_model_v1.dat

shape_predictor_68_face_landmarks.dat

进行人脸检测和标注68个特征点

import numpy as np
import cv2
import dlib 
detector=dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('dlib\\shape_predictor_68_face_landmarks.dat')
# cv2读取图像
img = cv2.imread("D:\\\\postSchool\\\\Project\\\\face_recognition\\\\34class_face_dataset\\\\dlrb.png")
#print(img)
# 取灰度
img_gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
# 人脸数rects
rects = detector(img_gray, 1)
print(rects)
for i in range(len(rects)):
    landmarks = np.matrix([[p.x, p.y] for p in predictor(img,rects[i]).parts()])
    for idx, point in enumerate(landmarks):
        # 68点的坐标
        pos = (point[0, 0], point[0, 1])
        print(idx,pos)
        # 利用cv2.circle给每个特征点画一个圈,共68个
        cv2.circle(img, pos, 5, color=(0, 255, 0))
        # 利用cv2.putText输出1-68
        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.putText(img, str(idx+1), pos, font, 0.8, (0, 0, 255), 1,cv2.LINE_AA)
cv2.namedWindow("img", 2)
cv2.imshow("img", img)
cv2.waitKey(0)

 

 

 

2)人脸特征值数据提取并保存:dib模型68个特征点对 应中人脸特征值为1个128维度向量,将特征值合并保存为csv文件

我的文件数据下有68张图片:

 

import cv2
import os
import dlib
from skimage import io
import csv
import numpy as np

# 要读取人脸图像文件的路径
path_images_from_our = "D:\\\\postSchool\\\\Project\\\\face_recognition\\\\34class_face_dataset\\\\"
# Dlib 正向人脸检测器
detector = dlib.get_frontal_face_detector()
# Dlib 人脸预测器
predictor = dlib.shape_predictor("dlib\\shape_predictor_68_face_landmarks.dat")
# Dlib 人脸识别模型,将人脸映射成128D矢量
face_rec = dlib.face_recognition_model_v1("dlib\\dlib_face_recognition_resnet_model_v1.dat")


# 返回单张图像的 128D 特征
def return_128d_features(path_img):
    img_rd = io.imread(path_img)
    img_gray = cv2.cvtColor(img_rd, cv2.COLOR_BGR2RGB)
    faces = detector(img_gray, 1)
    print("%-40s %-20s" % ("正在处理的人脸图像 / image with faces detected:", path_img), '\\n')
    # 确保检测到是人脸图像去算特征
    if len(faces) != 0:
        shape = predictor(img_gray, faces[0])
        face_descriptor = face_rec.compute_face_descriptor(img_gray, shape)
    else:
        face_descriptor = 0
        print("no face")
    return face_descriptor

# 读取每个人人脸图像的数据
people = os.listdir(path_images_from_our)
os.listdir()
print(people)
with open("D:\\\\postSchool\\\\Project\\\\face_recognition\\\\face_features\\\\features_all.csv", "w", newline="") as csvfile:
    writer = csv.writer(csvfile)
    for person in people:
    #for i in range(0,2):
        print("******" + person + "****** Processing")
        features_128d = return_128d_features(path_images_from_our + "/" + person)
        print("特征值 / The features:", list(features_128d))
        writer.writerow(features_128d)#按行写入到Csv文件中
        print('\\n')
    print("3,4班的人脸数据存入 / Save all the features of faces registered into: D:\\\\postSchool\\\\Project\\\\face_recognition\\\\34class_face_dataset\\\\features_all.csv.csv")

 

 

    生成的CSV文件的维度为  68X128(每一行为每个人的128个特征向量)
3)人脸分类knn模型训练:基于生成的csx文件数据,构建knn算法并进行训练,该算法邻居数为1

   ps:我这里因为在处理图片的时候没有将对应图片的标签给读进去,所以自己手动补了68份Target标签(有点蠢哈哈)

import sklearn.datasets as datasets  # 导入数据库
from sklearn.neighbors import KNeighborsClassifier  # 导入KNN分类算法
import numpy as np
import pandas as pd
data = pd.read_csv("D:\\\\postSchool\\\\Project\\\\face_recognition\\\\face_features\\\\features_all.csv",header=None)
# 提取样本数据
data['target']=[3301,3302,3303,3304,3305,3307,3308,3309,3310,
       3311,3312,3313,3314,3315,3316,3317,3318,
       3319,3320,3321,3322,3323,3324,3325,3326,3327,3328,3329, 
       3330,3331,3332,3333,3334,3401,3402, 
       3403,3404,3405,3406,3407,3408,3409, 
       3410,3411,3412,3413,3414,3415,3416, 
       3417,3418,3419,3420,3421,3422,3423, 
       3424,3425,3426,3427,3428,3429,3430, 
       3431,3432,3433,3434,3435]  #手动加入标签
feature = data.iloc[:,:128]  # 特征数据
target=data['target']#标签数据
feature.head(5) #查看数据
target.head(5)
# 训练模型对象
knn = KNeighborsClassifier(n_neighbors=1)  
knn_face = knn.fit(feature, target)
print(knn_face)  # 打印训练的结果
# 预测分类结果的评分
print("KNN Score:",knn.score(feature,target))


4) 数据预测:待预测图像进行人脸特征值提取, 用KNN模型进行预测,并输出分类。
      因为这里数据集很少,每个人只有一次特征提取,所以直接用KNN进行预测,将新预测的图片也用人脸特征提取,然后用KNN计算与之最相近的特征,进行分类判断

#进行预测
test_path_img='D:\\\\postSchool\\\\Project\\\\face_recognition\\\\34class_face_dataset\\\\3419.png'#已知学号为3419
test_one=return_128d_features(test_path_img)#测试预测一张图片,转换成特征向量
X=np.array(test_one)
X=X.reshape(1, -1)#转变成一行数组
Y_lable = knn.predict(X)
print("预测该学号为:",Y_lable)

 结语:

        在完成这些的时候,Dlib库的安装碰了壁,我参考的是

        dlib 安装教程(三种方法)_MuMengSunny的博客-CSDN博客_dlib库安装

        我使用第三种安装方法,才成功安装,还有用openCV的时候打开图片路径一定不要有中文,最好使用\\\\+绝对路径

需要模型的自取

链接: https://pan.baidu.com/s/10DBM8aEy8ziDAT-ufQi71g 提取码: x4vs 复制这段内容后打开百度网盘手机App,操作更方便哦

参考资料 :

1.Dlib模型实现人脸识别_HarrietLH的博客-CSDN博客

2. dlib 安装教程(三种方法)_MuMengSunny的博客-CSDN博客_dlib库安装

人脸识别技术探讨:1:1,1:小n/大n,大姿态识别,活体识别

人脸识别是一种基于人的脸部特征信息进行身份认证的生物特征识别技术。静态人脸识别和动态人脸识别静态人脸识别是在特定的区域或者范围内来采集人脸照片并进行识别,如当前常见的门禁考勤应用。又或者是输入一张照片... 查看详情

人脸识别基于dlib库实现人脸特征值提取(代码片段)

...Dlib库二、OpenCV介绍即安装1.OpenCV简介2.OpenCV安装三、提取人脸特征点四、在眼睛处绘制黑色的实心圆五、总结六、参考一、Dlib库介绍与安装1.Dlib库简介  Dlib库是一个机器学习的开源库,包含了机器学习的很多算法,使... 查看详情

dlib人脸识别论文onemillisecondfacealignmentwithanensembleofregressiontrees

...的方法解决。在对样本抽取特征时,不对其基于全局坐标进行抽取,而是基于当前预测shape下的抽取,所以这些抽取的特征用于预测的时shape的更新向量。这个过程会重复多次直至收敛。2.在预测阶段,需要预测一个高维的空间向... 查看详情

python之人脸特征提取(代码片段)

Python之人脸特征提取一、安装dlib及OPENCV1.dlib安装2.安装opencv二、绘制人脸的68个特征点三、绘制黑色实心圈三、总结参考一、安装dlib及OPENCV1.dlib安装由于本文使用的python版本为3.8,因此直接使用cmd安装:pipinstalldlib-19.19.0-... 查看详情

在线会议中人脸面部轮廓图像提取——dlib库人脸面部轮廓图像特征提取(代码片段)

...。当当当当,第三期来廖!接上一期在线会议中人脸面部轮廓图像提取(二)——HOG人脸面部轮廓图像特征提取,介绍完HOG特征提取我们继续学习Dlib库提取特征叭!1、人脸轮廓图像提取原理在我们检测到... 查看详情

智能门锁人脸识别技术的原理是怎样的?

...度学习实现,利用卷积神经网络(CNN)对海量的人脸图片进行学习,卷积出包括表征人脸的脸型、鼻子、眼睛、嘴唇、眉毛等等的特征模型,对输入的图像提取出对区分不同人脸有用的特征向量。通过特征向量在特征空间里进行... 查看详情

python3利用dlib实现摄像头实时人脸识别(代码片段)

...输入的摄像头视频流,借助Dlib提供的检测识别模式来进行人脸识别,首先,从摄像头中录入(裁剪)人脸图片存蓄到本地,然后提取特征,构建预设人脸特征,根据抠取的/已有的同一个人多张人脸... 查看详情

人脸检测——hog特征

一、概述  前面一个系列,我们对车牌识别的相关技术进行了研究,但是车牌识别相对来说还是比较简单的,后续本人会对人脸检测、人脸识别,人脸姿态估计和人眼识别做一定的学习和研究。其中人脸检测相对来说比较简单... 查看详情

eigenface怎样进行人脸识别

...成分,具体实现是对训练集中所有人脸图像的协方差矩阵进行本征值分解,得对对应的本征向量,这些本征向量(特征向量)就是“特征脸”。每个特征向量或者特征脸相当于捕捉或者描述人脸之间的一种变化或者特性。这就意... 查看详情

Dlib 特征数组作为 CNN 和预测的输入

...07【问题描述】:我正在尝试使用CNN和dlib特征提取器创建人脸识别应用程序。我想做的是从同一个人的一堆照片中提取特征,然后将数组发送到我的CNN,它将为那个人生成一个2类分类器。如何将其更改为接受dlib特征数组、预测... 查看详情

视频是不能p的系列:使用dlib实现人脸识别

...#的第三篇。此前,我们已经可以通过OpenCV或者Dlib实现对人脸的检测,并在此基础上实现了某种相对有趣的应用。譬如,利用人脸特征点提取面部轮廓并生成表情包、将图片中的人脸批量替换为精神污染神烦狗等等。当然,在真... 查看详情

如何将文本文档表示为特征向量进行文本分类?

】如何将文本文档表示为特征向量进行文本分类?【英文标题】:Howtorepresenttextdocumentsasfeaturevectorsfortextclassification?【发布时间】:2012-03-0514:57:21【问题描述】:我有大约10,000个文本文档。如何将它们表示为特征向量,以便我可... 查看详情

使用 svm 进行人脸检测和使用 matlab 进行特征提取 [关闭]

】使用svm进行人脸检测和使用matlab进行特征提取[关闭]【英文标题】:facedetectionwithsvmandfeatureextractionusingmatlab[closed]【发布时间】:2016-01-2403:27:12【问题描述】:我的项目主题是svm的“人脸识别”,我必须实现它。所以在使用svm... 查看详情

使用Chinese Whispers算法的人脸聚类

...7-11-0520:52:37【问题描述】:我正在尝试使用中文耳语算法进行人脸聚类。我使用dlib和python来提取每个人脸的特征并映射到128D向量中,如Davisking在https://github.com/davisking/dlib/blob/master/ 查看详情

基于cnn的人脸相似度检测

...一篇文章中,使用CNN提取人脸特征,然后利用提取的特征进行分类。而在人脸相似度检测的工作中,我们也可以利用卷积神经网络先提取特征,然后对提取的特征进行利用。我们取fc7提取的4096维特征,然后对两个向量进行pairwise... 查看详情

dlib库包的介绍与使用,opencv+dlib检测人脸框opencv+dlib进行人脸68关键点检测,opencv+dlib实现人脸识别,dlib进行人脸特征聚类dlib视频目标跟踪(代码片段)

...区域关键点连线3.1dlib人脸关键点检测源码3.2opencv+dlib进行人脸关键点检测4dlib人脸识别4.1dlib进行人脸识别逻辑4.2opencv+dlib进行人脸识别4.3人脸识别总结5dlib人脸聚类6dlib视频目标跟踪1dlib库介绍dlib官网:http://dlib.net/dlib模... 查看详情

人脸识别完整项目实战(14):实时人脸特征点标定程序设计

...取,逐帧识别;3.人脸检测:调用Dlib提供的人脸检测器,进行人脸检测,并保存区域特征;4.特征点标定:调用dlib提供的68位人脸特征点检测模型,识别人脸特征点,并保存;5.特征区域绘制:基于识别出的特征点坐标,进行特... 查看详情

如何根据面部特征对人脸进行聚类?

】如何根据面部特征对人脸进行聚类?【英文标题】:Howtoclusterfacesofpersonsbasedonfaciallandmarks?【发布时间】:2018-07-1321:25:05【问题描述】:我正在使用dlib获取面部标志。我有超过1000张面孔的数据集。我想将这1000张图像与一些未... 查看详情