Reconocimiento de orientación facial basado en la red neuronal BP

1. Procesamiento de imágenes digitales
1.1 Supuesto del problema

  • Todas las imágenes de caras dadas no tienen problemas como daños;
  • La orientación de la cara solo se divide en 5 categorías: izquierda, centro izquierda, centro, centro derecha y derecha, no se consideran otras orientaciones;
  • Para la imagen de la cara dada en el título, no se considera la expresión compleja de la cara;

1.2 Extracción de vectores de características faciales basada en la detección de bordes Operador de Sobel

El primer paso del reconocimiento facial es la extracción de rasgos faciales, es decir, cómo convertir imágenes faciales en valores de características digitales. En la actualidad, existen muchos métodos para la extracción de características faciales, como el método de análisis de componentes principales, el método discriminante lineal de Fisher, el método de análisis de ondículas, etc. A través de la extracción de vectores de características, se utiliza como entrada de la red neuronal. Mediante el análisis de la imagen de orientación de la cara, cuando la orientación de la cara es diferente, la posición de los ojos en la imagen será obviamente diferente. Por lo tanto, solo es necesario extraer el vector de características de la información de la posición del ojo humano. El método principal es detectar primero el límite de la imagen y luego usar la información de límite obtenida para la extracción de características. Debido a que el operador de Sobel tiene un mejor efecto en el procesamiento de la imagen del degradado gris, no solo puede detectar los puntos del borde, sino que también puede suprimir aún más la influencia del ruido. Por lo tanto, el cálculo de Sobel se utiliza para extraer el límite de la cara.

En la caja de herramientas de MATLAB, la función edge (img, 'Sobel') se puede utilizar para la detección de bordes, y luego la imagen se divide en 6 filas y 8 columnas. La información de posición del ojo humano se puede describir mediante 8 submatrices en la segunda fila La orientación de la cara está directamente relacionada con el número de píxeles con un valor de 1 en las 8 submatrices. Siempre que se cuenten respectivamente los puntos de píxel con el valor "1" en las 8 submatrices de la segunda fila. El algoritmo de Sobel se utiliza para extraer el límite como se muestra en la siguiente figura:
Inserte la descripción de la imagen aquí
2. Red
neuronal BP 2.1 Modelo de red neuronal BP

La red neuronal BP es una red de reenvío multicapa, que se compone de una capa de entrada, una capa de salida y una capa oculta (que puede ser una o más capas). En la figura se muestra un modelo típico de red neuronal BP de tres capas. Figura 3. La idea principal del algoritmo de retropropagación es dividir el proceso de aprendizaje en dos etapas: la primera etapa (proceso de propagación hacia adelante), la información de entrada comienza desde la capa de entrada y calcula el valor de salida real de cada unidad capa por capa, y el estado de cada capa de neuronas solo afecta el estado de la siguiente capa de neuronas. En la segunda etapa (proceso de transmisión inversa), si el valor de salida esperado no se puede obtener en la capa de salida, la diferencia entre la salida real y la salida esperada se calcula de forma recursiva capa por capa, y el peso de la capa anterior se corrige de acuerdo con a este error para hacer que la tendencia de la señal de error sea la más pequeña. Se acerca gradualmente al objetivo calculando continuamente los pesos de la red y los cambios de desviación en la dirección de la pendiente decreciente de la función de error. Cada vez que el peso y el error cambian son proporcionales a la influencia del error de red.

Inserte la descripción de la imagen aquí
2.2 Visualización de código

%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)

En tercer lugar, la pantalla de resultados Se
Inserte la descripción de la imagen aquí
puede ver que toda la orientación de la cara se reconoce como 100%.

Supongo que te gusta

Origin blog.csdn.net/qq_42955211/article/details/106572622
Recomendado
Clasificación