《MATLAB 神经网络43个案例分析》:第27章 LVQ神经网络的预测——人脸朝向识别

《MATLAB 神经网络43个案例分析》:第27章 LVQ神经网络的预测——人脸朝向识别

1. 前言

《MATLAB 神经网络43个案例分析》是MATLAB技术论坛(www.matlabsky.com)策划,由王小川老师主导,2013年北京航空航天大学出版社出版的关于MATLAB为工具的一本MATLAB实例教学书籍,是在《MATLAB神经网络30个案例分析》的基础上修改、补充而成的,秉承着“理论讲解—案例分析—应用扩展”这一特色,帮助读者更加直观、生动地学习神经网络。

《MATLAB神经网络43个案例分析》共有43章,内容涵盖常见的神经网络(BP、RBF、SOM、Hopfield、Elman、LVQ、Kohonen、GRNN、NARX等)以及相关智能算法(SVM、决策树、随机森林、极限学习机等)。同时,部分章节也涉及了常见的优化算法(遗传算法、蚁群算法等)与神经网络的结合问题。此外,《MATLAB神经网络43个案例分析》还介绍了MATLAB R2012b中神经网络工具箱的新增功能与特性,如神经网络并行计算、定制神经网络、神经网络高效编程等。

近年来随着人工智能研究的兴起,神经网络这个相关方向也迎来了又一阵研究热潮,由于其在信号处理领域中的不俗表现,神经网络方法也在不断深入应用到语音和图像方向的各种应用当中,本文结合书中案例,对其进行仿真实现,也算是进行一次重新学习,希望可以温故知新,加强并提升自己对神经网络这一方法在各领域中应用的理解与实践。自己正好在多抓鱼上入手了这本书,下面开始进行仿真示例,主要以介绍各章节中源码应用示例为主,本文主要基于MATLAB2015b(32位)平台仿真实现,这是本书第二十七章LVQ神经网络的预测实例,话不多说,开始!

2. MATLAB 仿真示例一

打开MATLAB,点击“主页”,点击“打开”,找到示例文件
在这里插入图片描述
选中chapter27_lvq.m,点击“打开”

chapter27_lvq.m源码如下:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%功能: LVQ神经网络的预测——人脸识别
%环境:Win7,Matlab2015b
%Modi: C.S
%时间:2022-06-20
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

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

%% 清除环境变量
clear all
clc
tic
%% 人脸特征向量提取 
% 人数
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) '%']);

toc

添加完毕,点击“运行”,开始仿真,输出仿真结果如下:


result =

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

  201
     1

训练集图像为:
1_5  2_1  2_3  2_5  3_1  
3_2  3_3  3_4  3_5  4_1  
4_3  4_4  5_2  5_3  5_4  
5_5  6_1  6_3  6_5  7_2  
7_3  7_4  8_2  8_4  9_2  
9_4  9_5  10_3  10_4  10_5  
测试集图像为:
1_1  1_2  1_3  1_4  2_2  
2_4  4_2  4_5  5_1  6_2  
6_4  7_1  7_5  8_1  8_3  
8_5  9_1  9_3  10_1  10_2  
图像5_1识别出错.(正确结果:朝向左方;识别结果:朝向右前方)
图像9_1识别出错.(正确结果:朝向左方;识别结果:朝向右前方)
识别率为:90%
时间已过 4.401417 秒。

在这里插入图片描述
依次点击Plots中的Performance,Training State,Confusion,Receiver Operating Characteristic得到以下图示结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. MATLAB 仿真示例二

点击当前文件夹视图框中的chapter27_bp.m
在这里插入图片描述
打开chapter27_bp.m源码如下:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%功能: BP神经网络的预测——人脸识别
%环境:Win7,Matlab2015b
%Modi: C.S
%时间:2022-06-20
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

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

%% 清除环境变量
clear all
clc
tic
%% 人脸特征向量提取 
% 人数
M = 10;
% 人脸朝向类别数
N = 5; 
% 特征向量提取
pixel_value = feature_extraction(M,N);

%% 训练集/测试集产生
% 产生图像序号的随机序列
rand_label = randperm(M*N);  
% 人脸朝向标号
direction_label = [1 0 0;1 1 0;0 1 0;0 1 1;0 0 1];
% 训练集
train_label = rand_label(1:30);
P_train = pixel_value(train_label,:)';
dtrain_label = train_label - floor(train_label/N)*N;
dtrain_label(dtrain_label == 0) = N;
T_train = direction_label(dtrain_label,:)';
% 测试集
test_label = rand_label(31:end);
P_test = pixel_value(test_label,:)';
dtest_label = test_label - floor(test_label/N)*N;
dtest_label(dtest_label == 0) = N;
T_test = direction_label(dtest_label,:)';

%% 创建BP网络
net = newff(minmax(P_train),[10,3],{
    
    'tansig','purelin'},'trainlm');
% 设置训练参数
net.trainParam.epochs = 1000;
net.trainParam.show = 10;
net.trainParam.goal = 1e-3;
net.trainParam.lr = 0.1;

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

%% 仿真测试
T_sim = sim(net,P_test);
for i = 1:3
    for j = 1:20
        if T_sim(i,j) < 0.5
            T_sim(i,j) = 0;
        else
            T_sim(i,j) = 1;
        end
    end
end
T_sim
T_test
toc

点击“运行”,开始仿真,输出仿真结果如下:


T_sim =

  1190     0     0     0     0     0     1     0     1     0     0     1     0     0     0     1     1     0     0
     1     0     0     0     0     1     0     1     1     1     1     0     0     1     1     1     1     0     0
     1     0     0     1     1     0     0     0     0     1     1     0     1     1     0     1     0     1     0

  201
     1
     0


T_test =

  1190     0     1     0     0     0     1     0     0     0     0     1     0     0     0     1     1     0     1
     1     0     0     1     0     1     0     1     1     1     0     0     0     1     1     1     1     0     0
     1     1     0     1     1     0     0     0     0     1     1     0     1     1     0     0     0     1     0

  201
     1
     0

时间已过 3.215773 秒。

在这里插入图片描述
依次点击Plots中的Performance,Training State,Regression可得到以下图示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. MATLAB 仿真示例三

点击当前文件夹视图框中的chapter_svm.m
在这里插入图片描述
打开chapter_svm.m源码如下:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%功能: SVM的预测——人脸识别
%环境:Win7,Matlab2015b
%Modi: C.S
%时间:2022-06-20
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% SVM的预测——人脸识别

%% 清除环境变量
clear all
clc
warning off
tic
%% 人脸特征向量提取 
% 人数
M = 10;
% 人脸朝向类别数
N = 5; 
% 特征向量提取
pixel_value = feature_extraction(M,N);
% 归一化
pixel_value = premnmx(pixel_value);

%% 训练集/测试集产生
% 产生图像序号的随机序列
rand_label = randperm(M*N);  
% 人脸朝向标号
direction_label = repmat(1:N,1,M);
% 训练集
rand_train = rand_label(1:30);
Train = pixel_value(rand_train,:);
Train_label = direction_label(rand_train)';
% 测试集
rand_test = rand_label(31:end);
Test = pixel_value(rand_test,:);
Test_label = direction_label(rand_test)';
% SVM模型
model = svmtrain(Train_label,Train,'-c 2 -g 0.05');
% 仿真测试
[predict_label,accuracy] = svmpredict(Test_label,Test,model);
result_svm = [Test_label';predict_label']
toc

点击“运行”,开始仿真,输出仿真结果如下:

Accuracy = 100% (20/20) (classification)

result_svm =

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

  204
     4

时间已过 0.832052 秒。

样本图片文件夹如下:
在这里插入图片描述

5. 小结

本章继续采用LVQ神经网络进行预测,同时采用BP神经网络与SVM进行对比,得到结果如上图所示,可以看到预测效果LVQ神经网络<BP神经网络<SVM,想了其他LVQ神经网络示例的,可以回到本专栏上一章进行了解。对本章内容感兴趣或者想充分学习了解的,建议去研习书中第二十七章节的内容。后期会对其中一些知识点在自己理解的基础上进行补充,欢迎大家一起学习交流。

上一章文章:《MATLAB 神经网络43个案例分析》:第26章 LVQ神经网络的分类——乳腺肿瘤诊断

猜你喜欢

转载自blog.csdn.net/sinat_34897952/article/details/125288140