YOLOv2の検証におけるエラーについて
Show older comments
YOLOv2 深層学習を使用したオブジェクトの検出の例にしたがって、検出器を学習させました。しかし、テストデータで検証を行ったところ以下のようなエラーが発生してしまいました。
エラー内容はLABELが空になっているようなことが書いてあるので、いろいろと確認しましたが、原因がわかりませんでした。
不勉強なため荒い質問となってしまって申し訳ありませんが、指摘、アドバイスいただければ幸いです。
よろしくお願いいたします。
これはコードの全体です。サポート関数は省略していますが、例にあるものと同じです。
%学習済みのCNNをYOLOに変換するとともに、YOLOの学習も行う
load('H3.mat');
data=load('H3.mat');%ラベリングした学習画像
SignDataset = data.H3;
SignDataset(1:4,:)
%%
rng(0);
shuffledIndices = randperm(height(SignDataset));%学習データをシャッフル
idx = floor(0.9 * length(shuffledIndices) );%学習用に-割りランダム選択した学習データ
trainingDataTbl = SignDataset(shuffledIndices(1:idx),:);
testDataTbl = SignDataset(shuffledIndices(idx+1:end),:);
%%
%それぞれデータをデータストアへ移しておく
imdsTrain = imageDatastore(trainingDataTbl{:,'imageFilename'});
bldsTrain = boxLabelDatastore(trainingDataTbl(:,2:end));%2:endはクラス数が22にあるため
imdsTest = imageDatastore(testDataTbl{:,'imageFilename'});
bldsTest = boxLabelDatastore(testDataTbl(:,2:end));
trainingData = combine(imdsTrain,bldsTrain);
testData = combine(imdsTest,bldsTest);
%%
%実際にラベルされた画像を視覚的に確認する
I = read(trainingData);
I = data{1};
bbox = data{2};
annotatedImage = insertShape(I,'Rectangle',bbox);
annotatedImage = imresize(annotatedImage,2);
figure
imshow(annotatedImage)
%%
inputSize = [224 224 3];%入力データサイズ指定
numClasses = 22;%クラス数指定
trainingDataForEstimation = transform(trainingData,@(data)preprocessData(data,inputSize));%学習データを前処理しインプットサイズに変換後、アンカーボックスの推定を行う
numAnchors = 7;%値を変化させ、meanIoUの値が大きいものを得らぶ、あまり大きすぎても処理に時間がかかる
%[anchorBoxes, meanIoU] = estimateAnchorBoxes(trainingDataForEstimation, numAnchors)
%%
%load('Resnet18v1');
%addpath('Reanet18v1')
featureExtractionNetwork = Resnet18v1;%事前学習済みのCNNを選択
%%
featureLayer = 'res5b_relu';%最後の特徴層を選択しその層以降をYOLOに変換する
lgraph = yolov2Layers(inputSize,numClasses,anchorBoxes,featureExtractionNetwork,featureLayer);
%%
%データの拡張をし、精度を高める
augmentedTrainingData = transform(trainingData,@augmentData);
augmentedData = cell(4,1);
for k = 1:4
data = read(augmentedTrainingData);
augmentedData{k} = insertShape(data{1},'Rectangle',data{2});
reset(augmentedTrainingData);
end
figure
montage(augmentedData,'BorderSize',10)
%%
%前処理されたデータを学習用に変換し、表示する
preprocessedTrainingData = transform(augmentedTrainingData,@(data)preprocessData(data,inputSize));
data = read(preprocessedTrainingData);
I = data{1};
bbox = data{2};
annotatedImage = insertShape(I,'Rectangle',bbox);
annotatedImage = imresize(annotatedImage,2);
figure imshow(annotatedImage)
%yoloを学習させる
options = trainingOptions('sgdm', ...
'MiniBatchSize', 16, ....
'InitialLearnRate',1e-3, ...
'MaxEpochs',20,...
'CheckpointPath', tempdir, ...
'Shuffle','never');
[detector,info] = trainYOLOv2ObjectDetector(preprocessedTrainingData,lgraph,options);
%検証
I = imread(testDataTbl.imageFilename{1});
I = imresize(I,inputSize(1:2));
[bboxes,scores] = detect(detector,I);
I = insertObjectAnnotation(I,'rectangle',bboxes,scores);
figure
imshow(I)
検証を実行すると以下のエラーが起きてしまいます。
エラー: insertObjectAnnotation
LABELは空以外にする必要があります。
エラー: insertObjectAnnotation>checkLabel (line 290)
validateattributes(label, {'numeric'}, ...
エラー: insertObjectAnnotation>validateAndParseInputs (line 180)
checkLabel(label);
エラー: insertObjectAnnotation (line 123)
validateAndParseInputs(I, shape, position, label, varargin{:});
エラー: trainYOLOv2_2 (line 82)
I = insertObjectAnnotation(I,'rectangle',bboxes,scores);
二つ気になる点として関係あるかわかりませんが、ワークスペースにあるimdsTestを確認するとLabels 0×0cellになっています。
また、ワークスペースにあるbldsTrain選択しLabelDataを確認すると、以下の写真のようにところどこと1列目が値ではなく〇×〇doubleのような形になっています。

よろしくお願いいたします。
Accepted Answer
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!