m基于PCA-SA低纬紧致姿态空间学习算法的单目视频人体姿态提取matlab仿真

该文介绍了一种基于高斯混合模型和帧差法的运动目标提取算法,结合PCA和改进的模拟退火粒子群优化算法进行人体姿态估计。实验在MATLAB环境下进行,包括视频处理、姿态读取和优化算法的实现,展示了良好的计算效率和收敛性。
摘要由CSDN通过智能技术生成

目录

1.算法仿真效果

2.MATLAB核心程序

3.算法涉及理论知识概要

4.完整MATLAB


1.算法仿真效果

matlab2013b仿真结果如下:

 

2.MATLAB核心程序

.........................................................................
%%
%读取视频数据
%获得视频,从视频中提取每帧对应的jpg图像,这样方便后面的处理,如果视频序列默认是连续图像,那么这段语句就可以不用
%支持视频格式avi格式
if Start(1) == 1
   disp('read the avi...');
   [Obj,frameNum_Original]     = get_AVI(FileName_AVI);
   %将视频保存为jpg形式,方便对比处理
   [pixel_original,pixel_gray] = vedio_op(Obj,frameNum_Original);
   
   [RR,CC,KK]  = size(pixel_gray);
   
   for i = 1:min(frameNum_Original,Process_frames)
       pixel_gray2(:,:,i)       = imresize(pixel_gray(:,:,i),[RR/2,CC/2]);
       pixel_original2(:,:,:,i) = imresize(pixel_original(:,:,:,i),[RR/2,CC/2]);
   end   
   
   %保存数据
   save Save_Temp\Start1\Start01.mat pixel_gray2     frameNum_Original RR CC
   save Save_Temp\Start1\Start02.mat pixel_original2 frameNum_Original RR CC
   
   clear Obj pixel_original pixel_gray pixel_original2 pixel_gray2 frameNum_Original
   disp('read the avi over...');
   pause(8);
   close all;
end
 
....................................................................
   figure;
   for tt = 1:min(frameNum_Original,Process_frames)
       tt
       subplot(221)
       imshow(image_sequence2(:,:,:,tt));
       title('原始图像');
       subplot(222)
       imshow(uint8(background_Update2));
       title('背景图像更新');
       subplot(223)
       imshow(Images02(:,:,tt));
       title('运动目标检测');
       subplot(224)
       imshow(Images22(:,:,tt));
       title('运动目标提取');
       pause(0.2);
   end
   
   clear image_sequence2 background_Update2 Images02 Images22 pixel_original2 frameNum_Original2 RR CC 
   disp('Get the Background over...');
   pause(8);
   close all;   
end    
    




%%
%姿态读取
if Start(3) == 1
   disp('Start read AMC and ASF file...');
   load Save_Temp\Start2\Start01.mat;
   
   skel                         = acclaimReadSkel(FileName_ASF);
   [channels, skel]             = acclaimLoadChannels(FileName_AMC,skel);
   [handle,channels,skelStruct] = skelPlayData(skel,channels); 
   if  SHOW_BJ_SKLer == 1
       for j = 1:size(channels,1)
           pause(0.005)
           skelModify(handle,channels(j,:),skelStruct);
       end
   end
   %假设人体姿态空间为X,对于特定的运动选取一段人体运动数据作为训练数据   
   %矩阵X
   X0 = channels';
   whole_times = size(X0,2);
   MM          = size(X0,1); 
   %计算每个姿态的时间均值
   for j = 1:MM
       c(j) = mean(X0(:,j));
   end
   %获得人体数据
   for j = 1:whole_times
       X(:,j) = X0(:,j) - c';
   end   
   %对矩阵X作奇异值分解,得到主方向
   [U,S,V] = svd(X);
   %姿态向量投影到子空间
   for j = 1:whole_times
       Xs(:,j) = U(:,1:mmer)'*X(:,j);%UT*(x-c)
   end
  
   figure;
   plot3(Xs(1,:),Xs(2,:),Xs(3,:),'bo');
   title('三维流形空间中的表示');
   grid on;
   xlabel('X');
   ylabel('Y');   
   zlabel('Z');
   
   %视频帧数量和节点帧数量一致化
   Rate = round(whole_times/frameNum_Original2);
   
   skel                         = acclaimReadSkel(FileName_ASF);
   [channels, skel]             = acclaimLoadChannels(FileName_AMC,skel);
   [handle,channels,skelStruct] = skelPlayData(skel,channels);    
   save Save_Temp\Start3\Start01.mat skel handle channels skelStruct whole_times MM c X0 X U S V Xs Rate
   clear skel handle channels skelStruct whole_times MM c X0 X U S V Xs Rate
   disp('Read AMC and ASF file over...'); 
   pause(8);
   close all;
end




%%
%基于模拟退火的粒子群优化算法(此处将会未来做改进版本)
if Start(4) == 1
   disp('SAPSO...');
   load Save_Temp\Start2\Start01.mat 
   load Save_Temp\Start3\Start01.mat
   %计算最大值和最小值
   for i = 1:whole_times
       Xmin(i) = min(Xs(:,i));
       Xmax(i) = max(Xs(:,i));
       Vmin(i) = alphaer*Xmin(i);
       Vmax(i) = alphaer*Xmax(i);       
   end
   %K均值聚类
   Data               = Xs;
   [row,col]          = size(Data);
   Center             = Data(:,1:Cluster_Numer);
   %进行初始的迭代
   [KindData,KindNum] = func_Kmeans_Cluster(Center,Data);
   NewCenter          = func_NewCenter(KindData,KindNum,row);
  
   while (sum(sum(NewCenter ~= Center))) & Step
        Center             = NewCenter;
        [KindData,KindNum] = func_Kmeans_Cluster(Center,Data);
        NewCenter          = func_NewCenter(KindData,KindNum,row);
        Step               = Step-1;
   end  
   
   for i = 1:Cluster_Numer
       for j = 1:length(Data)
           if KindData(1,j,i) ~= 0 | KindData(2,j,i) ~= 0
              if i == 1
                 plot3(KindData(1,j,i),KindData(2,j,i),KindData(3,j,i),'ro');hold on      
              end
              if i == 2
                 plot3(KindData(1,j,i),KindData(2,j,i),KindData(3,j,i),'bo');hold on      
              end        
              if i == 3
                 plot3(KindData(1,j,i),KindData(2,j,i),KindData(3,j,i),'go');hold on      
              end     
              if i == 4
                 plot3(KindData(1,j,i),KindData(2,j,i),KindData(3,j,i),'ko');hold on      
              end           
              if i == 5
                 plot3(KindData(1,j,i),KindData(2,j,i),KindData(3,j,i),'mo');hold on      
              end         
           end
       end
   end
................................................................................

   
   %画最佳适应度值
   figure(4);
   plot(V_score2,'b');
   xlabel('迭代次数');
   xlabel('适应度值');
   grid on

   
   %计算训练误差
   %显示误差
   load Save_Temp\Start2\Start01.mat 
   load Save_Temp\Start3\Start01.mat
   %计算其误差
   Lss = min(length(PP),length(X_rate));

   for i = 1:MM
       Err(i) = (abs(sum((PP(i,1:Lss)) - X_rate(i,1:Lss))))/length(X_rate(i,1:Lss));
   end
   
   figure(5);
   subplot(211);
   bar(Err1);
   xlabel('Frame No.');
   ylabel('Mean Error');
   grid on; 
   subplot(212);
   plot(Err1,'r-o');
   xlabel('Frame No.');
   ylabel('Mean Error');
   grid on; 
   
   figure(6);
   subplot(211);
   bar(Err2);
   xlabel('Frame No.');
   ylabel('Mean Error');
   grid on; 
   subplot(212);
   plot(Err2,'r-o');
   xlabel('Frame No.');
   ylabel('Mean Error');
   grid on; 
   %显示最后的姿态轨迹结果和标志结果的对比
   
   load Save_Temp\Start4\W.mat
   figure(7);
   plot(w);
   grid on;    
   
   figure(8);
   skel                         = acclaimReadSkel(FileName_ASF);
   [channels, skel]             = acclaimLoadChannels(FileName_AMC,skel);
   [handle,channels,skelStruct] = skelPlayData(skel,channels); 
   
   %标准数据
   for j = 1:Lss
       pause(0.05)
       skelModify(handle,channels(Rate*j,:),skelStruct);
   end
  
   %预测数据
   for j = 1:Lss
       pause(0.05)
       skelModify(handle,PP(:,j),skelStruct);
   end   

   %显示姿态估计的最终效果:原始图像,标准姿态,估计姿态,叠加效果
   disp('cal the error over...'); 
   pause(1);
end
09_032_m

3.算法涉及理论知识概要

        介绍了运动人体的剪影提取,在视频序列中,由于受到复杂背景、遮挡、光照变化等因素的影响,通常的背景分离算法无法有效的对运动人体进行提取,本文介绍了一种基于高斯混合模型和帧差法相结合的运动目标提取算法,从而获得了精度较高的运动人体剪影。

        由于人体姿态运动数据通常是高维矩阵数据,在处理之前一般需要进行降维度处理,首先通过传统的PCA降维算法进行处理。然后分析了PCA算法的缺陷和不足,并在PCA算法的基础上提出了一种基于概率信息的改进PCA算法。在PCA的基础上,加入一个噪声变量,用来调整后面N-M个高维度的数据的精度。 通过最大似然估计进行估计这个噪声模型,然后叠加到PCA模型的高维数据上。

       对降维后的数据进行粒子群的姿态估计,这里首先使用PSO粒子群优化算法进行优化,然后使用模拟退火算法进行优化,最后通过对比分析,提出了一种基于基因突变的变权值模拟退火粒子群优化算法,通过该算法,可以大大改进最后的收敛效果,使得最后的收敛值趋于稳定收敛,收敛值达到更小的误差水平,并且不存在粒子突变的情况。

    最后,对CMU数据库中的不同运动姿态进行仿真,实验结果仿真可知本文方法不仅具有良好的计算效率,同时具有良好的收敛性和全局搜索能力,能准确估计和跟踪单目视频中的人体姿态。


        目前,运动捕获数据有多种格式,应用较为广泛的主要有BVH、ASF/AMC、FBK、C3D以及HTR等。其中ASF/AMC是最常用的数据格式。因此,这里,我们重点对ASF/AMC的数据格式进行介绍。

         ASF/AMC,全称Acclaim Skeleton File/Acclaim Motion Data,其主要由两个文件组成:一个骨架文件和一个运动文件。ASF是骨架文件,AMC是运动文件,对于每一个特定的动作,都是由骨架来完成的,这些数据,可以从CMU数据库中获得。

      下面对ASF骨架数据进行简单的介绍,其基本结构如下图所示:

:version”指示出骨架定义的版本;

:name”允许对骨架数据进行命名;

:units”定义了各种类型数据的单位和一些参数的默认值;

:documentation”存储的是一些起到说明作用的文档信息;

        “:root”部分定义了场景中一个特定的片段,它是骨架层次结构中的根节点,除了不包含方向和长度信息之外,和其他关节是一样的。其中”axis”定义了根对象的旋转顺序,”order”指出了应用于根节点的运动通道信息,并将以这样的顺序出现在AMC文件中。”Position”和”orientation”后面的信息给出了根节点的起始位置和方位,一般情况下都是0。

        “:bonedata”部分对于层次结构中的其他骨骼信息分别进行了描述,对每个骨骼的定义都是以”begin”,开始,以”end”结束的。在对各个骨骼的定义中,包含以下几个部分:”id”是一个唯一的数字,标识了当前骨骼的序号,这一项并不是必须的,因为每段骨骼都有自己的名称,而且这个名称在层次部分和AMC文件中都被用到。”name”定义了骨骼的名称,需要注意的是,每个骨骼必须有一个唯一的名称。”direction”指出了骨骼的方向,根据该信息,可以知道如何绘制该骨骼,并定义了从父骨骼到子骨骼的方向。方向信息和长度信息决定了一个骨骼相对于其父骨骼的偏移量。”length”定义了骨骼的长度信息。”axis”部分给出了骨骼的旋转轴。通过将旋转轴指定为一个独立的值,运动数据可以独立于绘制和层次信息,这对于那些需要解决万向节死锁问题的应用来说显得尤为重要。”dof”指定了运动通道的数量和这些通道在AMC文件中出现的顺序。如果某个骨骼不包含”dof”部分,那就认为该骨骼没有任何运动数据。”limits”部分给出了自由度中指定的通道的限制信息。对于每个通道而言,限制信息都是以一对数字的形式给出的,规定了该通道允许的最小值和最大值,在运动编辑等过程中,这部分数据用来限制旋转的范围。

 “:hierarchy“部分描述了各段骨骼之间的层次关系。

4.完整MATLAB

V

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱C编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值