転移学習におけるR-CNNのエラーについて

1 view (last 30 days)
- Tei
- Tei on 26 Oct 2017
Commented: michio on 27 Oct 2017
以下のプログラムを用いて alexnetを転移学習させた後、それのレイヤーを用いてRCNNを利用しようとしています。
転移学習のための学習データとして、マグカップ、マウス、キーボード、扇風機の画像を用意しています。 またRCNNのためにTraining Image Labelerを用いてそれぞれ四種類がラベル付けされたmatファイルも作成済みです。
%%Load a pre-trained, deep, convolutional network
net = alexnet;
layersfirst = net.Layers
%%Delete Full Connected Layer
layersTransfer = layersfirst(1:end-3)
%%Set up our training data
digitDataPath = fullfile(matlabroot,'ImageData','myImages');
allImages = imageDatastore(digitDataPath, 'IncludeSubfolders', true, 'LabelSource', 'foldernames');
trainingImages= allImages;
numClasses = numel(categories(trainingImages.Labels));
%%layers
layers = [layersTransfer
fullyConnectedLayer(numClasses,'WeightLearnRateFactor',20,'BiasLearnRateFactor',20)
softmaxLayer
classificationLayer]
%%Pre-train the Network
opts = trainingOptions('sgdm', 'InitialLearnRate', 0.001, 'MaxEpochs', 5, 'MiniBatchSize', 32);
myNet = trainNetwork(trainingImages, layers, opts);
%%RCNN
load ('TESTCHANGE1.mat')
rcnn = trainRCNNObjectDetector(TESTCHANGE,layers,opts,'NegativeOverlapRange',[0 0.3])
%%TEST
imDir = fullfile(matlabroot,'ImageData','TESTCHANGE');
addpath(imDir);
img = imread('Test.jpg');
[bbox,score,label]=detect(rcnnfinal,img,'MiniBatchSize',32);
[score,idx]=max(score);
bbox = bbox(idx,:);
annotation = sprintf('%s:(Confidence = %f)',label(idx),score)
detectedImg = insertObjectAnnotation(img,'rectangle',bbox,annotation);
figure
imshow(detectedImg)
rmpath(imDir);
しかし、いざプログラムを実行すようとすると
エラー: vision.internal.cnn.validation.checkNetworkClassificationLayer (line 6) ネットワーク分類層の数値オブジェクト クラスは、"Background" クラス用として入力 trainingData で定義されたクラスの数に 1 を加えた数と等しくなければなりません。
エラー: vision.internal.rcnn.parseInputs (line 35) vision.internal.cnn.validation.checkNetworkClassificationLayer(network, trainingData);
エラー: trainRCNNObjectDetector (line 185) params = vision.internal.rcnn.parseInputs(trainingData, network, options, mfilename, varargin{:});
エラー: RCNNCHANGE (line 33) rcnn = trainRCNNObjectDetector(TESTCHANGE,layers,opts,'NegativeOverlapRange',[0 0.3])
というエラーが吐き出されていまい実行できません。どのようにプログラム及び学習データの改善を行えばよいのでしょうか。
どうかよろしくお願いします。

Accepted Answer

michio
michio on 26 Oct 2017
trainRCNNObjectDetector を使用してネットワークを学習させるには、検出対象に加えて "背景"も分類できるネットワークを用意する必要があります。エラーメッセージの「クラスの数に 1 を加えた数」は背景の分です。
ところで、alexnetをそのままではなく、一旦CNNでの分類問題としてファインチューニングされる理由は何かありますか? 例えば
net = alexnet;
layersfirst = net.Layers
layersTransfer = layersfirst(1:end-3);
layers = [layersTransfer
fullyConnectedLayer(numClasses+1,'WeightLearnRateFactor',20,'BiasLearnRateFactor',20)
softmaxLayer
classificationLayer]
を trainRCNNObjectDetector で学習させることもできるかと思います。
  4 Comments
- Tei
- Tei on 27 Oct 2017
Edited: - Tei on 27 Oct 2017
MATLABのバージョンはR2017aです。
また、Training Image Labeler を用いて作成したmatファイル内のTableに負の値を示すもの及び認識対象が存在しない画像は見当たりませんでした。
michio
michio on 27 Oct 2017
そうなるとエラーメッセージだけからの判断ではなかなか難しいですね。同じエラーが再現できるデータがあれば問題の検証も容易なのですが、流石にデータをここにアップロードして頂くわけにもいきませんし。
原因の検証方法ですが・・私であれば、まず学習画像数を少なくして実行できるかどうかを試し、問題がある画像の特定を試みます。エラーメッセージに
"11 番目 行に適用した際に"
とあるので、10枚だけで実行するか、11番目の画像を削除してみるなどなど。
もし保守サービス有効なアカデミックライセンスまたはコマーシャルライセンスをご使用中でしたら、弊社技術サポート窓口(下記)のご利用もどうぞご検討ください。こちらでしたら実際にエラーが再現するデータを送っていただいたりなども可能かと。 https://jp.mathworks.com/support/contact_us/?s_tid=sp_ban_cs

Sign in to comment.

More Answers (0)

Categories

Find more on モデル化 in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!