我在使用Felzenszwalb、D. McAllester、D. Ramaman及其团队开发的基于PASCAL开发工具包的判别式训练可变形部件模型系统进行模型训练时遇到了问题,该系统是用Matlab实现的。
当我尝试使用10张正样本和10张负样本图像训练一个“猫”的单组件模型时,出现了以下错误输出。
Error:??? Index exceeds matrix dimensions.Error in ==> pascal_train at 48models{i} = train(cls, models{i}, spos{i}, neg(1:maxneg),0, 0, 4, 3, ...Error in ==> pascal at 28model = pascal_train(cls, n, note);
这是pascal_train文件的内容
function model = pascal_train(cls, n, note)% model = pascal_train(cls, n, note)% 使用PASCAL数据集训练一个具有2*n组件的模型。% note允许您保存训练模型的注释% 示例:note = 'testing FRHOG (FRobnicated HOG)% 在训练过程中的每个“检查点”,我们将RNG的种子重置为固定值,以便实验结果可重现。initrand();if nargin < 3 note = '';endglobals; [pos, neg] = pascal_data(cls, true, VOCyear);% 根据纵横比将数据分成n组spos = split(cls, pos, n);cachesize = 24000;maxneg = 200;% 使用变形的正样本和随机负样本训练根过滤器try load([cachedir cls '_lrsplit1']);catch initrand(); for i = 1:n % 将数据分为两组:左向和右向实例 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% 使用潜在检测和难负样本训练根左向和右向根过滤器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% 合并模型并使用潜在检测和难负样本进行训练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% 添加部件并使用潜在检测和难负样本更新模型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');endsave([cachedir cls '_final'], 'model');
我已经标出了错误发生的代码行,在第48行。
我非常确定系统正确读取了用于训练的正负样本图像。我不知道这个错误发生在哪里,因为Matlab没有准确指出哪个索引超出了矩阵维度。
我已经尽可能整理了代码,如果我哪里做错了,请指导我。
有什么建议我应该从哪里开始查找问题吗?
好的,我尝试使用display来检查pascal_train中使用的变量;disp(i); disp(size(models)); disp(size(spos)); disp(length(neg)); disp(maxneg);
返回的结果是;
1 1 1 1 110
200
回答:
我没有回答你的问题,但这里有一个建议,可能会帮助你自己调试这个问题。
在Matlab菜单中,转到调试->如果发生错误/警告时停止…并选择“总是停止如果发生错误(dbstop if error)”。现在再次运行你的脚本,这次当你遇到错误时,Matlab会像你在错误发生的行设置了断点一样停止。在那时,你可以使用整个工作空间,并检查所有变量和矩阵大小,以查看哪个变量导致了你看到的错误。