我需要一些关于AAM的建议,例如我试图理解的编码。结果无法完成,因为发生错误,表示Matlab内存不足:
使用零时出错 内存不足。键入HELP MEMORY以获取选项。
导致错误的编码是:
Error in AAM_MakeSearchModel2D (line 6)
drdp=zeros(size(ShapeAppearanceData.Evectors,2)+4,6,length(TrainingData),length(AppearanceData.g_mean));
drpd中的实际数据是:
drdp=zeros(13,6,10,468249);
由于第4个数组很大,我可以理解的是我使用的是32位的Matlab内存不足。代码将产生的输出是2d。以下是稍后将使用drpd的代码:
drdpt=squeeze(mean(mean(drdp,3),2));
R=pinv(drdpt)';
我想问的问题是,是否可以将4D矩阵分成较小的矩阵(例如2D或3D)并进行正常的加法和除法(得到均值)。如果是,那怎么做呢?
我不能使用稀疏,因为4D drpd是一个初始化,用于获得另一个整体计算,将模型与真实的所有加权误差存储到drpd中。我复制了计算这个drpd的AAM函数的一部分:
function R=AAM_MakeSearchModel2D(ShapeAppearanceData,ShapeData,AppearanceData,TrainingData,options)
% Structure which will contain all weighted errors of model versus real
% intensities, by several offsets of the parameters
drdp=zeros(size(ShapeAppearanceData.Evectors,2)+4,6,length(TrainingData),length(AppearanceData.g_mean));
% We use the trainingdata images, to train the model. Because we want
% the background information to be included
% Loop through all training images
for i=1:length(TrainingData);
% Loop through all model parameters, bot the PCA parameters as pose
% parameters
for j = 1:size(ShapeAppearanceData.Evectors,2)+4
if(j<=size(ShapeAppearanceData.Evectors,2))
% Model parameters, offsets
de = [-0.5 -0.3 -0.1 0.1 0.3 0.5];
% First we calculate the real ShapeAppearance parameters of the
% training data set
c = ShapeAppearanceData.Evectors'*(ShapeAppearanceData.b(:,i) -ShapeAppearanceData.b_mean);
% Standard deviation form the eigenvalue
c_std = sqrt(ShapeAppearanceData.Evalues(j));
for k=1:length(de)
% Offset the ShapeAppearance parameters with a certain
% value times the std of the eigenvector
c_offset=c;
c_offset(j)=c_offset(j)+c_std *de(k);
% Transform back from ShapeAppearance parameters to Shape parameters
b_offset = ShapeAppearanceData.b_mean + ShapeAppearanceData.Evectors*c_offset;
b1_offset = b_offset(1:(length(ShapeAppearanceData.Ws)));
b1_offset= inv(ShapeAppearanceData.Ws)*b1_offset;
x = ShapeData.x_mean + ShapeData.Evectors*b1_offset;
pos(:,1)=x(1:end/2);
pos(:,2)=x(end/2+1:end);
% Transform the Shape back to real image coordinates
pos=AAM_align_data_inverse2D(pos,TrainingData(i).tform);
% Get the intensities in the real image. Use those
% intensities to get ShapeAppearance parameters, which
% are then used to get model intensities
[g, g_offset]=RealAndModel(TrainingData,i,pos, AppearanceData,ShapeAppearanceData,options,ShapeData);
% A weighted sum of difference between model an real
% intensities gives the "intensity / offset" ratio
w = exp ((-de(k)^2) / (2*c_std^2))/de(k);
drdp(j,k,i,:)=(g-g_offset)*w;
end
else
% Pose parameters offsets
j2=j-size(ShapeAppearanceData.Evectors,2);
switch(j2)
case 1 % Translation x
de = [-2 -1.2 -0.4 0.4 1.2 2]/2;
case 2 % Translation y
de = [-2 -1.2 -0.4 0.4 1.2 2]/2;
case 3 % Scaling & Rotation Sx
de = [-0.2 -.12 -0.04 0.04 0.12 0.2]/2;
case 4 % Scaling & Rotation Sy
de = [-0.2 -.12 -0.04 0.04 0.12 0.2]/2;
end
for k=1:length(de)
tform=TrainingData(i).tform;
switch(j2)
case 1 % Translation x
tform.offsetv(1)=tform.offsetv(1)+de(k);
case 2 % Translation y
tform.offsetv(2)=tform.offsetv(2)+de(k);
case 3 % Scaling & Rotation Sx
tform.offsetsx=tform.offsetsx+de(k);
case 4 % Scaling & Rotation Sy
tform.offsetsy=tform.offsetsy+de(k);
end
% From Shape tot real image coordinates, with a certain
% pose offset
pos=AAM_align_data_inverse2D(TrainingData(i).CVertices, tform);
% Get the intensities in the real image. Use those
% intensities to get ShapeAppearance parameters, which
% are then used to get model intensities
[g, g_offset]=RealAndModel(TrainingData,i,pos, AppearanceData,ShapeAppearanceData,options,ShapeData);
% A weighted sum of difference between model an real
% intensities gives the "intensity / offset" ratio
w =exp ((-de(k)^2) / (2*2^2))/de(k);
drdp(j,k,i,:)=(g-g_offset)*w;
end
end
end
end
% Combine the data to the intensity/parameter matrix,
% using a pseudo inverse
% for i=1:length(TrainingData);
% drdpt=squeeze(mean(drdp(:,:,i,:),2));
% R(:,:,i) = (drdpt * drdpt')\drdpt;
% end
% % Combine the data intensity/parameter matrix of all training datasets.
% %
% % In case of only a few images, it will be better to use a weighted mean
% % instead of the normal mean, depending on the probability of the trainingset
% R=mean(R,3);
drdpt=squeeze(mean(mean(drdp,3),2));
R=pinv(drdpt)';
%R = (drdpt * drdpt')\drdpt;
正如您在函数的最终代码中看到的那样,4D drpd然后被挤压然后再次计算成为R中的2D矩阵存储。由于“Out of Memory”问题,该函数无法初始化drpd,因为它习惯了很多空间(drdp =零(13,6,10, 468249 ))。我可以以2D或3D形式存储数据(拆分drpd部分),然后进行简单的加法和除法以获得均值,然后最终得到'R'?
谢谢你,抱歉这个长期的问题。
答案 0 :(得分:0)
如果drdp
的许多元素保持为零,我想你想要使用一些稀疏表示
Matlab的sparse
命令只能创建2D矩阵,所以这样的东西可能会起作用吗?
http://www.mathworks.com/matlabcentral/newsreader/view_thread/167669
一旦你开始工作,你可以担心计算手段 -
除了需要一些应该可行的簿记外。