imageDataA​ugmenterを使​わないData Augmentationについて

CNNを使って画像の分類を行っています.
分類精度を上げるためにData Augmentationを行うことを考えています.
そこでimageDataAugmenterを使用してData Augmentationを行おうと考えましたが,
出来ることが限られているため,この関数を使わずにData Augmentationをしたいです.
現在は,transformを使ってData Augmentationを行おうと試みましたが,ImageDatastoreがTransformedDatastoreに変換されると学習ができないようです.
解決策がありましたらご回答の程よろしくお願い致します.

3 Comments

こんにちは。ご質問に関して聞きたい点があるので質問させてください。
「出来ることが限られているため」とありますが、具体的にはどのような操作を画像に施したいのでしょうか。画像どうしを張り合わせる、などそのような類でしょうか。教えていただけると幸いです。
こんにちは. 回答ありがとうございます. 具体的にはノイズ付与とマスクの2つをしようと考えてます.
こちら、マスクをしてaugmentationをするコードです。参考になれば幸いです。

Sign in to comment.

 Accepted Answer

function I_noise = img_aug(filename)
% load images
I = imread(filename);
I_noise = imnoise(I,'salt & pepper',0.02);
x = randi(size(I,1),1);
y = randi(size(I,2),1);
h = randi(size(I,1)-x,1);
w = randi(size(I,2)-y,1);
I_noise(x:x+h,y:y+w,:)=128;
end
ご返信ありがとうございます。確かに、マスクやカスタムした形のノイズは、
イメージストアでは直接的にはできないかもしれません。ただ、上のように、補助関数を同じパスに保存したうえで、
下のコード例を実行すると、画像のように、ノイズおよびマスクの入った画像が取得できます。
上では、まず、ノイズを入れる。そして、マスクの左上のx、y座標をランダムに発生させ、さらに、縦横の長さも画像に入る範囲でランダムに決定します。そのルールに従って、イメージデータストアから読みだすように定義すると、下のような、マスクとノイズがある画像を生成、訓練データとして入力することができます。
ノイズやマスクの設定は、質問者様の設定によると思うので、適宜変更してご使用いただければと思います。
よろしくお願いいたします。
imds = imageDatastore({'street1.jpg','street2.jpg','peppers.png','corn.tif'});
imds.ReadFcn = @(filename)img_aug(filename);
allimgs = readall(imds);
montage(allimgs)
imgs.png

4 Comments

返信ありがとうございます.
上記の方法でData Augmentationができました.
ありがとうございます.
ただ一点お聞きしたいことがあります.
Data Augmentationをする前の画像とした後の画像を同時に訓練させたいのですが,その場合はどうすればいいのでしょうか.
Data Augmentationをする前とした後のImageDatastoreを結合すればいいと考えたのですが,うまくいかないです.
ご回答の程よろしくお願い致します.
こんにちは、よかったです。
2通りあって、
1)functionの中身に0/1の乱数とif文を加えて、if 0ならマスク&ノイズ、1なら何もしないつまりI_noise=I
とすればよさそうです
2)うえのデータストアから関数readallで読み取ってしまって保存する。それをもとの手持ちの画像のファイルに保存して、訓練データとしてそのファイルを読み取る
1)では、だいたいマスクと加工なし画像が1:1で生成されますが、完全に同じ割合ではなさそうです。ただおそらく大きな問題にはならないと思います。比率を変えたければ乱数を0, 1, 2で0のときのみマスクとすれば、1:2の比率で加工した画像を混ぜこめます。
2)画像が確認できるので直感的にはわかりやすいです。ただ、交差検証をしたい、という場合は1)のほうがよさそうです。
最後に一点気になったことがあるのですが、ノイズを加えて学習させるとよい、とは聞いたことがあるのですが、マスクをするとよいというのは初めて聞きました。ただ、マスクをして学習させるのも効果がありそうです。私の不勉強で申し訳ないのですが、なにかそういう報告があったりするものなのでしょうか。
回答ありがとうございます.
とりあえず2番目の方法で実装できました.ありがとうございます.
Data Augmentationの手法の一つとして部分マスクというものがあります.
google scholarで部分マスクを行った論文がいくつかありました.
教えていただきありがとうございます。

Sign in to comment.

More Answers (0)

Categories

Asked:

on 18 Oct 2019

Commented:

on 26 May 2020

Community Treasure Hunt

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

Start Hunting!