MATLAB Answers

RGB 3 成分ピクセルとスカラー ピクセル

3 views (last 30 days)
Kodai Sato
Kodai Sato on 3 Jan 2020
Edited: koki mori on 21 Jun 2020
深層学習を使用したセマンティック セグメンテーションをもとに自分で用意したデータセットでセマンティックセグメンテーションを行おうとしたところ,以下のようなエラーが発生しました.解決法を教えてください.
エラー: trainingOptions (line 285)
'ValidationData' の値は無効です。 ピクセル ラベル イメージは、RGB 3 成分ピクセル ラベル ID ではなく、スカラー ピクセル ラベル ID をもっています。
  12 Comments
Kodai Sato
Kodai Sato on 15 Jan 2020
上のURLの例に添付されているサポート関数でリサイズするとスカラー ピクセル ラベル IDになるようです

Sign in to comment.

Accepted Answer

Kenta
Kenta on 20 Jan 2020
Edited: Kenta on 20 Jan 2020
こんにちは、訓練時のvalidationデータですが、RGB 3 成分ピクセル ラベル IDは受け付けますが、少なくとも私の試したデータでは、スカラーラベルIDは入らないようです。上のURLの補助関数自体ではなく、その中の操作の過程で、RGBラベルがスカラーラベルに変換されます。それをRGBラベルのままにすると動きました。trainNetwork関数も含めて実行できました。リサイズの補助関数とi_learningを添付します。i_learningのほうでは、imageSize=[360 480 3];と変更しただけです。
ただ、扱うデータなど、私の環境と微妙にちがうので、軽微なエラーを返すかもしれません。練習段階として、実行したいのであれば、ひとまず、optionsの'ValidationData',pximdsVal,...は削除して、全体感を見るほうが効率はよいかもしれません。
ちなみに、'ValidationData',pximdsVal,とすれば、検証データを入れ込めるというコードはどこを参考にしましたか?上のURLではvalidationdataは設定していなかったので、どこのページに書いてあったか教えてもらえますか?
while count<numel(pxds.Files)+1
% Read the pixel data.
% [C,info] = read(pxds);
C=imread(pxds.Files{count});
% Convert from categorical to uint8.
%L = uint8(C); %2018
% L = uint8(C{1}); %2019
L = uint8(C);
% Resize the data. Use 'nearest' interpolation to
% preserve label IDs.
L = imresize(L,[360 480],'nearest');
%L = imresize(L,[180 240],'nearest');
% Write the data to disk.
% [~, filename, ext] = fileparts(info.Filename);
name=pxds.Files{count};
name1=extractBefore(name,'label');
name2=extractAfter(name,'label');
name3=strcat(name1,'labelResized',name2);
imwrite(L,name3)
count=count+1;
end
  2 Comments
Kenta
Kenta on 20 Jan 2020
リンクのほう、教えていただきありがとうございます。私の見ていたコードは同様の例でしたが、その記述はありませんでした。

Sign in to comment.

More Answers (1)

koki mori
koki mori on 21 Jun 2020
Edited: koki mori on 21 Jun 2020
はじめまして、もし解決していたら申し訳ありません。
自分もセマンティックセグメンテーションのラベル付き画像を自作していてここで詰まっていたのでよければ参考にしてください。
原因としては他の回答者さんにもある通り、スカラーピクセル値でやっているのが問題でした。なのでグレースケール(スカラー値)を無理やりRGBスケールにしてあげることで解決しました。
以下にそのソースコードを載せておきますね。
rootFile = fullfile('C:\','Users','自分のユーザー名','OneDrive','デスクトップ');%画像データ保存場所
imDir = fullfile(rootFile,'imageLabel');%画像ディレクトリ
imds = imageDatastore(imDir);%グレースケール画像データストア(スカラー値画像)
for v = 1:1:173 %画像枚数
Y = readimage(imds,v); %イメージ読み込み
[G] = imsplit(Y); %グレースケールのピクセル値を取得
Y = cat(3,G,G,G); %ピクセル値を3次元行列として連結
s = num2str(v); %インクリメント変数Vを文字列に変換
str = [s,'.png']; %変換した文字列と拡張子文字列を連結
newstr = join(str);
imwrite(Y,newstr); %指定した文字列のイメージファイルの保存
end
上記のコードではRGBスケールに直した後、その枚数目の名前になるようになっているので注意してください。

Community Treasure Hunt

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

Start Hunting!