1

Matlabに実装されているFelzenszwalb、D。McAllester、D。Ramamanと彼のチームによって開発された、識別的にトレーニングされた変形可能パーツモデルシステムでPASCAL開発キットを使用してモデルをトレーニングすることに問題があります。

現在、10枚のポジティブ画像と10枚のネガティブ画像を使用して「cat」の1コンポーネントモデルをトレーニングしようとすると、この出力エラーが発生します。

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は、どのインデックスがマトリックスの次元を超えているかを正確に示していないため、このエラーがどこで発生しているのかわかりません。

私はコードを可能な限り整理しようとしましたが、どこかで間違ったことをした場合は私を導きます。

私が見始めるべき提案はありますか?

わかりました。pascal_trainで使用されている変数を確認するためにdisplayを使用してみました。disp(i); disp(size(models)); disp(size(spos)); disp(length(neg)); disp(maxneg);

したがって、返された結果は次のとおりです。

 1

 1     1

 1     1

10

200

4

2 に答える 2

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)

于 2013-04-17T03:53:56.987 に答える
0

私はあなたの質問に対する答えを持っていませんが、ここにあなたがこの問題を自分でデバッグするのを助けるかもしれない提案があります。

Matlabメニューで、[デバッグ]-> [エラー/警告の場合は停止...]に移動し、[エラーの場合は常に停止(エラーの場合はdbstop)]を選択します。ここでスクリプトを再度実行すると、今回エラーが発生すると、ブレークポイントを設定したかのように、エラーが発生した行でmatlabが停止します。その時点で、ワークスペース全体を自由に使用でき、すべての変数と行列サイズをチェックして、表示されているエラーが発生している変数を確認できます。

于 2013-01-24T03:57:04.733 に答える