竞赛 基于深度学习的人脸识别系统

news2025/2/21 4:36:39

前言

🔥 优质竞赛项目系列,今天要分享的是

基于深度学习的人脸识别系统

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

机器学习-人脸识别过程

基于传统图像处理和机器学习技术的人脸识别技术,其中的流程都是一样的。

机器学习-人脸识别系统都包括:

  • 人脸检测
  • 人脸对其
  • 人脸特征向量化
  • 人脸识别
    在这里插入图片描述

人脸检测

人脸检测用于确定人脸在图像中的大小和位置,即解决“人脸在哪里”的问题,把真正的人脸区域从图像中裁剪出来,便于后续的人脸特征分析和识别。下图是对一张图像的人脸检测结果:

在这里插入图片描述

人脸对其

同一个人在不同的图像序列中可能呈现出不同的姿态和表情,这种情况是不利于人脸识别的。

所以有必要将人脸图像都变换到一个统一的角度和姿态,这就是人脸对齐。

它的原理是找到人脸的若干个关键点(基准点,如眼角,鼻尖,嘴角等),然后利用这些对应的关键点通过相似变换(Similarity
Transform,旋转、缩放和平移)将人脸尽可能变换到标准人脸。

下图是一个典型的人脸图像对齐过程:
在这里插入图片描述
这幅图就更加直观了:
在这里插入图片描述

人脸特征向量化

这一步是将对齐后的人脸图像,组成一个特征向量,该特征向量用于描述这张人脸。

但由于,一幅人脸照片往往由比较多的像素构成,如果以每个像素作为1维特征,将得到一个维数非常高的特征向量, 计算将十分困难;而且这些像素之间通常具有相关性。

所以我们常常利用PCA技术对人脸描述向量进行降维处理,保留数据集中对方差贡献最大的人脸特征来达到简化数据集的目的

PCA人脸特征向量降维示例代码:

#coding:utf-8
from numpy import *
from numpy import linalg as la
import cv2
import os
 
def loadImageSet(add):
    FaceMat = mat(zeros((15,98*116)))
    j =0
    for i in os.listdir(add):
        if i.split('.')[1] == 'normal':
            try:
                img = cv2.imread(add+i,0)
            except:
                print 'load %s failed'%i
            FaceMat[j,:] = mat(img).flatten()
            j += 1
    return FaceMat
 
def ReconginitionVector(selecthr = 0.8):
    # step1: load the face image data ,get the matrix consists of all image
    FaceMat = loadImageSet('D:\python/face recongnition\YALE\YALE\unpadded/').T
    # step2: average the FaceMat
    avgImg = mean(FaceMat,1)
    # step3: calculate the difference of avgimg and all image data(FaceMat)
    diffTrain = FaceMat-avgImg
    #step4: calculate eigenvector of covariance matrix (because covariance matrix will cause memory error)
    eigvals,eigVects = linalg.eig(mat(diffTrain.T*diffTrain))
    eigSortIndex = argsort(-eigvals)
    for i in xrange(shape(FaceMat)[1]):
        if (eigvals[eigSortIndex[:i]]/eigvals.sum()).sum() >= selecthr:
            eigSortIndex = eigSortIndex[:i]
            break
    covVects = diffTrain * eigVects[:,eigSortIndex] # covVects is the eigenvector of covariance matrix
    # avgImg 是均值图像,covVects是协方差矩阵的特征向量,diffTrain是偏差矩阵
    return avgImg,covVects,diffTrain
 
def judgeFace(judgeImg,FaceVector,avgImg,diffTrain):
    diff = judgeImg.T - avgImg
    weiVec = FaceVector.T* diff
    res = 0
    resVal = inf
    for i in range(15):
        TrainVec = FaceVector.T*diffTrain[:,i]
        if  (array(weiVec-TrainVec)**2).sum() < resVal:
            res =  i
            resVal = (array(weiVec-TrainVec)**2).sum()
    return res+1
 
if __name__ == '__main__':
 
    avgImg,FaceVector,diffTrain = ReconginitionVector(selecthr = 0.9)
    nameList = ['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15']
    characteristic = ['centerlight','glasses','happy','leftlight','noglasses','rightlight','sad','sleepy','surprised','wink']
 
    for c in characteristic:
 
        count = 0
        for i in range(len(nameList)):
 
            # 这里的loadname就是我们要识别的未知人脸图,我们通过15张未知人脸找出的对应训练人脸进行对比来求出正确率
            loadname = 'D:\python/face recongnition\YALE\YALE\unpadded\subject'+nameList[i]+'.'+c+'.pgm'
            judgeImg = cv2.imread(loadname,0)
            if judgeFace(mat(judgeImg).flatten(),FaceVector,avgImg,diffTrain) == int(nameList[i]):
                count += 1
        print 'accuracy of %s is %f'%(c, float(count)/len(nameList))  # 求出正确率

人脸识别

这一步的人脸识别,其实是对上一步人脸向量进行分类,使用各种分类算法。

比如:贝叶斯分类器,决策树,SVM等机器学习方法。

从而达到识别人脸的目的。

这里分享一个svm训练的人脸识别模型:



    from __future__ import print_function
    
    from time import time
    import logging
    import matplotlib.pyplot as plt
    
    from sklearn.cross_validation import train_test_split
    from sklearn.datasets import fetch_lfw_people
    from sklearn.grid_search import GridSearchCV
    from sklearn.metrics import classification_report
    from sklearn.metrics import confusion_matrix
    from sklearn.decomposition import RandomizedPCA
    from sklearn.svm import SVC


    print(__doc__)
    
    # Display progress logs on stdout
    logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s')


    ###############################################################################
    # Download the data, if not already on disk and load it as numpy arrays
    
    lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)
    
    # introspect the images arrays to find the shapes (for plotting)
    n_samples, h, w = lfw_people.images.shape
    
    # for machine learning we use the 2 data directly (as relative pixel
    # positions info is ignored by this model)
    X = lfw_people.data
    n_features = X.shape[1]
    
    # the label to predict is the id of the person
    y = lfw_people.target
    target_names = lfw_people.target_names
    n_classes = target_names.shape[0]
    
    print("Total dataset size:")
    print("n_samples: %d" % n_samples)
    print("n_features: %d" % n_features)
    print("n_classes: %d" % n_classes)


    ###############################################################################
    # Split into a training set and a test set using a stratified k fold
    
    # split into a training and testing set
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.25, random_state=42)


    ###############################################################################
    # Compute a PCA (eigenfaces) on the face dataset (treated as unlabeled
    # dataset): unsupervised feature extraction / dimensionality reduction
    n_components = 80
    
    print("Extracting the top %d eigenfaces from %d faces"
          % (n_components, X_train.shape[0]))
    t0 = time()
    pca = RandomizedPCA(n_components=n_components, whiten=True).fit(X_train)
    print("done in %0.3fs" % (time() - t0))
    
    eigenfaces = pca.components_.reshape((n_components, h, w))
    
    print("Projecting the input data on the eigenfaces orthonormal basis")
    t0 = time()
    X_train_pca = pca.transform(X_train)
    X_test_pca = pca.transform(X_test)
    print("done in %0.3fs" % (time() - t0))


    ###############################################################################
    # Train a SVM classification model
    
    print("Fitting the classifier to the training set")
    t0 = time()
    param_grid = {'C': [1,10, 100, 500, 1e3, 5e3, 1e4, 5e4, 1e5],
                  'gamma': [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1], }
    clf = GridSearchCV(SVC(kernel='rbf', class_weight='balanced'), param_grid)
    clf = clf.fit(X_train_pca, y_train)
    print("done in %0.3fs" % (time() - t0))
    print("Best estimator found by grid search:")
    print(clf.best_estimator_)
    
    print(clf.best_estimator_.n_support_)
    ###############################################################################
    # Quantitative evaluation of the model quality on the test set
    
    print("Predicting people's names on the test set")
    t0 = time()
    y_pred = clf.predict(X_test_pca)
    print("done in %0.3fs" % (time() - t0))
    
    print(classification_report(y_test, y_pred, target_names=target_names))
    print(confusion_matrix(y_test, y_pred, labels=range(n_classes)))


    ###############################################################################
    # Qualitative evaluation of the predictions using matplotlib
    
    def plot_gallery(images, titles, h, w, n_row=3, n_col=4):
        """Helper function to plot a gallery of portraits"""
        plt.figure(figsize=(1.8 * n_col, 2.4 * n_row))
        plt.subplots_adjust(bottom=0, left=.01, right=.99, top=.90, hspace=.35)
        for i in range(n_row * n_col):
            plt.subplot(n_row, n_col, i + 1)
            # Show the feature face
            plt.imshow(images[i].reshape((h, w)), cmap=plt.cm.gray)
            plt.title(titles[i], size=12)
            plt.xticks(())
            plt.yticks(())


    # plot the result of the prediction on a portion of the test set
    
    def title(y_pred, y_test, target_names, i):
        pred_name = target_names[y_pred[i]].rsplit(' ', 1)[-1]
        true_name = target_names[y_test[i]].rsplit(' ', 1)[-1]
        return 'predicted: %s\ntrue:      %s' % (pred_name, true_name)
    
    prediction_titles = [title(y_pred, y_test, target_names, i)
                         for i in range(y_pred.shape[0])]
    
    plot_gallery(X_test, prediction_titles, h, w)
    
    # plot the gallery of the most significative eigenfaces
    
    eigenface_titles = ["eigenface %d" % i for i in range(eigenfaces.shape[0])]
    plot_gallery(eigenfaces, eigenface_titles, h, w)
    
    plt.show()


深度学习-人脸识别过程

不同于机器学习模型的人脸识别,深度学习将人脸特征向量化,以及人脸向量分类结合到了一起,通过神经网络算法一步到位。

深度学习-人脸识别系统都包括:

  • 人脸检测
  • 人脸对其
  • 人脸识别

人脸检测

深度学习在图像分类中的巨大成功后很快被用于人脸检测的问题,起初解决该问题的思路大多是基于CNN网络的尺度不变性,对图片进行不同尺度的缩放,然后进行推理并直接对类别和位置信息进行预测。另外,由于对feature
map中的每一个点直接进行位置回归,得到的人脸框精度比较低,因此有人提出了基于多阶段分类器由粗到细的检测策略检测人脸,例如主要方法有Cascade CNN、
DenseBox和MTCNN等等。

MTCNN是一个多任务的方法,第一次将人脸区域检测和人脸关键点检测放在了一起,与Cascade
CNN一样也是基于cascade的框架,但是整体思路更加的巧妙合理,MTCNN总体来说分为三个部分:PNet、RNet和ONet,网络结构如下图所示。

在这里插入图片描述

人脸识别

人脸识别问题本质是一个分类问题,即每一个人作为一类进行分类检测,但实际应用过程中会出现很多问题。第一,人脸类别很多,如果要识别一个城镇的所有人,那么分类类别就将近十万以上的类别,另外每一个人之间可获得的标注样本很少,会出现很多长尾数据。根据上述问题,要对传统的CNN分类网络进行修改。

我们知道深度卷积网络虽然作为一种黑盒模型,但是能够通过数据训练的方式去表征图片或者物体的特征。因此人脸识别算法可以通过卷积网络提取出大量的人脸特征向量,然后根据相似度判断与底库比较完成人脸的识别过程,因此算法网络能不能对不同的人脸生成不同的特征,对同一人脸生成相似的特征,将是这类embedding任务的重点,也就是怎么样能够最大化类间距离以及最小化类内距离。

Metric Larning

深度学习中最先应用metric
learning思想之一的便是DeepID2了。其中DeepID2最主要的改进是同一个网络同时训练verification和classification(有两个监督信号)。其中在verification
loss的特征层中引入了contrastive loss。

Contrastive
loss不仅考虑了相同类别的距离最小化,也同时考虑了不同类别的距离最大化,通过充分运用训练样本的label信息提升人脸识别的准确性。因此,该loss函数本质上使得同一个人的照片在特征空间距离足够近,不同人在特征空间里相距足够远直到超过某个阈值。(听起来和triplet
loss有点像)。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

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

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

相关文章

spring security教程(一)--认证

零.简介 【1】简介 【2】登录校验流程 【3】原理&#xff08;入门的时候先了解一下就好&#xff09; 一.思路分析 二.建表 确保你已经建立好一张用户表&#xff0c;并且引入springboot&#xff0c;mybatis&#xff0c;mp,slf4j等基础依赖。 即使你有多个角色你也可以将他们的…

安装社区版本OB

获取一键安装包 https://www.oceanbase.com/softwarecenter 离线安装 [admintest001 ~]$ tar -xzf oceanbase-all-in-one-*.tar.gz [admintest001 ~]$ cd oceanbase-all-in-one/bin/ [admintest001 bin]$ ./install.sh [admintest001 bin]$ source ~/.oceanbase-all-in-one/…

【人工智能】企业如何使用 AI与人工智能的定义、研究价值、发展阶段的深刻讨论

前言 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。 它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是新一轮科技革命和产业变革的重要驱动力量。 &#x1f4d5;作者简介&#x…

stm32学习-芯片系列/选型/开发方式

【03】STM32HAL库开发-初识STM32 | STM概念、芯片分类、命名规则、选型 | STM32原理图设计、看数据手册、最小系统的组成 、STM32IO分配_小浪宝宝的博客-CSDN博客  STM32&#xff1a;ST是意法半导体&#xff0c;M是MCU/MPU&#xff0c;32是32位。  ST累计推出了&#xff1a…

【NCRE 二级Java语言程序设计03】考试环境及考试过程概览

目录 前言一、考试环境介绍1.硬件环境2.软件环境 二、考试特别说明1.考试时间说明2.考试题型及分值 三、考试流程介绍1.登录考试系统2.考试答题界面3.答题交卷操作 总结 前言 &#x1f4dc;本专栏主要是分享自己备考全国计算机二级Java语言程序设计所学心得体会、所搜集的资料信…

CTF —— 网络安全大赛(这不比王者好玩吗?)

前言 随着大数据、人工智能的发展&#xff0c;人们步入了新的时代&#xff0c;逐渐走上科技的巅峰。 \ ⚔科技是一把双刃剑&#xff0c;网络安全不容忽视&#xff0c;人们的隐私在大数据面前暴露无遗&#xff0c;账户被盗、资金损失、网络诈骗、隐私泄露&#xff0c;种种迹象…

大数据快速入门开发环境篇:CentOS 7安装配置Hadoop大数据框架开发环境

注意&#xff1a;在开始安装之前&#xff0c;请确保您的CentOS 7系统已经正确安装和配置了Java。Hadoop需要Java来运行。 目录 一、下载与配置Hadoop框架&#xff1a;1.1、下载与环境变量设置1.2、XML配置文件Hadoop设置1.3、格式化HDFS 二、Hadoop 3.x版本中hdfs命令的问题解…

使用命令行(CMD)编译单Java文件

1.安装JDK JDK官网&#xff1a;https://www.oracle.com/java/technologies/downloads/ 选 Windows -> x64 MSI Instaler或者x64 Installer 安装成功后。 2.配置环境变量 按下Win键&#xff0c;搜索环境变量 添加JAVA_HOME系统环境变量&#xff0c;要指定类似这样的路径(…

day1_QT

day1_QT 实现登录窗口效果 实现登录窗口 #include "loginwindow.h"LoginWindow::LoginWindow(QWidget *parent): QWidget(parent) {//设置窗口标题和图标this->setWindowTitle("ChatWe");this->setWindowIcon(QIcon("D:\\learn\\QT\\day1\\wor…

RT-Thread UART设备

UART UART&#xff08;Universal Asynchronous Receiver/Trasmitter&#xff09;通用异步收发器&#xff0c;UART作为异步串口通信协议的一种&#xff0c;工作原理是将传输数据的每个字符一位接一位地传输。是在应用程序开发过程中使用频率最高的数据总线。 UART串口的特点是…

使用格式工厂转换影片的默认音轨

不少电影尤其是mkv格式的都是英国双语的音轨&#xff0c;如图&#xff1a; 一般默认的是第一个English。有需求让它默认是国语的。 一、打开格式工厂 &#xff0c;选择视频格式&#xff0c;选择添加文件&#xff0c;选择输出配置 二、找到音频流索引 对应本文实例电影的音频顺…

成集云 | 金蝶云星辰集成聚水潭ERP(金蝶云星辰主管供应链)| 解决方案

源系统成集云目标系统 方案介绍 金蝶云星辰是金蝶旗下的一款企业级SaaS管理云&#xff0c;其目标是帮助企业拓客开源、智能管理和实时决策。为了实现这一目标&#xff0c;它为企业提供了多种SaaS服务&#xff0c;包括财务云、税务云、进销存云、生产云、零售云、电商…

C++项目:仿mudou库实现高性能高并发服务器

文章目录 一、实现目标二、前置知识&#xff08;一&#xff09;HTTP服务器1.概念2.Reactor模型&#xff1a;3.分类 一、实现目标 仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器&#xff1a; 通过咱们实现的高并发服务器组件&#xff0c;可以简洁快速的完成⼀…

Hive部署,hive客户端

1、Hive部署 Hive是分布式运行的框架还是单机运行的&#xff1f; Hive是单机工具&#xff0c;只需要部署在一台服务器即可。Hive虽然是单机的&#xff0c;但是它可以提交分布式运行的MapReduce程序运行。 1.1、规划 我们知道Hive是单机工具后&#xff0c;就需要准备一台服务…

AI聊天ChatGPT系统源码卡密验证开源版

ChatGPT卡密验证版源码是一个基于PHP7.4和MySQL5.6的聊天AI源码&#xff0c;它不仅支持暗黑模式、反应速度极快&#xff0c;而且充值方面采用后台生成卡密方式&#xff0c;方便快捷&#xff0c;如果您有能力将其接入在线支付&#xff0c;即可进一步拓展充值方式&#xff0c;为更…

QT-day5

1、添加注册功能到数据库 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMessageBox> //消息对话框类头文件 #include <QDebug> #include <QPushButton> #include <QSqlDatabase> //数据库管理类 #include…

C++之template可变模板参数应用总结(二百二十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【工作记录】springboot集成aop实现日志@20230918

springboot集成aop实现日志 1. 添加依赖 <!-- aop 依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>2. 定义注解 Target(ElementType.METHOD)…

HarmonyOS之 应用程序页面UIAbility

一 UIAbility介绍&#xff1a; 1.1 UIAbility是一种包含用户界面的应用组件&#xff0c;用于和用户进行交互UIAbility是系统调度的单元、提1.2 供窗口用于界面绘制2. UIAbility的创建和对应页面的创建 1.3 UIAbility内页面间的跳转 1.4 UIAbility的创建、前后台切换、销毁的生…

要如何选择报修工单管理系统?需要注意哪些核心功能?

现如今&#xff0c;越来越多的企业已经离不开报修工单管理系统&#xff0c;但市面上的产品繁多&#xff0c;很难寻找到一款特别符合企业需求的系统。企业采购报修工单管理系统的主要目的在于利用其核心功能&#xff0c;如工单流转等&#xff0c;来解决工作事件的流程问题&#…