基于Dlib训练自已的人脸数据集提高人脸识别的准确率

前言

由于图像的质量、光线、角度等因素影响。这时如果使用官方提供的模型做人脸识别,就会导至识别率不是很理想。人脸识别的准确率与图像的清晰度和质量有关。如果图像模糊、光线不足或者有其他干扰因素,Dlib 可能无法正确地识别人脸。为了确保图像质量良好,可以使用更清晰的图像、改善光照条件或使用图像增强技术来提高图像质量。但这些并不是本篇章要讲述的内容。那么除去图像质量和光线不足等因素,如何解决准确率的问题呢?答案就是需要自已收集人脸并进行训练自已的识别模型。

模型训练

要使用Dlib训练自己的人脸数据集,可以按照以下步骤进行:

  1. 数据收集:收集一组包含人脸的图像,并对每个人脸进行标记。可以使用Dlib提供的标记工具来手动标记每个人脸的位置。

  2. 数据准备:将数据集划分为训练集和测试集。确保训练集和测试集中的图像具有不同的人脸,并且每个人脸都有相应的标记。

  3. 特征提取:使用Dlib提供的人脸特征提取器,如dlib.get_frontal_face_detector()和dlib.shape_predictor(),对每个图像进行人脸检测和关键点定位。可以使用这些关键点来提取人脸特征。

  4. 特征向量生成:对于每个人脸,使用关键点和人脸图像来生成一个唯一的特征向量。可以使用Dlib的face_recognition模块中的face_encodings()函数来生成特征向量。

  5. 训练分类器:使用生成的特征向量和相应的标签来训练分类器。可以使用Dlib的svm_c_trainer()或者其他分类器进行训练。确保使用训练集进行训练,并使用测试集进行验证。

  6. 评估准确率:使用测试集对训练好的分类器进行评估,计算准确率、召回率等指标来评估人脸识别的性能。

以下是一个简单的例子,展示了如何使用Dlib训练自己的人脸数据集:

导入必要的库

import dlib
import os
import numpy as np
from sklearn import svm

定义数据集路径和模型路径

dataset_path = "path_to_dataset"
model_path = "path_to_save_model"

加载人脸检测器和关键点定位器

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

收集数据集中的图像和标签

images = []
labels = []# 遍历数据集目录
for person_name in os.listdir(dataset_path):person_path = os.path.join(dataset_path, person_name)if os.path.isdir(person_path):# 遍历每个人的图像for image_name in os.listdir(person_path):image_path = os.path.join(person_path, image_name)# 加载图像img = dlib.load_rgb_image(image_path)# 人脸检测和关键点定位dets = detector(img)for det in dets:shape = predictor(img, det)# 生成特征向量face_descriptor = np.array(face_recognition.face_encodings(img, [shape])[0])# 添加到训练集images.append(face_descriptor)labels.append(person_name)# 转换为numpy数组
images = np.array(images)
labels = np.array(labels)

设置训练分类器

# 训练分类器
classifier = svm.SVC(kernel='linear', probability=True)
classifier.fit(images, labels)

保存模型

dlib.save_linear_kernel(model_path, classifier)

完整代码

import dlib
import os
import numpy as np
from sklearn import svmdataset_path = "path_to_dataset"
model_path = "path_to_save_model"detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")images = []
labels = []# 遍历数据集目录
for person_name in os.listdir(dataset_path):person_path = os.path.join(dataset_path, person_name)if os.path.isdir(person_path):# 遍历每个人的图像for image_name in os.listdir(person_path):image_path = os.path.join(person_path, image_name)# 加载图像img = dlib.load_rgb_image(image_path)# 人脸检测和关键点定位dets = detector(img)for det in dets:shape = predictor(img, det)# 生成特征向量face_descriptor = np.array(face_recognition.face_encodings(img, [shape])[0])# 添加到训练集images.append(face_descriptor)labels.append(person_name)# 转换为numpy数组
images = np.array(images)
labels = np.array(labels)# 训练分类器
classifier = svm.SVC(kernel='linear', probability=True)
classifier.fit(images, labels)images = []
labels = []# 遍历数据集目录
for person_name in os.listdir(dataset_path):person_path = os.path.join(dataset_path, person_name)if os.path.isdir(person_path):# 遍历每个人的图像for image_name in os.listdir(person_path):image_path = os.path.join(person_path, image_name)# 加载图像img = dlib.load_rgb_image(image_path)# 人脸检测和关键点定位dets = detector(img)for det in dets:shape = predictor(img, det)# 生成特征向量face_descriptor = np.array(face_recognition.face_encodings(img, [shape])[0])# 添加到训练集images.append(face_descriptor)labels.append(person_name)# 转换为numpy数组
images = np.array(images)
labels = np.array(labels)# 训练分类器
classifier = svm.SVC(kernel='linear', probability=True)
classifier.fit(images, labels)images = []
labels = []# 遍历数据集目录
for person_name in os.listdir(dataset_path):person_path = os.path.join(dataset_path, person_name)if os.path.isdir(person_path):# 遍历每个人的图像for image_name in os.listdir(person_path):image_path = os.path.join(person_path, image_name)# 加载图像img = dlib.load_rgb_image(image_path)# 人脸检测和关键点定位dets = detector(img)for det in dets:shape = predictor(img, det)# 生成特征向量face_descriptor = np.array(face_recognition.face_encodings(img, [shape])[0])# 添加到训练集images.append(face_descriptor)labels.append(person_name)# 转换为numpy数组
images = np.array(images)
labels = np.array(labels)# 训练分类器
classifier = svm.SVC(kernel='linear', probability=True)
classifier.fit(images, labels)#保存模型
dlib.save_linear_kernel(model_path, classifier)

除了使用SVM分类器,你还可以使用其他分类器进行人脸识别模型的训练。以下是一些常见的分类器:

  1. 决策树分类器(Decision Tree Classifier):基于树结构的分类器,可以通过一系列的决策来对样本进行分类。

  2. 随机森林分类器(Random Forest Classifier):由多个决策树组成的集成学习模型,通过投票或平均预测结果来进行分类。

  3. K最近邻分类器(K-Nearest Neighbors Classifier):根据样本之间的距离来进行分类,将未知样本分类为其最近的K个邻居中最常见的类别。

  4. 朴素贝叶斯分类器(Naive Bayes Classifier):基于贝叶斯定理的概率分类器,假设特征之间相互独立,通过计算后验概率进行分类。

  5. 神经网络分类器(Neural Network Classifier):由多层神经元组成的模型,通过反向传播算法进行训练,可以用于复杂的分类任务。

这些分类器都有各自的优缺点和适用场景,你可以根据你的数据集和需求选择合适的分类器进行训练。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/90697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【问题思考总结】CPU怎么访问磁盘?CPU只有32位,最多只能访问4GB的空间吗?

问题 在学习操作系统的时候发现了这样一个问题,32位的CPU寻址空间只有4GB,难道只有4GB的空间可以使用吗?以此为始,我开始了一些思考。 思考 Q1:首先,我似乎混淆了一个概念,内存和外存&#x…

十七,IBL-打印各个Mipmap级别的hdr环境贴图

预滤波环境贴图类似于辐照度图,是预先计算的环境卷积贴图,但这次考虑了粗糙度。因为随着粗糙度的增加,参与环境贴图卷积的采样向量会更分散,导致反射更模糊,所以对于卷积的每个粗糙度级别,我们将按顺序把模…

React 知识点总结

本篇文章是我自己总结已经写过的react知识点,大框架已生成,知识持续更新中。仅供参考 生命周期 React 生命周期 组件基础 react中受控组件与非受控组件 React Portals 理解React页面渲染原理,如何优化React性能? 学习篇之R…

【单片机】11-步进电机和直流电机

1.直流电机 1.什么是电机 电能转换为动能 2.常见电机 (1)交流电机【大功率】:两相【200W左右】,三相【1000W左右】 (2)直流电机【小功率】:永磁【真正的磁铁】,励磁【电磁铁】 &…

3种Renko图表形态FPmarkets3秒轻松判断价格走势

Renko图表形态在交易中的应用并不逊色于其他技术分析方法。相较于普通的烛台图表,使用Renko图表时,有些经典模式更容易被发现和识别,FPmarkets总结这些模式包括: 首先是头和肩膀形态。这是一种价格反转形态,由两个较小…

华为智能企业远程办公安全解决方案(1)

华为智能企业远程办公安全解决方案(1) 课程地址方案背景需求分析企业远程办公业务概述企业远程办公安全风险分析企业远程办公环境搭建需求分析 方案设计组网架构设备选型方案亮点 课程地址 本方案相关课程资源已在华为O3社区发布,可按照以下…

Java编码技巧:验证码

目录 1.1、EasyCaptcha(优选,支持种类多,样式多,使用简单)1.1.1、作用1.1.2、官方信息1.1.3、使用案例1.1.4、依赖1.1.5、代码1.1.6、效果1.1.7、拓展 1.2、kaptcha1.2.1、作用1.2.2、官方信息1.2.3、使用案例1.2.4、依…

SLAM从入门到精通(amcl定位使用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 学习slam,一般就是所谓的边定位、边制图的知识。然而在实际生产过程中,比如扫地机器人、agv、巡检机器人、农业机器人&…

聊一聊JDK21-虚拟线程

目录 前言 Virtual Threads的开始 为什么需要Virtual Threads JDK19 预览版初次出现 JDK21 Virtual Threads的正式发布 Virtual Threads 该怎么使用 简单聊聊Virtual Threads的实现 使用时候的注意事项 本地尝鲜一下JDK21及Virtual Threads 结语 前言 2023年9月19日…

【数据挖掘】2022年 Quiz 1-3 整理 带答案

目录 Quiz 1Quiz 2Quiz 3Quiz 1 Problem 1 (50%). Consider the set of training data shown below. Here, A, B, C C C are attributes, and D D

字符串改错题(找出代码中所有错误,将一个字符串倒序)

#include "string.h" main() {char *pSrc "hello,world";char *pDest NULL; int iLen strlen(pSrc);pDest (char*)malloc(iLen);char *pD pDest;char* pS pSrc[iLen]; while(iLen--!0){pD pS--;}printf("%s", pDest);return 0; }在使用 m…

设计模式——7. 装饰者模式

1. 说明 装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许你在不改变对象接口的前提下,动态地将新行为附加到对象上。这种模式是通过创建一个包装(或装饰)对象,将要被装饰的对象包裹起来,从而实现对原有对象功能的增强和扩展。 装饰者模式的主要特点包括:…

【Leetcode】163.缺失的区间

一、题目 1、题目描述 给定一个排序的整数数组 nums ,其中元素的范围在 闭区间 [lower, upper] 当中,返回不包含在数组中的缺失区间。 示例1: 输入: nums = [0, 1, 3, 50, 75], lower = 0 和 upper = 99, 输出: [“2”, “4->49”, “51->74”, “76->99”] 解…

C++:vector 定义,用法,作用,注意点

C 中的 vector 是标准模板库(STL)提供的一种动态数组容器,它提供了一组强大的方法来管理和操作可变大小的数组。以下是关于 vector 的定义、用法、作用以及一些注意点: 定义: 要使用 vector,首先需要包含 …

PG-DBA培训16:PostgreSQL负载均衡分发与双主HA架构

一、风哥PG-DBA培训16:PostgreSQL负载均衡分发与双主HA架构 本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQL主从复制与高可用集群阶段之PostgreSQL负载均衡分发与双主HA架构,学完本课程可以掌握PostgreSQL高可用负…

C理解(五):编译,链接库,宏,关键字,变量

编译 编译过程 文件.c->(预处理)->文件.i->(编译)->文件.S->(汇编)->文件.o->(链接)->elf程序 预处理 内容:加载头文件(#include),清除注释(//,./*),替换条件编译(#if #elif #endif #ifdef),替换宏定义(#define) …

探索社会工程的深度:从定义到高级攻击策略

在广阔的网络安全领域,社会工程作为一种微妙的威胁而出现,它利用人类的漏洞来访问敏感信息或实施欺诈。网络安全背景下的社会工程的定义很明确:它包括使用欺骗手段操纵个人泄露机密或个人信息,然后将这些信息用于欺诈目的。 此类…

【AI视野·今日CV 计算机视觉论文速览 第257期】Fri, 29 Sep 2023

AI视野今日CS.CV 计算机视觉论文速览 Fri, 29 Sep 2023 Totally 99 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Learning to Transform for Generalizable Instance-wise Invariance Authors Utkarsh Singhal, Carlos Esteves, Ameesh M…

WebGL笔记:绘制多个点,三角形,以及画各种不同的线条

绘制多点 1 ) WebGL 缓冲区 我们在用js定点位的时候,肯定是要建立一份顶点数据的,这份顶点数据是给着色器的,因为着色器需要这份顶点数据绘图然而,我们在js中建立顶点数据,着色器肯定是拿不到的&#xff…

《Python趣味工具》——ppt的操作(刷题版)

前面我们对PPT进行了一定的操作,并将其中的文字提取到了word文档中。现在就让我们来刷几道题巩固巩固吧! 文章目录 1. 查看PPT(上)2. 查看PPT(中)3. 查看PPT(下)4. PPT的页码5. 大学…