软件杯 深度学习 机器视觉 人脸识别系统 - opencv python

文章目录

  • 0 前言
  • 1 机器学习-人脸识别过程
    • 人脸检测
    • 人脸对其
    • 人脸特征向量化
    • 人脸识别
  • 2 深度学习-人脸识别过程
    • 人脸检测
    • 人脸识别
        • Metric Larning
  • 3 最后

0 前言

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

🚩 深度学习 机器视觉 人脸识别系统

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

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:3分

🧿 更多资料, 项目分享:

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

1 机器学习-人脸识别过程

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

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

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

人脸检测

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

在这里插入图片描述

人脸对其

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

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

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

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

人脸特征向量化

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

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

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

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

#coding:utf-8
from numpy import *
from numpy import linalg as la
import cv2
import osdef loadImageSet(add):FaceMat = mat(zeros((15,98*116)))j =0for i in os.listdir(add):if i.split('.')[1] == 'normal':try:img = cv2.imread(add+i,0)except:print 'load %s failed'%iFaceMat[j,:] = mat(img).flatten()j += 1return FaceMatdef ReconginitionVector(selecthr = 0.8):# step1: load the face image data ,get the matrix consists of all imageFaceMat = loadImageSet('D:\python/face recongnition\YALE\YALE\unpadded/').T# step2: average the FaceMatavgImg = 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]breakcovVects = diffTrain * eigVects[:,eigSortIndex] # covVects is the eigenvector of covariance matrix# avgImg 是均值图像,covVects是协方差矩阵的特征向量,diffTrain是偏差矩阵return avgImg,covVects,diffTraindef judgeFace(judgeImg,FaceVector,avgImg,diffTrain):diff = judgeImg.T - avgImgweiVec = FaceVector.T* diffres = 0resVal = inffor i in range(15):TrainVec = FaceVector.T*diffTrain[:,i]if  (array(weiVec-TrainVec)**2).sum() < resVal:res =  iresVal = (array(weiVec-TrainVec)**2).sum()return res+1if __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 = 0for 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 += 1print 'accuracy of %s is %f'%(c, float(count)/len(nameList))  # 求出正确率

人脸识别

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

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

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

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

from __future__ import print_functionfrom time import timeimport loggingimport matplotlib.pyplot as pltfrom sklearn.cross_validation import train_test_splitfrom sklearn.datasets import fetch_lfw_peoplefrom sklearn.grid_search import GridSearchCVfrom sklearn.metrics import classification_reportfrom sklearn.metrics import confusion_matrixfrom sklearn.decomposition import RandomizedPCAfrom sklearn.svm import SVCprint(__doc__)# Display progress logs on stdoutlogging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s')################################################################################ Download the data, if not already on disk and load it as numpy arrayslfw_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.datan_features = X.shape[1]# the label to predict is the id of the persony = lfw_people.targettarget_names = lfw_people.target_namesn_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 setX_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 reductionn_components = 80print("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 modelprint("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 setprint("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 matplotlibdef 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 faceplt.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 setdef 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 eigenfaceseigenface_titles = ["eigenface %d" % i for i in range(eigenfaces.shape[0])]plot_gallery(eigenfaces, eigenface_titles, h, w)plt.show()

在这里插入图片描述

2 深度学习-人脸识别过程

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

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

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

人脸检测

深度学习在图像分类中的巨大成功后很快被用于人脸检测的问题,起初解决该问题的思路大多是基于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有点像)。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3 最后

🧿 更多资料, 项目分享:

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

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

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

相关文章

蓝桥杯 - 小明的背包3(多重背包)

解题思路&#xff1a; 动态规划 多重背包问题需要在01背包问题&#xff08;不重复&#xff09;的基础上多加一层循环进行遍历&#xff0c;并且dp[ j ]的式子也需要修改 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan …

Nginx超详细讲解+实操

前言 nginx作为当今火爆的、高性能的http及反向代理服务&#xff0c;不管前端还是后端&#xff0c;都需要全面去了解&#xff0c;学习&#xff0c;实操。 nginx 介绍 为了有一个全面的认知&#xff0c;接下来我们先来看看nginx的架构以及一些特点。 nginx 特点 处理响应请…

6.1 图的基本概念试题

一、单项选择题 01&#xff0e;图中有关路径的定义是()。 A.由顶点和相邻顶点序偶构成的边所形成的序列 B.由不同顶点所形成的序列 C.由不同边所形成的序列 D.上述定义都不是 02&#xff0e;一个有n个顶点和n条边的无向图一…

Python入门练习 - 学生管理系统

Python 实现读书管理系统 """ 实现一个命令行版的读书管理系统 """ import os.path import sys# 使用这个全局变量&#xff0c;来管理所有的学生信息 # 这个列表的每个元素都是一个‘字典’&#xff0c;每 个 字典就分别表示了一个同学students …

南京观海微电子---Vitis HLS设计流程介绍——Vitis HLS教程

1. 传统的FPGA设计流程 传统的RTL设计流程如下图所示&#xff1a; 传统的FPGA RTL设计流程主要是采用VHDL、VerilogHDL或System Verilog进行工程的开发&#xff0c;同时也是通过硬件描述语言来编写测试案例&#xff08;Test Bench&#xff09;对开发的工程进行仿真验证。 随后…

八大排序算法之希尔排序

希尔排序是插入排序的进阶版本&#xff0c;他多次调用插入排序&#xff0c;在插入排序上进行了改造&#xff0c;使其处理无序的数据时候更快 核心思想&#xff1a;1.分组 2.直接插入排序&#xff1a;越有序越快 算法思想&#xff1a; 间隔式分组&#xff0c;利用直接插入排序…

Windows安装Odoo结合内网穿透实现公网访问本地企业管理系统

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

工业以太网无线网桥

一、功能概述 1.1设备简介 本产品是工业以太网&#xff08;Profinet、EtherNet/IP、ModbusTCP等&#xff09;转无线设备&#xff0c;成对使用&#xff08;一对一&#xff09;&#xff0c;本产品出厂前已经配对好&#xff0c;用户不需要再配对&#xff0c;即插即用。 本产品适…

【C++】从C到C++、从面向过程到面向对象(类与对象)

文章目录 C入门知识C与C的关系1. 类的引入&#xff1a;从结构体到类2. 类的声明和定义3. 类的作用域4. 类的访问限定符5. 面向对象特性之一&#xff1a;封装6. 类的实例化&#xff1a;对象7. 计算类对象的内存大小8. 成员函数中暗藏的this指针9. 类的六个默认生成的成员函数9.1…

哪个洗地机性价比比较高?这几款品牌值得入手

洗地机是现在越来越受欢迎的清洁工具&#xff0c;功能非常齐全。它就像是吸尘器和电动拖把的结合体&#xff0c;对于每天要做家务的人来说&#xff0c;可以一次性解决多种类型的垃圾&#xff0c;省时省心省力。可是面对种类繁杂的洗地机市场&#xff0c;我们该如何选择呢&#…

如何在群晖NAS搭建bitwarden密码管理软件并实现无公网IP远程访问

前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊如何在群晖NAS搭建bitwarden密码管理软件并实现无公网IP远程访问&#xff0c;希望大家能觉得实用&#xff01; 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&am…

python_1

要求&#xff1a; 代码&#xff1a; # 先将分钟数转化成年数&#xff0c;再将余数做为天数 minute float(input("请输入分钟数&#xff1a;")) year_1 (minute / 60 / 24) // 365 day_1 (minute / 60 / 24) % 365 now f"{minute}分钟{year_1}年{day_1}天&q…

值得收藏!2024年智能交通领域顶级会议投稿信息汇总

智能交通系统&#xff08;Intelligent Transportation Systems, ITS&#xff09;是应用现代信息技术、通信技术、数据处理技术、控制技术和传感技术于交通管理系统中&#xff0c;旨在提高道路安全性、提升交通效率、改善交通环境、增加驾驶舒适度和效率的综合智能化系统。它通过…

【C++初阶】之类和对象(中)

【C初阶】之类和对象&#xff08;中&#xff09; ✍ 类的六个默认成员函数✍ 构造函数&#x1f3c4; 为什么需要构造函数&#x1f3c4; 默认构造函数&#x1f3c4; 为什么编译器能自动调用默认构造函数&#x1f3c4; 自己写的构造函数&#x1f3c4; 构造函数的特性 ✍ 拷贝构造…

淘宝商品评论抓取技术大揭秘:轻松获取用户评价,助力电商决策!

获取淘宝商品评论接口的技术实现涉及多个步骤&#xff0c;包括获取商品ID、构建请求URL、发送HTTP请求以及解析响应数据。以下是一个基本的指南和示例代码&#xff0c;帮助你了解如何实现这一功能。 步骤一&#xff1a;获取商品ID 首先&#xff0c;你需要知道你想要获取评论的…

fuzzywuzzy,一个好用的 Python 库!

目录 前言 安装 基本功能 1. 字符串相似度比较 2. 模糊匹配与排序 实际应用场景 1. 数据清洗 2. 文本匹配与搜索 3. 搜索引擎优化 总结 前言 大家好&#xff0c;今天为大家分享一个好用的 Python 库 - fuzzywuzzy Github地址&#xff1a;https://github.com/seatgeek/fu…

Stable Diffusion WebUI 图生图(img2img):图生图/涂鸦绘制/局部重绘/有色蒙版/上传蒙版/批量处理/反推提示词

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本篇文章我们介绍 Stable Diffusion WebUI 的图生图功能&#xff0c;主要包括&#xff1a;图生图、图生图&#xff08…

Spring-IoC-属性注入的注解实现

1、创建对象的注解 Component 用于声明Bean对象的注解&#xff0c;在类上添加该注解后&#xff0c;表示将该类创建对象的权限交给Spring容器。可以直接将这些类直接创建&#xff0c;使用的时候可以直接用。 注解的value属性用于指定bean的id值&#xff0c;value可以省略&…

BioXcell InVivoPlus anti-mouse Ly6G及部分参考文献

BioXcell InVivoPlus anti-mouse Ly6G 1A8单克隆抗体与小鼠Ly6G反应。Ly6G分子量为21-25kDa&#xff0c;是GPI锚定的细胞表面蛋白Ly-6超家族的成员&#xff0c;在细胞信号传导和细胞粘附中发挥作用。Ly6G在发育过程中由骨髓谱系中的细胞&#xff08;包括单核细胞、巨噬细胞、粒…

在点集的新知识面前百年集论不堪一击

黄小宁 与x∈R相异&#xff08;等&#xff09;的实数均可表为yxδ&#xff08;增量δ可0也可≠0&#xff09;&#xff0c;因各实数的绝对值都可是表示长度的数故各实数都可是数轴上点的坐标&#xff0c;于是x∈R变换为实数yxδ的几何意义可是&#xff1a;一维空间“管道”g内R…