基于LVQ神经网络的人脸朝向识别

news2025/1/15 16:54:54

1案例背景

1.1人脸识别概述

        人脸识别作为一个复杂的模式识别问题,近年来受到了广泛的关注,识别领域的各种方法在这个问题上各显所长,而且发展出了许多新方法,大大丰富和拓宽了模式识别的方向。人脸识别、检测,跟踪、特征定位等技术近年来一直是研究的热点。人脸识别是人脸应用研究中重要的第一步,目的是从图像中分割出不包括背景的人脸区域。由于人脸形状的不规则性以及光线和背景条件多样性,现有的人脸研究算法都是在试图解决某些特定实验环境下的一些具体问题,对人脸位置和状态都有一定的要求。而在实际应用中,大量图像和视频源中人脸的位置、朝向和旋转角度都不是固定的,这就大大增加了人脸识别的难度。
        在人脸识别领域的众多研究方向中,人脸朝向分析一直是一个少有人涉及的领域。在以往的研究成果中,一些研究者谈及了人脸朝向问题,但其中绝大多数都是希望在人脸识别过程中去除人脸水平旋转对识别过程的不良影响。但是,实际问题要复杂得多,人脸朝向是一个无法回避的问题。因此,对于人脸朝向的判断和识别,将会是一件非常有意义的工作。

1.2问题描述

        现采集到一组人脸朝向不同角度时的图像,图像来自不同的10个人,每人5幅图像,人脸的朝向分别为:左方、左前方、前方、右前方和右方,如图27-1所示。试创建一个LVQ神经网络,对任意给出的人脸图像进行朝向预测和识别。

2模型建立

2.1 设计思路

        通过观察不难发现,当人脸面朝不同方向时 ,眼睛在图像中的位置差别较大 。因 此,可以考虑将图片中描述眼睛位置的特征信息提取出来作为LVQ神经网络的输人,5个朝向分别用1,2,3,4,5表示,作为LVQ神经网络的输出。通过对训练集的图像进行训练,得到具有预测功能的网络,便可以对任意给出的人脸图像进行朝向判断和识别。

2.2设计步骤

        根据上述设计思路,设计步骤主要包括以下几个部分,如图27-2所示。

 

        1)人脸特征向量提取
        如设计思路中所述,当人脸朝向不同时,眼睛在图像中的位置会有明显的差别。因此,只需要将描述人眼位置信息的特征向量提取出来即可。方法是将整幅图像划分成6行8列,人眼的位置信息可以用第2行的8个子矩阵来描述(注意:针对不同大小的图像,划分的网格需稍作修改),边缘检测后8个子矩阵中的值为“1”的像素点个数与人脸朝向有直接关系,只要分别统计出第2行的8个子矩阵中的值为“1”的像素点个数即可。
        2)训练集/测试集产生
        为了保证训练集数据的随机性,随机选取图像库中的30幅人脸图像提取出的特征向量作为训练集数据,剩余的20幅人脸图像提取出来的特征向量作为测试集数据。
        3)LVQ 网络创建
        LVQ神经网络的优点是不需要将输人向量进行归一化、正交化,利用MATLAB自带的神经网络工具箱函数newlvq()可以构建一个LVQ神经网络,关于该函数的用法及说明在第26章中已作详细说明,此处不再赘述。
        4)LVO网络训练
        网络创建完毕后,便可以将训练集输入向量送入到网络中,利用LVQ1或LVQ2算法对网络的权值进行调整,直到满足训练要求迭代终止。

        5.人脸识别测试
        网络训练收敛后,便可以对测试集数据进行预测,即对测试集的图像进行人脸朝向识别。对于任意给出的图像,只需要将其特征向量提取出来,便可对其进行识别。

3 MATLAB实现

        利用MATLAB神经网络工具箱提供的函数可以方便地在 MATLAB环境下实现上述设计步骤,代码如下:

%% LVQ神经网络的预测——人脸识别

%% 清除环境变量
clear all
clc

%% 人脸特征向量提取 
% 人数
M = 10;
% 人脸朝向类别数
N = 5; 
% 特征向量提取
pixel_value = feature_extraction(M,N);

%% 训练集/测试集产生
% 产生图像序号的随机序列
rand_label = randperm(M*N);  
% 人脸朝向标号
direction_label = repmat(1:N,1,M);
% 训练集
train_label = rand_label(1:30);
P_train = pixel_value(train_label,:)';
Tc_train = direction_label(train_label);
T_train = ind2vec(Tc_train);
% 测试集
test_label = rand_label(31:end);
P_test = pixel_value(test_label,:)';
Tc_test = direction_label(test_label);

%% 创建LVQ网络
for i = 1:5
    rate{i} = length(find(Tc_train == i))/30;
end
net = newlvq(minmax(P_train),20,cell2mat(rate),0.01,'learnlv1');
% 设置训练参数
net.trainParam.epochs = 100;
net.trainParam.goal = 0.001;
net.trainParam.lr = 0.1;

%% 训练网络
net = train(net,P_train,T_train);

%% 人脸识别测试
T_sim = sim(net,P_test);
Tc_sim = vec2ind(T_sim);
result = [Tc_test;Tc_sim]

%% 结果显示
% 训练集人脸标号
strain_label = sort(train_label);
htrain_label = ceil(strain_label/N);
% 训练集人脸朝向标号
dtrain_label = strain_label - floor(strain_label/N)*N;
dtrain_label(dtrain_label == 0) = N;
% 显示训练集图像序号
disp('训练集图像为:' );
for i = 1:30 
    str_train = [num2str(htrain_label(i)) '_'...
               num2str(dtrain_label(i)) '  '];
    fprintf('%s',str_train)
    if mod(i,5) == 0
        fprintf('\n');
    end
end
% 测试集人脸标号
stest_label = sort(test_label);
htest_label = ceil(stest_label/N);
% 测试集人脸朝向标号
dtest_label = stest_label - floor(stest_label/N)*N;
dtest_label(dtest_label == 0) = N;
% 显示测试集图像序号
disp('测试集图像为:');
for i = 1:20 
    str_test = [num2str(htest_label(i)) '_'...
              num2str(dtest_label(i)) '  '];
    fprintf('%s',str_test)
    if mod(i,5) == 0
        fprintf('\n');
    end
end
% 显示识别出错图像
error = Tc_sim - Tc_test;
location = {'左方' '左前方' '前方' '右前方' '右方'};
for i = 1:length(error)
    if error(i) ~= 0
        % 识别出错图像人脸标号
        herror_label = ceil(test_label(i)/N);
        % 识别出错图像人脸朝向标号
        derror_label = test_label(i) - floor(test_label(i)/N)*N;
        derror_label(derror_label == 0) = N;
        % 图像原始朝向
        standard = location{Tc_test(i)};
        % 图像识别结果朝向
        identify = location{Tc_sim(i)};
        str_err = strcat(['图像' num2str(herror_label) '_'...
                        num2str(derror_label) '识别出错.']);
        disp([str_err '(正确结果:朝向' standard...
                      ';识别结果:朝向' identify ')']);
    end
end
% 显示识别率
disp(['识别率为:' num2str(length(find(error == 0))/20*100) '%']);

        上述为主函数代码,完整代码和数据集下载方式:

【免费】基于LVQ神经网络的人脸朝向识别matlab代码

运行结果:
result =

     2     5     1     3     4     4     5     1     1     3     2     4     3     4     4     3     4     5     5     2
     2     5     1     3     4     4     5     1     1     3     2     4     3     4     4     3     4     5     5     2

训练集图像为:
1_3  1_5  2_1  2_2  2_3  
3_1  3_4  4_1  4_2  5_1  
5_2  5_5  6_3  6_4  6_5  
7_1  7_2  7_3  7_4  7_5  
8_2  8_3  8_5  9_1  9_2  
9_5  10_1  10_2  10_3  10_4  
测试集图像为:
1_1  1_2  1_4  2_4  2_5  
3_2  3_3  3_5  4_3  4_4  
4_5  5_3  5_4  6_1  6_2  
8_1  8_4  9_3  9_4  10_5  
识别率为:100%

        从以上结果可以看出,当训练目标 net, trainPararm. goal 设置为0.0001时,识别准确率可以达到100%。因此,利用LVQ神经网络对人脸作识别是可行且有效的。要注意的一点是,当训练集较少时,比如说只取1~2个人脸的图像特征向量参与训练,识别率会相对较低些。因此,在防止出现过拟合的同时,应尽量增加训练集的样本数目。

4案例扩展

        由于无需对数据进行预处理、可以处理复杂模型且对噪声干扰有一定的抑制,LVQ神经网络的应用也越来越广泛。近年来,许多专家学者将LVQ神经网络与其他方法相结合,成功地解决了很多现实问题。例如,由于传统LVQ神经网络存在神经元未被充分利用以及算法对初值敏感的问题,利用遗传算法优化网络的初始值可以迅速得到最佳的神经网络初始权值向量,从而使得分析速度和精度都有较大的提高。

 

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

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

相关文章

springboot结合shiro实战-身份认证

目录 环境搭建 配置shiro环境 总结 hello,大家好,我们写任何企业级项目基本都会需要做权限,权限包含身份认证和授权。 所谓身份认证,就是证明你是你。 所谓授权就是明白你登录之后能干什么。 现在,让我们用sprin…

根据一棵树的两种遍历构造二叉树

题目 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,null,…

【Java从0到1学习】09 正则表达式

1. 正则表达式概述 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。 正则表达式,又称正规表示法、常规表示法&#xff…

js watermark实现水印效果

2023.8.15今天学习了如何给页面添加水印,效果如下: 1.创建watermark.js文件: import id from "element-ui/src/locale/lang/id";let watermark {} let setWatermark (str) > {let id 1.23452384164.123412415if (document.g…

智安网络|深入比较:Sass系统与源码系统的差异及选择指南

随着前端开发的快速发展,开发人员需要使用更高效和灵活的工具来处理样式表。在这个领域,Sass系统和源码系统是两个备受关注的选项。 Sass系统 Sass(Syntactically Awesome Style Sheets)是一种CSS预处理器,它扩展了CS…

管理类联考——逻辑——真题篇——按知识分类——汇总篇——一、形式逻辑——三段论——第一节——推结论

文章目录 第一节 三段论-推结论题-三段论-结构-推结论:所有A是B;所有B是C;得:所有A是C。(最简单的模型)真题(2011-27)-三段论-推结论真题(2011-28)-三段论-推…

react-router v6版本使用记录

1:首先安装依赖 最基本的使用,引入相关依赖,开箱即用 import { BrowserRouter, Link, Routes, Route } from "react-router-dom" import Home from "./home" import About from "./about"function App () {// …

MapBox历史轨迹

成果实例 思路 思路就是取从起点开始一路setdata吧 分三个图层,一个路径图层,一个飞机图层,一个显示名字的图层,遍历路径图层的点,经过显示名字图层的时候就显示图层,飞机图层的点和角度动态计算&#xff…

COMSOL电磁仿真-网格剖分-边界层

COMSOL电磁仿真-网格剖分-边界层 在低频磁场中,随着磁场的频率增加,金属的集肤效应会逐渐显著,为了解析趋肤层,需要对金属的表面进行网格加密,这一过程主要通过剖分边界层实现,本文分为两部分,第…

【LeetCode】337.打家劫舍Ⅲ

题目 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。 除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直…

2023年软件测试岗面试题+答案汇总,也许你例offer就差这一个...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、B/S架构和C/S架…

16.5.4 【Linux】SELinux 政策内的规则管理

SELinux 各个规则的布林值查询 getsebool 如果想要查询系统上面全部规则的启动与否 (on/off,亦即布林值),很简单的通过 sestatus-b 或 getsebool -a 均可! SELinux 各个规则规范的主体程序能够读取的文件 SELinux typ…

flex布局 vs grid布局

问题&#xff1a;一行最多显示3个item&#xff0c;实现最后一行居左 <div class"chart-wrap"><div class"chart-item">图</div><div class"chart-item">图</div><div class"chart-item">图</…

医生如何使用ChatGPT提高工作效率

文章目录 引言案例一&#xff1a;快速获取医学知识案例二&#xff1a;协助患者自我诊断案例三&#xff1a;辅助临床决策案例四&#xff1a;提供在线咨询服务案例五&#xff1a;用病人易于理解的语言总结关键的临床信息案例六&#xff1a;高效整理医疗文件案例七&#xff1a;根据…

报修管理系统的功能有多强大?的修报修管理系统有什么优势?

报修管理系统是一种功能强大的系统&#xff0c;可帮助企业快速响应设备故障和异常情况&#xff0c;并将实时信息反馈给有关人员&#xff0c;以及进行准确的统计分析。通过使用报修管理系统&#xff0c;企业能够极大地提升工作效率&#xff0c;优化运营流程&#xff0c;减少人员…

记一次文件因content-type问题无法打开的经历

记一次文件因content-type问题无法打开的经历 引场景方案Jsoup的Content-Typesimplemagicfile cant open流不可重复消费问题Tika 总结 引 在Http请求头和响应头都有这个attribute&#xff0c;来声明请求和响应报文的资源类型。 Content-Type&#xff08;MediaType&#xff09;…

你真的了解数据结构与算法吗?

数据结构与算法&#xff0c;是理论和实践必须紧密结合的一门学科&#xff0c;有关数据结构和算法同类的课程或书籍&#xff0c;有些只是名为“数据结构”&#xff0c;而非“数据结构与算法”&#xff0c;它们在内容上并无很大区别。 实际上&#xff0c;数据结构和算法&#xf…

有哪些前端开发工具推荐? - 易智编译EaseEditing

在前端开发中&#xff0c;有许多工具可以帮助你更高效地进行开发、调试和优化。以下是一些常用的前端开发工具推荐&#xff1a; 代码编辑器/集成开发环境&#xff08;IDE&#xff09;&#xff1a; Visual Studio Code&#xff1a;功能强大、轻量级的代码编辑器&#xff0c;支…

富士胶片 : 柯达倒下了,我们凭什么屹立不倒

当整个行业被新技术颠覆后&#xff0c;其中的领军企业如何才能活下去? 富士胶片在面临行业被颠覆的情况下&#xff0c;迅速调整策略&#xff0c;果断裁减传统业务、大规模投资新兴领域&#xff0c;体现出敏捷的链节竞争优势。这使得富士胶片在数码时代来临之际&#xff0c;能…

MATLAB高分辨率图片

把背景调黑&#xff0c;把曲线调黄&#xff0c;把grid调白&#xff0c;调调字体字号的操作 close all a0:0.1:10; noise2*rand(1,length(a)); bsin(a)sin(3*a)noise;plot(a,b,y,linewidth,2); ylim([-3 4]) %y轴范围 set(gca,xgrid,on,ygrid,on,gridlinestyle,-,Grid…