セマンティックセグメ​ンテーションに使用す​るデータセットについ​て

14 views (last 30 days)
koki mori
koki mori on 30 May 2020
Commented: Kenta on 21 Jun 2020
2つのデータセットを組み合わせたセマンティックセグメンテーションについて質問があります。
「深層学習を使用したセマンティックセグメンテーション」
において使用されているCamVidデータセットからランダムに200枚を選択、そして貴社のアドオンアプリのグランドトゥルースラベラーを用いて作成した200枚程度のオリジナル画像を合わせた、合計400枚程のデータでセマンティックセグメンテーションを行いました。
グランドトゥルースラベラーで作成したオリジナルピクセルラベルイメージデータはグレースケールになっており、ビット深さが8のチャンネル数が1になっています。
pixelLabelDatastoreを使用してピクセルラベルイメージデータを読み込む際、そのピクセルラベルイメージデータのビット深さ(チャンネル数)が共通でないとエラーが出てしまう為、作成したピクセルラベルイメージデータのビット深さを、CamVidデータセットのピクセルラベルイメージと同様に24ビット(3チャンネル)に再作成しました。以下がその時使用したコードです。
rootFile = fullfile('C:\','Users','yohu-','OneDrive','デスクトップ');
imDir = fullfile(rootFile,'imageLabel');
imds = imageDatastore(imDir);%グレースケール画像データストア
for v = 1:1:173 %画像枚数
Y = readimage(imds,v); %イメージ読み込み
Y2 = imresize(Y,[720,960]);
[G] = imsplit(Y2); %グレースケールのピクセル値を取得
Y2 = cat(3,G,G,G); %ピクセル値を3次元行列として連結
s = num2str(v); %インクリメント変数Vを文字列に変換
str = [s,'.png']; %変換した文字列と拡張子文字列を連結
newstr = join(str);
imwrite(Y2,newstr); %指定した文字列のイメージファイルの保存
end
そして、学習時に参照させるクラスをCamVidデータセットとオリジナルデータセットで分けたかったので、CamVidデータセットからはSky,Pole,Pavement,Tree,SignSymbol,Fence,Car,Pedestrian,Bicyclistクラスを参照し、グランドトゥルースラベラーで作成したデータセットからBuilding,Roadクラスを参照するようにしました。
参照方法は「深層学習を使用したセマンティックセグメンテーション」で用いられた方法と同様に、ピクセルラベルIDをRGBカラー値に対応させた方法を行いました。
以下がそのピクセルラベルIDです。
function labelIDs = camvidPixelLabelIDs()
labelIDs = { ...
% "Sky"
[
128 128 128; ... % "Sky"
]
% "Building"
[
002 002 002;
]
% "Pole"
[
192 192 128; ... % "Column_Pole"
000 000 064; ... % "TrafficCone"
]
% Road
[
004 004 004;
]
% "Pavement"
[
000 000 192; ... % "Sidewalk"
064 192 128; ... % "ParkingBlock"
128 128 192; ... % "RoadShoulder"
]
% "Tree"
[
128 128 000; ... % "Tree"
192 192 000; ... % "VegetationMisc"
]
% "SignSymbol"
[
192 128 128; ... % "SignSymbol"
128 128 064; ... % "Misc_Text"
000 064 064; ... % "TrafficLight"
]
% "Fence"
[
064 064 128; ... % "Fence"
]
% "Car"
[
064 000 128; ... % "Car"
064 128 192; ... % "SUVPickupTruck"
192 128 192; ... % "Truck_Bus"
192 064 128; ... % "Train"
128 064 064; ... % "OtherMoving"
]
% "Pedestrian"
[
064 064 000; ... % "Pedestrian"
192 128 064; ... % "Child"
064 000 192; ... % "CartLuggagePram"
064 128 064; ... % "Animal"
]
% "Bicyclist"
[
000 128 192; ... % "Bicyclist"
192 000 192; ... % "MotorcycleScooter"
]
};
end
グランドトゥルースラベラーで作成した時、ピクセルラベルイメージのBuildingとRoadのグレースケール値がそれぞれ2と4だったので、それに合わせてピクセルラベルでも参照できるようにBuildingとRoadクラスだけデフォルトから変更しています。
上記URL「深層学習を使用したセマンティックセグメンテーション」のソースコードとほぼ同様に作成していたので、このピクセルラベル参照設定と、imageDatastoreとpixelDatastoreの参照先しかソースコードには変更を加えていません。
しかし、学習を実行してみると精度が45%程度からほぼ横ばいに停滞してしまい、学習精度が上がりませんでした。
ピクセルラベルの参照方法やデータストアのソート順に問題があるのでしょうか。
そもそもピクセルラベルイメージ仕様が異なるデータを合わせた学習自体が不可能なのでしょうか。
ご教授お願い致します。

Accepted Answer

Kenta
Kenta on 18 Jun 2020
こんにちは、セマンティックセグメンテーションはいろいろと手続きが必要で、複雑ですよね。さっと思い当たるのは、1)スパイクが結構多いので、SGDなら初期学習率、ADAMならベースの学習率が大きいので小さくしてみてはどうか?
2)おそらくクラス間で重みづけをしているようで、クラス間のバランス(cost sensitive learningのようなもの)を解除して、均一な重みづけで学習してはどうか?
3)RGBラベルでやっているようですが、そこで何らかのエラーがあるのかもしれません。ラベルIDでも可能なのでそちらでやってみてもいいかもしれません。わかりにくいかもしれませんが、一応ここにラベルIDでやったコードを公開しています。参考になればうれしいです。
  2 Comments
koki mori
koki mori on 21 Jun 2020
ご返信遅くなってしまい申し訳ありません。
上記の解決策を行ってみたのですが、精度が45%前後から動くことはありませんでした。
一度、オリジナルデータセットとCamVidデータセットのピクセルラベルを統一して学習を行ってみたいと思います。
ありがとうございました。
Kenta
Kenta on 21 Jun 2020
ご報告ありがとうございます。精度が上昇への取り組み、お疲れ様でした。また10枚ほどでも添付いただけたらこちらでも見ておきます。IDの割り当てなど予期せぬ間違いがあるのかもしれません。

Sign in to comment.

More Answers (0)

Products


Release

R2019a

Community Treasure Hunt

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

Start Hunting!