索引超出训练模型时遇到的矩阵尺寸

时间:2013-01-24 03:18:59

标签: matlab machine-learning computer-vision object-detection

使用PASCAL开发套件训练模型时遇到问题,该套件由Felzenszwalb,D。McAllester,D。Ramaman及其团队开发的Discriminative训练的可变形零件模型系统在Matlab中实现。

目前,当我尝试使用10张正片和10张负像训练'cat'的单组分模型时,我出现了输出错误。

Error:

??? Index exceeds matrix dimensions.

Error in ==> pascal_train at 48
models{i} = train(cls, models{i}, spos{i}, neg(1:maxneg),
0, 0, 4, 3, ...

Error in ==> pascal at 28
model = pascal_train(cls, n, note);

这是pascal_train文件

function model = pascal_train(cls, n, note)

% model = pascal_train(cls, n, note)
% Train a model with 2*n components using the PASCAL dataset.
% note allows you to save a note with the trained model
% example: note = 'testing FRHOG (FRobnicated HOG)

% At every "checkpoint" in the training process we reset the 
% RNG's seed to a fixed value so that experimental results are 
% reproducible.
initrand();

if nargin < 3
  note = '';
end

globals; 
[pos, neg] = pascal_data(cls, true, VOCyear);
% split data by aspect ratio into n groups
spos = split(cls, pos, n);

cachesize = 24000;
maxneg = 200;

% train root filters using warped positives & random negatives
try
  load([cachedir cls '_lrsplit1']);
catch
  initrand();
  for i = 1:n
    % split data into two groups: left vs. right facing instances
    models{i} = initmodel(cls, spos{i}, note, 'N');
    inds = lrsplit(models{i}, spos{i}, i);
    models{i} = train(cls, models{i}, spos{i}(inds), neg, i, 1, 1, 1, ...
                      cachesize, true, 0.7, false, ['lrsplit1_' num2str(i)]);
  end
  save([cachedir cls '_lrsplit1'], 'models');
end

% train root left vs. right facing root filters using latent detections
% and hard negatives
try
  load([cachedir cls '_lrsplit2']);
catch
  initrand();
  for i = 1:n
    models{i} = lrmodel(models{i});
    models{i} = train(cls, models{i}, spos{i}, neg(1:maxneg), 0, 0, 4, 3, ...
                      cachesize, true, 0.7, false, ['lrsplit2_' num2str(i)]);
  end
  save([cachedir cls '_lrsplit2'], 'models');
end

% merge models and train using latent detections & hard negatives
try 
  load([cachedir cls '_mix']);
catch
  initrand();
  model = mergemodels(models);
 48:   model = train(cls, model, pos, neg(1:maxneg), 0, 0, 1, 5, ...
                cachesize, true, 0.7, false, 'mix');


save([cachedir cls '_mix'], 'model');
end

% add parts and update models using latent detections & hard negatives.
try 
  load([cachedir cls '_parts']);
catch
  initrand();
  for i = 1:2:2*n
    model = model_addparts(model, model.start, i, i, 8, [6 6]);
  end
  model = train(cls, model, pos, neg(1:maxneg), 0, 0, 8, 10, ...
                cachesize, true, 0.7, false, 'parts_1');
  model = train(cls, model, pos, neg, 0, 0, 1, 5, ...
                cachesize, true, 0.7, true, 'parts_2');
  save([cachedir cls '_parts'], 'model');
end

save([cachedir cls '_final'], 'model');

我突出显示了第48行发生错误的代码行。

我很确定系统正在读取正负图像以便正确训练。我不知道这个错误发生在哪里,因为matlab没有准确地指出哪个索引超出了矩阵尺寸。

我试图尽可能地整理代码,如果我在某处做错了,请指导我。

我应该从哪些建议开始看?

好的,我尝试使用display来检查pascal_train中使用的变量;     DISP(ⅰ);     DISP(大小(型号));     DISP(大小(SPOS));     DISP(长度(负));     DISP(maxneg);

所以返回的结果是;

 1

 1     1

 1     1

10

200

2 个答案:

答案 0 :(得分:1)

只需替换:

models{i} = train(cls, models{i}, spos{i}, neg(1:maxneg),

作为

models{i} = train(cls, models{i}, spos{i}, neg(1:min(length(neg),maxneg)),

在这个剧本的其他地方有几个类似的句子,你应该修改它们。

原因是你的火车样本集很小,所以列出'neg'比maxneg(200)

答案 1 :(得分:0)

我对你的问题没有答案,但这里有一个建议可能会帮助你自己调试这个问题。

在Matlab菜单中,转到Debug-&gt;如果出现错误/警告,则停止...并选择“如果出现错误则始终停止(dbstop if error)”。现在再次运行您的脚本,这次当您收到错误时,matlab将停在发生错误的行,就像您在那里放置一个断点一样。此时,您可以使用整个工作区,并且可以检查所有变量和矩阵大小,以查看哪个变量为您提供了错误。