Faster R-CNNのエラーについて

2 views (last 30 days)
HY
HY on 10 Sep 2020
Edited: HY on 15 Sep 2020
Faster R-CNNを学習させる際に以下のようなエラーが発生してしまいました。
optionsStage1 = trainingOptions('sgdm', ...
'MaxEpochs', 30, ...
'InitialLearnRate', 1e-5, ...
'MiniBatchSize',32,...
'VerboseFrequency',200,...
'CheckpointPath',tempdir);
・・・省略
options = [
optionsStage1
optionsStage2
optionsStage3
optionsStage4
];
%物体検出の転移学習を行う
rcnn = trainFasterRCNNObjectDetector(H3, SignNet, options, ...
'NegativeOverlapRange', [0 0.4], 'PositiveOverlapRange',[0.7 1],...
'SmallestImageDimension',700,'NumRegionsToSample',128,...
'trainingMethod','four-step');
このコードを実行後以下のエラーが発生します。
エラー: fasterRCNNObjectDetector.trainRPN (line 216)
MiniBatchSize が 1 より大きい場合、学習イメージは同じサイズでなければなりません。可変サイズのイメージで検出器を学習させるには、関数 trainingOptions を使用して'MiniBatchSize' を 1 に設定します。
エラー: trainFasterRCNNObjectDetector>iTrainFourStep (line 481)
[stage1Detector, rpn, info] = fasterRCNNObjectDetector.trainRPN(...
エラー: trainFasterRCNNObjectDetector (line 424)
[detector, info] = iTrainFourStep(trainingData, fastRCNN, rpn, options, params, executionSettings, imageInfo);
エラー: trainFasterRCNNSignDetector2 (line 54)
rcnn = trainFasterRCNNObjectDetector(H3, SignNet, options, ...
このエラーですとミニバッチサイズについて述べられていると思うのですが、学習画像サイズにばらつきがあるためミニバッチを1にしてばらばらなサイズの画像が読み込めるよう(になる?)にする必要があると思うのですが、それでは学習に時間がかかってしまいます。この場合、ミニバッチを32のまま実行する場合はどのようにするればよろしいでしょうか。
勉強不足で拙い質問となってしまい申し訳ありませんが、何かご指摘アドバイス等いただければ幸いです。
よろしくお願いいたします。

Accepted Answer

Kenta
Kenta on 15 Sep 2020
trainingDataResized = transform(trainingData,@(data)preprocessData(data,networkInputSize));
こんにちは、確かに、学習の画像のサイズにばらつきがあると大変ですね。そういう場合はtransform関数を使って、画像のサイズとバウンディングボックスの位置や大きさを自動的に変換するのがよさそうです。
例えば、上のように、trainingDataをtransformで変換します。ここで、下のようにpreprocessDataという補助関数を定義して、下のように書いて、コードの末尾や、おなじパスに保存しておいておきます。例えばこのページが参考になりました
function data = preprocessData(data, targetSize)
for ii = 1:size(data,1)
I = data{ii,1};
imgSize = size(I);
bboxes = data{ii,2};
I = im2single(imresize(I,targetSize(1:2)));
scale = targetSize(1:2)./imgSize(1:2);
bboxes = bboxresize(round(bboxes),scale);
data(count,1:2) = {I, bboxes};
end
end
  1 Comment
HY
HY on 15 Sep 2020
Edited: HY on 15 Sep 2020
kenta様
回答いただき誠にありがとうございます。てっきり、SmallestImageDimention'700'が入力画像を700×700にリサイズするものかと思ってました....
アップデート前の2017verではこの設定で実行できていたので、アップデート後同じようにできない理由がわからなく困っていましたが、おかげさまで解決できそうです。
大変ありがとうございました。

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!