MATLAB Answers

YOLOv2の検証におけるエラーについて

조회 수: 4(최근 30일)
HY
HY 10 Jul 2020
댓글: Kenta 13 Jul 2020
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のような形になっています。
よろしくお願いいたします。

채택된 답변

Kenta
Kenta 10 Jul 2020
こんにちは、エラーがでたときの、bboxesの値はどうなっていますか?推論したときに対象画像中に対象物体が見つからずbboxの値が空になっているのではないでしょうか。
if size(bbox,1)>0
% code
end
などとすればひとまずその場合はinsert...関数の処理を飛ばせるので、そのエラーは回避できます。その後の兼ね合いがうまくいかないかもしれませんが。
  댓글 수: 4
Kenta
Kenta 13 Jul 2020
教えてもらいありがとうございます。なるほど、bboxが空でない上でのコードなので、そこでエラーが出たのだと思います。また全体的に見直して、エラーが出るようであれば、また質問してください。

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

추가 답변(0개)

Community Treasure Hunt

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

Start Hunting!