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

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:5rate{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) == 0fprintf('\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) == 0fprintf('\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.rhkb.cn/news/93159.html

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

相关文章

W5500-EVB-PICO 做UDP Server进行数据回环测试(七)

前言 前面我们用W5500-EVB-PICO 开发板在TCP Client和TCP Server模式下,分别进行数据回环测试,本章我们将用开发板在UDP Server模式下进行数据回环测试。 UDP是什么?什么是UDP Server?能干什么? UDP (User Dataqram P…

Python 3 使用HBase 总结

HBase 简介和安装 请参考文章:HBase 一文读懂 Python3 HBase API HBase 前期准备 1 安装happybase库操作hbase 安装该库 pip install happybase2 确保 Hadoop 和 Zookeeper 可用并开启 确保Hadoop 正常运行 确保Zookeeper 正常运行3 开启HBase thrift服务 使用命…

ChatGPT爆火,会给教育带来什么样的影响或者冲击?

近来,人工智能聊天机器人ChatGPT连上热搜,火爆全网。ChatGPT拥有强大的信息整合能力、自然语言处理能力,可谓是“上知天文,下知地理”,而且还能根据要求进行聊天、撰写文章等。 ChatGPT一经推出,便迅速在社…

生活随笔,记录我的日常点点滴滴.

前言 😘个人主页:曲终酣兴晚^R的小书屋🥱 😕作者介绍:一个莽莽撞撞的🐻 💖专栏介绍:日常生活&往事回忆 😶‍🌫️每日金句:被人暖一下就高热&…

SpringBoot的配置文件(properties与yml)

文章目录 1. 配置文件的作用2. 配置文件格式3. 配置文件的使用方法3.1. properties配置文件3.1.1. 基本语法和使用3.1.2. properties优缺点分析 3.2. yml配置文件3.2.1. 基本语法与使用3.2.2. yml中单双引号问题3.2.3. yml配置不同类型的数据类型及null3.2.4. 配置对象3.2.5. 配…

CS5263替代停产IT6561连接DP转HDMI音视频转换器ASL 集睿致远CS5263设计电路原理图

ASL集睿致远CS5263是一款DP1.4到HDMI2.0b转换器芯片,设计用于将DP1.4源连接到HDMI2.0b接收器。 CS5263功能特性: DP接口包括4条主通道、辅助通道和HPD信号。接收器支持每通道5.4Gbps(HBR2)数据速率。DP接收机结合了HDCP1.4和HDCP…

接口测试工具——Postman测试工具 Swagger接口测试+SpringBoot整合 JMeter高并发测试工具

目录 Postman测试工具接口测试工具swaggerKnife4j1.引入依赖2.配置3.常用注解4.接口测试 JMeter什么是JMeter?JMeter安装配置1.官网下载2.下载后解压3.汉语设置 JMeter的使用方法1.新建线程组2.设置参数3.添加取样器4.设置参数:协议,ip,端口…

使用Nginx解决跨域问题

前言: 项目是公司的老项目,只有部署在服务器上的时候,项目才可以正常运行(接口是通的);现在需求:在现有的项目代码上进行修改,请求接口是第三方给的。接口是正常的,通过A…

stm32f407 ADC学习记录

主要特性: ● 可配置 12 位、10 位、8 位或 6 位分辨率 ● 在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断 ● 单次和连续转换模式 ● 用于自动将通道 0 转换为通道“ n ”的扫描模式 ● 数据对齐以保持内置数据一致性(16位的数据…

Python pycparser(c文件解析)模块使用教程

文章目录 安装 pycparser 模块模块开发者网址获取抽象语法树1. 需要导入的模块2. 获取 不关注预处理相关 c语言文件的抽象语法树ast3. 获取 预处理后的c语言文件的抽象语法树ast 语法树组成1. 数据类型定义 Typedef2. 类型声明 TypeDecl3. 标识符类型 IdentifierType4. 变量声明…

Jmeter快捷方式和应用图标设置

很多人在安装Jmeter,安装到本机却没有icon,每次使用的时候,每次打开应用都要找目录,不太方便。 【解决问题】 使用bin路径下的一个.bat文件,创建快捷方式。 【操作步骤】 Step1、将Jmeter 安装bin路径下的jmeter.bat 发送快捷方…

用node.js搭建一个视频推流服务

由于业务中有不少视频使用的场景,今天来说说如何使用node完成一个视频推流服务。 先看看效果: 这里的播放的视频是一个多个Partial Content组合起来的,每个Partial Content大小是1M。 一,项目搭建 (1)初…

微信小程序纯前端从阿里云OSS下载json数据-完整版

起因 因为云开发开始收费(貌似很久了),准备改造在以前的小程序,数据转到oss上,小程序使用原生,不算专业领域, 所以先百度.... 网上的教程真的是千篇一律,大部分开局就是require(ali-oss); 好点的npm install ali-oss --save开局,拼凑操作到最后发现要用云开发,因为云…

在Orangepi5开发板3588s使用opencv获取摄像头画面

先感谢香橙派群的管理员耐心指导,经过不断的调试修改最后成功通过opencv调用mipi摄像头获取画面 就记录分享一下大概步骤希望大家少踩点坑!!!!!! 我用的固件系统是ubuntu2022.0.4 固件是&#x…

【jwt】JWT原理,JWT是用来解决什么问题的,如何自定义生成JWT数据,并且实现jwt数据的解码

JWT: JSON Web Token 1. jwt概述 用户登录成功后,服务端 如何知道客户端的每次请求对应的是哪个用户呢?怎么做:目前有两种方式实现. 1.1. 一是通过sessionId的方式,登录成功后服务端返回sessionId给客户端&#xff0…

Linux_10_进程、系统性能和计划任务

目录 1 进程和内存管理1.1 什么是进程1.2 进程结构1.3 进程相关概念1.3.1 物理地址空间和虚拟地址空间1.3.2 用户和内核空间1.3.3 C代码和内存布局之间的对应关系1.3.4 进程使用内存问题1.3.4.1 内存泄漏: Memory Leak1.3.4.2 内存溢出: Memory Overflow1.3.4.3 内存不足: OOM …

【STM32RT-Thread零基础入门】 5. 线程创建应用(线程创建、删除、初始化、脱离、启动、睡眠)

硬件:STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 文章目录 前言一、线程管理接口介绍二、任务:使用多线程的方式同时实现led闪烁和按键控制喇叭(扫描法)1. RT-Thread相关接…

STM32 FLASH 读写数据

1. 《STM32 中文参考手册》,需要查看芯片数据手册,代码起始地址一般都是0x8000 0000,这是存放整个项目代码的起始地址 2. 编译信息查看代码大小,修改代码后第一次编译后会有这个提示信息 2.1 修改代码后编译,会有提示…

ant-design-vue在ios使用AUpload组件唤起了相机,HTML的 `capture` 属性

在使用ant design vue组件的上传组件AUpload的时候有一个问题&#xff0c;直接按照demo写&#xff0c;在ios上会唤起相机&#xff0c;但是实际上我们的需求是弹出选择相册/相机这个弹框。 解决办法是加一个 cupture"null"这个属性即可 <a-upload:capture"nu…

注册中心Eureka和Nacos,以及负载均衡Ribbon

1.初识微服务 1.1.什么是微服务 微服务&#xff0c;就是把服务拆分成为若干个服务&#xff0c;降低服务之间的耦合度&#xff0c;提供服务的独立性和灵活性。做到高内聚&#xff0c;低耦合。 1.2.单体架构和微服务架构的区别&#xff1a; 单体架构&#xff1a;简单方便&#…