m基于遗传优化的凸松弛算法完成从二维人体图像中提取三维姿态的matlab仿真

目录

1.算法仿真效果

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

3.MATLAB核心程序

4.完整算法代码文件


1.算法仿真效果

matlab2022a仿真结果如下:

 

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

      三维姿态估计是计算机视觉领域中一个非常重要的问题,它在许多应用中都具有重要的作用,如人机交互、姿态识别、动作捕捉等。在过去的几年中,随着深度学习技术的发展,基于深度学习的方法取得了很大的进展,但是这些方法仍然存在许多问题,如对于遮挡和复杂姿态的处理等。
二维人体图像到三维姿态的转换一直是计算机视觉领域中的难题。在本文中,我们将介绍一种新的方法,该方法使用基于凸松弛的方法来估计三维姿态。凸松弛是一种数学优化方法,它可以用来解决许多实际问题,包括姿态估计。我们还将使用遗传优化算法来进一步提高凸松弛算法的性能。
      凸松弛是一种数学优化方法,它可以用来解决许多实际问题,包括姿态估计。在本文中,我们将使用凸松弛算法来估计三维姿态。凸松弛算法使用了一种强大的数学工具,称为凸优化,该工具可以在不知道准确模型参数的情况下,通过最小化目标函数来估计模型参数。凸优化是一种非常有效的优化方法,因为它可以保证全局最优解。
       基于遗传优化的凸松弛算法,凸松弛算法是一种非常强大的数学工具,但是在实际应用中,它仍然存在许多问题,如局部最优解和收敛速度慢等。为了解决这些问题,我们将引入遗传优化算法来进一步提高凸松弛算法的性能。
        遗传优化算法是一种基于生物学进化理论的优化算法,它通过模拟自然选择和遗传变异来搜索最优解。在本文中,我们将使用遗传优化算法来搜索凸松弛算法的最优解。具体来说,我们将使用遗传优化算法来搜索凸松弛算法的参数,以使目标函数最小化。使用遗传优化算法可以加快凸松弛算法的收敛速度,并且可以更好地避免局部最优解。提出的基于遗传优化的凸松弛算法的性能。我们将我们的方法与一些最新的三维姿态估计方法进行比较,包括基于深度学习的方法和基于传统优化方法的方法。

       遗传优化长度为L的n个二进制串bi(i=1,2,…,n)组成了遗传算法的初解群,也称为初始群体。在每个串中,每个二进制位就是个体染色体的基因。根据进化术语,对群体执行的操作有三种:

1.选择(Selection)

这是从群体中选择出较适应环境的个体。这些选中的个体用于繁殖下一代。故有时也称这一操作为再生(Reproduction)。由于在选择用于繁殖下一代的个体时,是根据个体对环境的适应度而决定其繁殖量的,故而有时也称为非均匀再生(differential reproduction)。

2.交叉(Crossover)

这是在选中用于繁殖下一代的个体中,对两个不同的个体的相同位置的基因进行交换,从而产生新的个体。

3.变异(Mutation)

       这是在选中的个体中,对个体中的某些基因执行异向转化。在串bi中,如果某位基因为1,产生变异时就是把它变成0;反亦反之。

4.全局最优收敛(Convergence to the global optimum)

        当最优个体的适应度达到给定的阀值,或者最优个体的适应度和群体适应度不再上升时,则算法的迭代过程收敛、算法结束。否则,用经过选择、交叉、变异所得到的新一代群体取代上一代群体,并返回到第2步即选择操作处继续循环执行。
 

3.MATLAB核心程序

clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
rng('default')

%初始spread 
mu     = 1;

%根据遗传算法进行参数的拟合
MAXGEN = 20;
NIND   = 50;
Chrom  = crtbp(NIND,1*10);
%14个变量的区间
Areas  = [0.5;
          1.5];

FieldD = [rep([10],[1,1]);Areas;rep([0;0;0;0],[1,1])];

LR     = zeros(NIND,1);
MU2    = zeros(MAXGEN,1);
gen              = 0;

for a=1:1:NIND 
    a
    LR(a)    = mu;       
    %计算对应的目标值
    errs     = func_obj(LR(a));
    E        = errs;
    J(a,1)   = E;
end

Objv  = (J+eps);
gen   = 0; 

while gen < MAXGEN;   
      gen
     
      P1 = 0.9;
      P2 = 1-P1;

      FitnV=ranking(Objv);    

      Selch=select('sus',Chrom,FitnV);    
      Selch=recombin('xovsp', Selch,P1);   
      Selch=mut( Selch,P2);   
      phen1=bs2rv(Selch,FieldD);   
      for a=1:1:NIND  
          if  gen == 1
              LR(a)    = mu;               
          else
              LR(a)    = phen1(a,1);      
          end
          
          %计算对应的目标值
          errs    = func_obj(LR(a));
          E       = errs;
          JJ(a,1) = E;
      end 
      Objvsel=(JJ+eps);    
      [Chrom,Objv]=reins(Chrom,Selch,1,1,Objv,Objvsel);   
      gen=gen+1; 

      %保存参数收敛过程和误差收敛过程以及函数值拟合结论
      MU2(gen)   = mean(LR);
      Error(gen) = mean(JJ);
      deltaf     = Error(gen);
end 
 
MU_best = MU2(end);      
MU_best

save best_mu.mat MU_best 
 
% figure;
% plot(MU2(3:end),'b-o');
% xlabel('Iteration Number');
% ylabel('mu');
% grid on;
 

 

function vis3Dskel(shapes,skels,viewpoint,flagShowCam,mode,Num,N)
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    switch lower(mode)

        case 'ellipse'

            limbRadius = 0.15;
            limbColour = 0.7*ones(1,3);
            M = repmat(limbColour,length(indices),1);
            shape(1,:)=shape(1,:)+(jj-1)*10;
            plot3(shape(1,:),shape(3,:),shape(2,:),'.');  %,控制15个点的。。可以改为plot3(shape(1,:),shape(3,:),shape(2,:),'k.','MarkerSize',50);    'R.','MarkerSize',30,关节点状态,红色30大小。
            hold on
            grid on

            for i = 1:length(indices)

                P1 = [shape(1,I(i)) shape(3,I(i)) shape(2,I(i))];
                P2 = [shape(1,J(i)) shape(3,J(i)) shape(2,J(i))];
                P  = 0.5*(P1 + P2);
                U  = [ null(P1 - P2)'; (P1 -P2)/norm(P1-P2)];    % 函数null用来求解零空间,即满足方程组A*X=0的解空间。实际上是求出解空间的一组解(基础解系)。
                                                                 % 语法:z=null(A),z的列向量为方程组的正交规范基,满足z‘ x z=I。 
                                                                 % null(A)给出的是矩阵A的null space的单位正交基。对于矩阵A,用null(A)命令就直接求出来AX=0的解
                S = eye(3); S(1,1) = 1.5*norm(P1-P2);
                l = 0.55*norm(P1-P2);
                [x,y,z] = ellipsoid(0,0,0,limbRadius,limbRadius,l,8);
                axis equal;
                xv =x(:);
                yv = y(:);
                zv = z(:);
                newXYZ = U'*[xv';yv';zv'];
                xnew = reshape(newXYZ(1,:)+P(1),size(x,1),size(x,2));
                ynew = reshape(newXYZ(2,:)+P(2),size(x,1),size(x,2));
                znew = reshape(newXYZ(3,:)+P(3),size(x,1),size(x,2));

                handle = patch(surf2patch(xnew,ynew,znew));
                set(handle,'EdgeColor',[0.3 0.3 0.3],'EdgeAlpha',0.1);
                set(handle,'FaceLighting','phong','AmbientStrength',0.6);
                set(handle,'FaceColor', skel.tree(I(i)).color); 
                set(handle,'BackfaceLighting','lit');

            end

        case 'stick'
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
end
09_051_m

4.完整算法代码文件

V

猜你喜欢

转载自blog.csdn.net/hlayumi1234567/article/details/130118124