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

조회 수: 7 (최근 30일)
- Tei
- Tei 2017년 10월 26일
댓글: michio 2017년 10월 27일
以下のプログラムを用いて 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])
というエラーが吐き出されていまい実行できません。どのようにプログラム及び学習データの改善を行えばよいのでしょうか。
どうかよろしくお願いします。

채택된 답변

michio
michio 2017년 10월 26일
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
- Tei
- Tei 2017년 10월 27일
편집: - Tei 2017년 10월 27일
MATLABのバージョンはR2017aです。
また、Training Image Labeler を用いて作成したmatファイル内のTableに負の値を示すもの及び認識対象が存在しない画像は見当たりませんでした。
michio
michio 2017년 10월 27일
そうなるとエラーメッセージだけからの判断ではなかなか難しいですね。同じエラーが再現できるデータがあれば問題の検証も容易なのですが、流石にデータをここにアップロードして頂くわけにもいきませんし。
原因の検証方法ですが・・私であれば、まず学習画像数を少なくして実行できるかどうかを試し、問題がある画像の特定を試みます。エラーメッセージに
"11 番目 行に適用した際に"
とあるので、10枚だけで実行するか、11番目の画像を削除してみるなどなど。
もし保守サービス有効なアカデミックライセンスまたはコマーシャルライセンスをご使用中でしたら、弊社技術サポート窓口(下記)のご利用もどうぞご検討ください。こちらでしたら実際にエラーが再現するデータを送っていただいたりなども可能かと。 https://jp.mathworks.com/support/contact_us/?s_tid=sp_ban_cs

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 モデル化에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!