2017年认证杯SPSSPRO杯数学建模B题(第一阶段)岁月的印记全过程文档及程序

news2025/1/15 19:38:36

2017年认证杯SPSSPRO杯数学建模

跨年龄人脸识别模型的建立与分析

B题 岁月的印记

原题再现:

  对同一个人来说,如果没有过改变面容的疾病、面部外伤或外科手术等经历,年轻和年老时的面容总有很大的相似性。人们在生活中也往往能够分辨出来两张不同年龄段的照片是不是同一个人。当然,年龄段相差越大,识别起来也就越困难。
  第一阶段问题: 请你建立合理的数学模型,当我们给出两张不同年龄段的面部照片时,可以通过算法来自动识别是不是同一个人。为简单起见,我们可以假设两张照片都是标准位置和标准光线下拍摄的,例如都是一寸证件照。

整体求解过程概述(摘要)

  对于同一个人不同年龄的两张照片,如何通过算法来自动识别这两张照片是否来自同一人,这个问题可以看做是人脸识别技术的一个子问题,侧重点在于所设计的算法要能够针对不同年龄段的照片给出准确的判断。为了提高算法的识别率,需要尽可能多地提取能够刻画人脸在不同年龄段状态下的特征。为了准确分析、全面考虑问题,我们从不同的角度出发,分别建立模型、通过实验进行模型有效性及敏感性分析等。本文主要从主成分分析法、人脸特征距离和特征角相似性度量以及使用BP神经网络提取特征向量、训练相似性判断模型等角度对问题进行解决。
  本文首先在传统的基于主成分分析的人脸识别算法的基础上提出一种改进算法(ModPCA_FR),在特征提取之前不需要将人脸图像矩阵展开为一维的向量,减小了后续算法的计算复杂度,同时对每一类训练样本求类内平均脸,计算图像协方差矩阵,并根据图像协方差矩阵求解一组最优特征向量来用于人脸的特征提取。通过在 ORL 人脸数据库中进行 matlab 编程实验验证了该方法在年龄跨度 2 年内准确识别的有效性。其次,由于 ModPCA_FR 模型在人脸识别中对于年龄跨度有一定的敏感性,本文建立了基于提取特征距离及特征角的不同年龄段人脸匹配模型。该模型可以对任意两张跨年龄段的图片进行匹配,不会受到年龄差太大等因素的影响,可以以较高的准确率匹配照片。另外,该模型对人类年龄进行了分类,并最终通过大量实验证明算法不仅可以对同一年龄段人的照片准确识别,而且对于跨年龄段的同一个人的照片依然有较好的匹配效果。同时对非同一人的跨年龄照片也能够准确识别。
  最后,本文提出一种基于 BP 神经网络的人脸判别模型。该模型是基于 PCA 降维模型的推广模型,即在对数据进行降维,提取人脸面部主要特征(奇异特征值)构成照片的特征向量。接着,将不同照片(包含同人不同年龄和不同人不同年龄)的特征向量进行随机组合,形成神经网络输入集,并且控制同人和不同人的比率为 50%。之后,将输入集分为训练集和测试集,用于训练和测试神经网络。最后,给出输入集的识别率,其中总体识别率为 80.81%。

问题分析:

  对于同一个人不同年龄的两张照片,在本人的面部没有遭受过非自然成长损伤的情况下,人们在生活中可以通过观察判断两张照片是否来自同一个人。如果这两张照所拍摄的时间相差越长,则辨别起来就越难。题目要求设计算法来自动识别不同年龄段的两张照片是不是来自同一个人。这个问题可以看做是人脸识别技术的一个子问题,这个问题的侧重点在于所设计的算法要能够准确判断不同年龄段的照片是否来自同一个人。当然,为了突出跨年龄段识别这个重点,我们可以简化问题,如:暂不考虑两张图片的拍摄角度、曝光量等可以影响照片分析的因素。为了提高算法识别率,我们需要尽可能多地提取能够刻画人脸在不同年龄段状态下的特征。为了准确分析、全面考虑问题,我们将从不同的角度出发,分别建立模型、进行实验以及模型有效性分析等。主要将从主成分分析法、人脸特征距离和特征角方面以及使用BP神经网络提取特征向量、训练相似性判断模型等角度进行问题的解决。

模型假设:

  1. 假设两张照片都是标准位置和标准光线下拍摄的;
  2. 假设人脸没有经过任何外在装饰,且在自然表情状态下拍摄;
  3. 假设待识别的人脸是面部对称的;
  4. 假设年龄对所有人的影响是一致的。

论文缩略图:

在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

部分程序代码:(代码和文档not free)

%读入人脸图片,并将其转换成为灰度矩阵,然后将灰度矩阵进行切割,再用SVD分解,
并提取图片特征
%返回参数
%feature为指向装载后的数据文件的变量
%num的值为特征值向量的第几维
%函数声明
function [feature] = allFeature(num)
%用户输入特征维数数目
panDuan = 1;
while panDuan
featureNumber = input('请输入特征维数(仅限于8, 16,24, 32,48,64,80):');
%如果输入的是8.16.24.32.48.64.80,则继续执行代码
if(featureNumber == 8||featureNumber == 16 || featureNumber == 24|| featureNumber == 32 || featureNumber == 48 || featureNumber == 64 || featureNumber == 80 )
panDuan = 0;
disp('开始装载图像文件,请等待.......')
%如果输入的是其它数字,提示输入有误,请用户重新输入
else
fprintf('你输入的不是这5个数中的任何一个,请重新输入!\n\n')
end
end
%得出图片的路径,并自动读入每张图片
dir = ['\1.jpg '
'\2.jpg '
'\3.jpg '
'\4.jpg '
'\5.jpg '
'\6.jpg '
'\7.jpg '
'\8.jpg '
'\9.jpg '
'\10.jpg'];
for x=1:10,
%将数字转换成字符,便于把两个字符连接,组成图片的完整路径
a = int2str(x);
b = ['s'];
d = [b a];
for i=1:10,
%得到每张图片的文件名
e = [d dir(i,1:7)];
% 将图片转化成为灰度矩阵
M = double(imread(e));
%如果用户输入的是8,则执行下段代码,把数据处理得到8维的特征向量
if (featureNumber == 8)
for j=1:4,
for k=1:2,
%将图片的灰度矩阵划分成8块小矩阵
temp=M((j-1)*28+1:j*28,(k-1)*46+1:k*46);
%对每个小矩阵进行SVD变换
[u,temp1,v]=svd(temp);
%提取一个的SVD系数作为特征值
temp2=temp1(num,num);
%得到所有图片的特征矩阵
feature((x-1)*10+i,(j-1)*2+k)=temp2;
end
end
end
%如果用户输入的是16,则执行下段代码,把数据处理得到16维的特征向量
end
end
%输出提示信息,说明图片处理完毕
fprintf('图片装载完毕,请继续下面的操作\n\n');
function [c] = Distance( D1,D2 )
%DRULE D1,D2位两个D数表示,该函数求D1与D2之间的距离
[m1,n1]=size(D1);
[m2,n2]=size(D2);
% D1(:,2)=D1(:,2)*10000;
% D2(:,2)=D2(:,2)*10000;
C=0;
if (sum(D1(:,2))+1)-1==1 && (sum(D1(:,2))+1)-1==1
for i=1:m1
for j=1:m2
C=C+(D1(i,2)+D2(j,2))/2;
end
end
end
ccc=0;
if (sum(D1(:,2))+1)-1<1 && (sum(D1(:,2))+1)-1==1
for i=1:m1
for j=1:m2
C=C+(D1(i,2)+D2(j,2))/2;
end
end
vc1=1-sum(D1(:,2));
for j=1:m2
ccc=ccc+(vc1+D2(j,2))/2;
end
C=C+ccc;
ccc=0;
end
if (sum(D1(:,2))+1)-1==1 && (sum(D1(:,2))+1)-1<1
disp('ccc');
for i=1:m1
for j=1:m2
C=C+(D1(i,2)+D2(j,2))/2;
end
end
vc2=1-sum(D2(:,2));
for j=1:m1
ccc=ccc+(D1(j,2)+vc2)/2;
end
C=C+ccc;
end
ccc1=0;
ccc2=0;
if (sum(D1(:,2))+1)-1<1 && (sum(D1(:,2))+1)-1<1
for i=1:m1
for j=1:m2
C=C+(D1(i,2)+D2(j,2))/2;
end
end
vc1=1-sum(D1(:,2));
vc2=1-sum(D2(:,2));
for j=1:m2
ccc1=ccc1+(vc1+D2(j,2))/2;
end
for j=1:m1
ccc2=ccc2+(D1(j,2)+vc2)/2;
end
C=C+ccc1+ccc2+(vc1+vc2)/2;
end
hang=1;
for i=1:m1
for j=1:m2
D(hang,1)=(D1(i,1)+D2(j,1))/2;
D(hang,2)=((D1(i,2)+D2(j,2))/2)/C;
hang=hang+1;
end
end
[Cf,IA,IC] = unique(D(:,1),'sorted');
c(:,1) = Cf;
for k=1:length(Cf)
d = find(D(:,1)==Cf(k));
c(k,2) = sum(D(d,2));
end
End
全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可

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

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

相关文章

HTML JavaScript 数字变化特效

效果 案例一&#xff1a;上下滚动 案例二&#xff1a;本身变化 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><met…

debian12.4配置

文章目录 debian12.4配置概述笔记将非root用户添加到sudo组更换国内源配置ssh的客户端访问END debian12.4配置 概述 在虚拟机中装了一个debian12.4, 想配置ssh客户端连接, 出了问题. 配置乱了, 还好长了个心眼, 做了快照. 发现2个问题: debian12.4默认安装完, 有ssh, 先检查…

【Linux对磁盘进行清理、重建、配置文件系统和挂载,进行系统存储管理调整存储结构】

Linux 调整存储结构 前言一、查看磁盘和分区列表二、创建 ext4 文件系统&#xff0c;即&#xff1a;格式化分区为ext4文件系统。1.使用命令 mkfs.ext4 (make file system)报错如下&#xff1a;解决办法1&#xff1a;&#xff08;经测试&#xff0c;不采用&#xff09;X解决办法…

【PICO】【Unity】【VR】如何对打包后的PICO项目有效Debug

【背景】 PICO项目打包后再运行就看不到Console了。当然,会有各类专业的Debug工具。 有一类Debug的工具是Preview形式下展示Debug信息,但是发现Preview成功不见得打包也成功。 打包后也会有一些Debug工具,不过这里我给出自己的简单解决办法。 【解决方案】 Unity Console…

SQL慢语句执行的很慢,如何分析优化呢,(如何优化的呢?)

慢查询出现的情况&#xff1a; SQL执行慢如何解决&#xff1f; 可以采用MySQL自带的分析工具Explain。 通过key和key_len检查是否命中了索引&#xff08;如果你已经添加了索引&#xff0c;还可以判断索引是否失效&#xff09;通过type字段查看SQL是否有进一步优化的空间&#…

JavaScript 之 promise

一、异步任务的处理 封装和调用不是同一个人&#xff0c;不清楚如何调用设计者不好设计&#xff0c;调用者调用很麻烦从一个实际的例子来作为切入点&#xff1a; 调用一个函数&#xff0c;这个函数中发送网络请求&#xff08;可以用定时器来模拟&#xff09;如果发送网络请求成…

flutter跨平台开发模板,继承get和dio,实现全局loading和快速更改名称和图标icon

flutter_windows 一个跨平台的flutter开发模板&#xff0c;使用流行的get来管理路由&#xff0c;使用getx来管理数据状态&#xff0c;并且配置了国际化支持。使用dio来管理网络请求&#xff0c; 使用shared_preferences实现本地临时数据存储&#xff0c;并且实现了全局loading…

【漏洞复现】Hikvision综合安防管理平台env信息泄漏漏洞

Nx01 产品简介 Hikvision&#xff08;海康威视&#xff09;是一家在中国颇具影响力的安防公司&#xff0c;其网络摄像头产品在市场上占据了相当大的份额。综合安防管理平台基于“统一软件技术架构”理念设计&#xff0c;采用业务组件化技术&#xff0c;满足平台在业务上的弹性扩…

【GitHub项目推荐-开源的任务管理工具】【转载】

推荐一个开源的任务管理工具&#xff0c;该工具会提供各类文档协作功能、在线思维导图、在线流程图、项目管理、任务分发、即时 IM&#xff0c;文件管理等等。该开源项目使用到 Vue、Element-UI、ECharts 等技术栈。 开源地址&#xff1a;www.github.com/kuaifan/dootask 预览地…

【leetcode】回溯总结

本文内容来自于代码随想录https://www.programmercarl.com/ 思想 一棵树中的纵向遍历结束回到上一层的过程&#xff0c;比如&#xff1a; 这个过程通常回伴随恢复现场的过程。 模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集…

数据结构:链式队列

队列是限制在两端操作进行插入操作与删除操作的线性表&#xff0c;允许进行插入操作的一端称为"队尾"&#xff0c;允许进行删除操作的一端称为“队头”。当线性表中没有元素时&#xff0c;称为“空队”。队列的特点是先进先出。 队列两种规定&#xff1a; 1、front…

应用层—HTTP详解(抓包工具、报文格式、构造http等……)

文章目录 HTTP1. 抓包工具的使用1.1 配置信息1.2 观察数据 2. 分析 https 抓包结果3. HTTP请求详解3.1 认识 URL3.1.1 URL 基本格式3.1.2 查询字符串 (query string)3.1.3 关于 URL Encode 3.2 认识 http 方法3.2.1 [经典问题] Get 和 Post 主要的区别是什么&#xff1f;&#…

Pytest 结合 Allure 生成测试报告

测试报告在项目中是至关重要的角色&#xff0c;一个好的测试报告&#xff1a; 可以体现测试人员的工作量&#xff1b; 开发人员可以从测试报告中了解缺陷的情况&#xff1b; 测试经理可以从测试报告中看到测试人员的执行情况及测试用例的覆盖率&#xff1b; 项目负责人可以通过…

Qt拖拽事件简单实现

1.相关说明 重写resizeEvent(这个按需重写)、dragEnterEvent(拖拽事件函数)、dropEvent(放下事件函数)&#xff0c;可以将本地图片拖拽到label标签中 2.相关界面 3.相关代码 #include "widget.h" #include "ui_widget.h" #include <QDragEnterEvent>…

5G_系统同步机制(八)

BBU和RRU的同步机制 为什么要做到系统同步 在TDD模式下工作时&#xff0c;为了避免相邻小区之间的干扰&#xff0c;近距离的所有gNB在任何时间点都必须具有相同的传输方向(DL或UL)。这样做的必要条件是在BTS之间同步SFN (System Frame number)和time Slot。此外&#xff0c;由…

c++程序的内存模型,new操作符详解

目录 内存四区 程序运行前 代码区 全局区 程序运行后 栈区 堆区 new操作符 创建一个数 创建一个数组 内存四区 不同区域存放不同的数据&#xff0c;赋予不同的生命周期&#xff0c;让我们更加灵活的编程 程序运行前 程序运行前就有代码区和全局区 代码区 程序编…

STM32标准库开发——PWM驱动代码

PWM驱动初始化代码 使能定时器二时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);设置定时器时钟源 TIM_InternalClockConfig(TIM2);配置定时器二的时基单元 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_TimeBaseInitStruct.TIM_ClockDivisionTIM_CKD_D…

java面试——juc篇

一、线程基础 1、进程与线程的区别&#xff1f;&#xff08;⭐⭐⭐&#xff09; 进程&#xff1a;进程是程序的一次执行过程&#xff0c;是操作系统资源分配的基本单位。程序由指令和数据组成&#xff0c;指令要运行就得加载至CPU&#xff0c;数据要读写就得加载至内存&#…

【嘉立创EDA-PCB设计指南】4.模块化布局

前言&#xff1a;本文对本专栏中的【嘉立创EDA-PCB设计指南】前面绘制的原理图进行模块化布局&#xff0c;首先进行预布局&#xff08;将每个模块放一起&#xff09;&#xff0c;然后进行精细化布局&#xff08;按照原理图来精细化布局&#xff09;。 目录 模块化预布局 模块…

电梯调度问题文献阅读

电梯调度问题文献阅读 文章目录 电梯调度问题文献阅读[toc]文献阅读1. 陈纪龙,孟洪兵,吴刚等.六层电梯模拟系统的研究与实现[J].伊犁师范学院学报(自然科学版),2014,8(01):57-62.2. 陈福兰,杜虹.浅析电梯并联运行的几种调度方法[J].装备制造技术,2012,(10):178-180190.3. 马春江…