【姿态识别】基于HOG特征提取和GRNN广义回归神经网络的人体姿态识别matlab仿真

1.软件版本

matlab2013b

2.本算法理论知识

GRNN广义回归神经网络的理论基础是非线性核回归分析,非独立变量y相对于独立变量x的回归分析实际上是计算具有最大概率值的y。设随机变量x和y的联合概率密度函数为f (x ,y),已知x的观测值为X,则y相对于X的回归,即条件均值为:

 对于未知的概率密度函数f (x, y),可由x和y的观测样本经非参数估计得:

其中:和为随机变量x和y的样本观测值;为光滑因子;n为样本数目;p为随机变量x的维数。

    根据式子1和2可以得到:

 

        GRNN通常被用来进行函数逼近。它具有一个径向基隐含层和一个特殊的线性层。第一层和第二层的神经元数目都与输入的样本向量对的数目相等。GRNN结构如图1所示,整个网络包括四层神经元:输入层、模式层、求和层与输出层。


         输入层的神经元数目与学习样本中输入向量的维数m相等,每个神经元都是一个简单的分布单元,这些神经元直接将输入变量传递到隐含层中。

具体过程如下:

预处理:

第一步:由于采集到的深度图有的地方的深度值为零,首先用最邻近差值算法将为零的深度值用其周围的点代替;

第二步:用中值滤波算法对上一步骤获得的图像进行处理,去噪声;

头模型匹配:

第三步:首先对图像进行边缘检测,采用canny算法,对采集后的图像进行距离转换,然后用头模型(图片集中的头模型)进行头部匹配,最终定位人的位置;

提取人形:

第四步:由于人脚与地面处于同一深度,所以先用F响应滤波器对图像进行处理,提取人脚与地面的边缘;

第五步:采用区域增长算法,对定位的人进行提取,最终提取整个人形,;

特征提取:

第六步:用HOG方法对上一步获得的图像进行特征提取;

第七步:用深度差分算法对第五步获得的图像进行特征提取,特征函数为:

GRNN分类:

第八步:构造多分类GRNN,可以实现姿态识别的效果

3.部分源码

clc;
clear;
warning off;
addpath 'func\'

load Step1.mat
load Step5.mat



%将趋于中的小空隙填满
SE2         = strel('ball',3,3);
I133        = (imdilate(double(255*I13),SE2,'same')); %dilate
[r,c] = size(I133);
I14   = zeros(r,c);
for i = 1:r
    for j = 1:c
        if I133(i,j) > 100
           I14(i,j) = 1;
        end
    end
end


ff          = uint8(255*I14);
[rows,cols] = size(ff);
[Ls,n]      = bwlabel(ff);
X1          = [];
X2          = [];
Y1          = [];
Y2          = [];
flag        = 0;

for i=1:n
    [r,c]     = find(Ls==i);
    a1(i)     = max(r);
    a2(i)     = min(r);
    b1(i)     = max(c);
    b2(i)     = min(c);
    w(i)      = b1(i)-b2(i);
    h(i)      = a1(i)-a2(i);
    X1        = a2(i);
    X2        = a1(i);
    Y1        = b2(i);
    Y2        = b1(i);
end

I1s      = I1;
[r,c,k]  = size(I1);
I1s      = I1;
for i = 1:r
    for j = 1:c
        if I14(i,j) == 0
           I1s(i,j,:) = 0;
        end
    end
end

Images = I1s(X1:X2,Y1:Y2,:);





figure;
subplot(131);
imshow(I1,[]);
title('原始图');
subplot(132);
imshow(I14,[]);
title('人体提取图');
subplot(133);
imshow(Images,[]);
title('人体提取图');


I = Images;
%HOG特征提取
FX_Number   = 9;  %9个方向
FilterSize  = 0;  %高斯低通滤波器大小
FilterDelta = 0;  %标准偏差
Angles      = 180;%角度
CellSize    = 8;  %分割大小8X8
move_pixel  = 8;  %移动像素

if size(I,3) == 3
    I_gray = rgb2gray(I);
else
    I_gray = I;
end
I_gray = imresize(I_gray,[270,150]);

%梯度和梯度角度计算
[GradientX,GradientY,Gr] = func_Gradient(I_gray,FilterSize,FilterDelta);
%角度计算
A                        = func_HOG_Angle(GradientX,GradientY,Angles);
%计算统计向量
[height,width]           = size(I_gray);                 
Hog_Dat                  = func_Gradient_TJ(Gr,A,Angles,FX_Number,width,height,CellSize,move_pixel);
Hog_Dat                  = Hog_Dat(:);

save test_feature.mat Hog_Dat
 

4.仿真结论

测试样本如下:

 

 

 

 

 

 

 

5.参考文献

[1]侯香. 基于RGB-D的人体姿态识别方法研究[D]. 燕山大学.A09-41

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/124982964