BPニューラルネットワークに基づく顔の向きの認識

1.デジタル画像処理
1.1問題の仮定

  • 与えられたすべての顔画像には、損傷などの問題はありません。
  • 顔の向きは、左、中央左、中央、中央右、右の5つのカテゴリにのみ分類されます。他の向きは考慮されません。
  • 質問で与えられた顔の画像については、顔の複雑な表現は考慮されていません。

1.2エッジ検出に基づく顔特徴ベクトル抽出Sobel演算子

顔認識の最初のステップは、顔の特徴の抽出、つまり、顔の画像をデジタル特徴値に変換する方法です。現在、顔の特徴抽出には、主成分分析法、フィッシャー線形判別法、ウェーブレット分析法など多くの方法があります。特徴ベクトル抽出により、ニューラルネットワークの入力として使用されます。顔の向きの画像を分析すると、顔の向きが異なると、画像内の目の位置が明らかに異なります。したがって、人間の目の位置情報の特徴ベクトルのみを抽出する必要があります。主な方法は、最初に画像の境界を検出し、次に取得した境界情報を特徴抽出に使用することです。Sobel演算子は、グレースケールグラデーションの画像処理により優れた効果を発揮するため、エッジポイントを検出できるだけでなく、ノイズの影響をさらに抑えることができます。したがって、Sobel計算を使用して、顔の境界を抽出します。

MATLABツールボックスでは、関数edge(img、 'Sobel')を使用してエッジを検出し、画像を6行8列に分割します。人間の目の位置情報は8つのサブ行列で記述できます。顔の向きは、8つのサブマトリックスの値が1のピクセル数に直接関係しています。2行目の8つのサブ行列の値が「1」のピクセルポイントがそれぞれカウントされる限り。次の図に示すように、Sobelアルゴリズムを使用して境界を抽出します
ここに画像の説明を挿入
。2。BPニューラルネットワーク
2.1BPニューラルネットワークモデル

BPニューラルネットワークは、入力層、出力層、および隠れ層(1つ以上の層にすることができます)で構成される多層フォワードネットワークです。典型的な3層のBPニューラルネットワークモデルをに示します。図3。バックプロパゲーションアルゴリズムの主なアイデアは、学習プロセスを2つの段階に分割することです:最初の段階(順伝播プロセス)、入力情報は入力層から始まり、各ユニット層の実際の出力値を層ごとに計算します、そしてニューロンの各層の状態は、ニューロンの次の層の状態にのみ影響します。第2段階(逆送信プロセス)では、出力層で期待出力値が得られない場合、実際の出力と期待出力の差が層ごとに再帰的に計算され、前の層の重みがそれに応じて修正されます。このエラーに対して、エラー信号の傾向を最小にします。ネットワークの重みと誤差関数の傾きが減少する方向の偏差の変化を継続的に計算することにより、徐々にターゲットに近づきます。重みとエラーの変化は、ネットワークエラーの影響に比例します。

ここに画像の説明を挿入
2.2コード表示

%BP神经网络训练
clc;
images=[ ];
M_train=8;%表示人脸
N_train=5;%表示方向
sample=[];
pixel_value=[];
sample_number=0;
k=0;
for j=1:N_train
for i=1:M_train
str=strcat('Images\',num2str(i),'_',num2str(j),'.bmp'); %读取图像,连接字符串形成图像的文件名。
img= imread(str);
[rows cols]= size(img);%获得图像的行和列值。
img_edge=edge(img,'Sobel');
k=k+1;
subplot(M_train,N_train,k)
imshow(img_edge)%显示灰度图
%由于在分割图片中我们可以看到这个人脸的眼睛部分也就是位于分割后的第二行中,位置变化比较大,而且眼睛边缘检测效果很好
sub_rows=floor(rows/6);%最接近的最小整数,分成6行
sub_cols=floor(cols/8);%最接近的最小整数,分成8列
sample_num=M_train*N_train;%5个是第一幅人脸的5个角度
sample_number=sample_number+1;
for subblock_i=1:8 %因为这还在i,j的循环中,所以不可以用i
block_num=subblock_i;
pixel_value(sample_number,block_num)=0;
for ii=sub_rows:(2*sub_rows)
for jj=(subblock_i-1)*sub_cols+1:subblock_i*sub_cols
pixel_value(sample_number,block_num)=pixel_value(sample_number,block_num)+img_edge(ii,jj);
end
end
end
end
end
%将特征值转换为小于1的值
max_pixel_value=max(pixel_value);
max_pixel_value_1=max(max_pixel_value);
for i=1:3
mid_value=10^i;
if(((max_pixel_value_1/mid_value)>1)&&((max_pixel_value_1/mid_value)<10))
multiple_num=1/mid_value;
pixel_value=pixel_value*multiple_num;
break;
end
end
%T 为目标矢量
t=zeros(1,sample_number);
%因为有五类,所以至少用3个数表示,5介于22次方和23次方之间
for i=1:sample_number
% if((mod(i,5)==1)||(mod(i,5)==4)||(mod(i,5)==0))
if(i<=M_train)
t(1,i)=1;
end
if(i>M_train&&i<=2*M_train)
t(1,i)=2;
end
if(i>2*M_train&&i<=3*M_train)
t(1,i)=3;
end
if(i>3*M_train&&i<=4*M_train)
t(1,i)=4;
end
if(i>4*M_train&&i<=5*M_train)
t(1,i)=5;
end
end
% NEWFF——生成一个新的前向神经网络
% TRAIN——对 BP 神经网络进行训练
% SIM——对 BP 神经网络进行仿真
%  定义训练样本
% P 为输入矢量
P=pixel_value'
% T 为目标矢量
T=t
size(P)
size(T)
% size(P)
% size(T)
%  创建一个新的前向神经网络
net_1=newff(minmax(P),[10,1],{
    
    'tansig','purelin'},'traingdm')
%  当前输入层权值和阈值
inputWeights=net_1.IW{
    
    1,1}
inputbias=net_1.b{
    
    1}
%  当前网络层权值和阈值
layerWeights=net_1.LW{
    
    2,1}
layerbias=net_1.b{
    
    2}
%  设置训练参数
net_1.trainParam.show = 50;
net_1.trainParam.lr = 0.01;
net_1.trainParam.mc = 0.9;
net_1.trainParam.epochs = 60000;
net_1.trainParam.goal = 1e-3;
%  调用 TRAINGDM 算法训练 BP 网络
[net_1,tr]=train(net_1,P,T);
%BP 网络进行仿真
A = sim(net_1,P);
%  计算仿真误差
E = T - A;
mse(E)
%BP神经网络测试
%加载保存好的神经网络
A = sim(net_1,p)
%四舍五入结果
result=round(A)
%显示判断结果
num3=0;
direction='方向';
s=struct('direction',direction);
for num0=1:sample_num
if (num0<=2)
if result(num0)==1
s(num0).direction='右';
end
end
if (num0>2&&num0<=4)
if result(num0)==2
s(num0).direction='中右';
end
end
if (num0>4&&num0<=6)
if result(num0)==3
s(num0).direction='中间';
end
end
if (num0>6&&num0<=8)
if result(num0)==4
s(num0).direction='中左';
end
end
if (num0>8&&num0<=10)
if result(num0)==5
s(num0).direction='左';
end
end
end
%显示结果
for num1=1:N_train
for num2=1:M_train
num3=num3+1;
consequence=sprintf('图%d-%d人脸朝%s方向',num2+8,num1,s(num3).direction)
str=strcat('D:\复习教材\神经网络\3 BP神经网络\program\Images\',num2str(num2+8),'_',num2str(num1),'.bmp'); %读取图像,连接字符串形成图像的文件名。
str1=consequence;
img= imread(str);
[rows cols]= size(img);%获得图像的行和列值。
img_edge=edge(img,'Sobel');
k=k+1;
subplot(M_train,N_train,k);
imshow(img_edge);%显示灰度图
title(consequence);
end
end
%显示正确率
correct_rate=[];
for num4=1:sample_num
if s(num4).direction~=0
correct_rate(num4)=1;
else
correct_rate(num4)=0;
end
end
sum1=sum(correct_rate(:));
correct_rate1=sum1/sample_num*100;
sprintf('识别正确率为 %d%%',correct_rate1)

第三に、結果表示
ここに画像の説明を挿入
顔全体の向きが100%と認識されていることがわかります。

おすすめ

転載: blog.csdn.net/qq_42955211/article/details/106572622