質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.36%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1194閲覧

CNNを用いた2値分類でのデータ水増しについて

---stax---

総合スコア148

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/03/04 07:54

編集2019/03/04 08:01

現在CNNを用いて画像の分類について学習しています。
使用しているフレームワークはkerasです。

データ数はかなり少なく、正常画像100枚、異常画像100枚の計200枚です。
訓練データ:140枚(正常:70枚、異常:70枚)
検証データ:40枚(正常:20枚、異常:20枚)
テストデータ:20枚(正常:10枚、異常:10枚)
上記のようにデータの割り振りを行いました。
評価指標は現段階では正解率のみを確認しています。

①画像の水増しなどをせず最低限の前処理のみで作成したモデルと
②ドロップアウト層の追加や画像の水増しを行ったモデルで比較したのですが、後者のモデルの方が大幅に悪くなってしまいました(①のモデルも良くありませんが・・・)

①のモデル
①のモデル
②のモデル
②のモデル

②のモデルの水増しに関しては以下のようにweb上の記事などを参考にして設定しました。

python

1train_datagen = ImageDataGenerator( 2 rescale=1./255, 3 rotation_range=40, #画像をランダムに回転させる 4 width_shift_range=0.2, #画像を水平または垂直にランダムに水平移動させる範囲 5 height_shift_range=0.2, 6 shear_range=0.2, #等積変形をランダムに適用 7 zoom_range=0.2, #図形の内側をランダムにズーム 8 horizontal_flip=True, #画像の半分を水平方向にランダムに反転 9)

今回使用した画像は装置内のカメラで定点撮影されたものになります
ここで一つ疑問なのですが、定点撮影された画像に対して回転などを加えてしまうと品質の悪いデータが作られてしまっているのかなと感じます。
データが少ないなど理由はいくつかあると思うのですが精度が落ちている原因は上記のような水増しが影響しているのでしょうか?

まだ知識が浅くいくつかパラメータを指定してみたという状態なのですが、画像を水増しする項目の選定方法や、各パラメータの値の決め方など、一般的な知識やアプローチの考え方を教えて頂きたいです。

漠然としすぎているかと思いますがどのように進めていくか行き詰ってしまい苦戦しています。
初歩的な質問ですがアドバイス宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2019/03/04 08:07

実際のところどういうタスクなんでしょうか? 定点撮影で検出したいものが常に同じ位置に来るとか(製品検査みたいな感じですかね)なら、水増しして良い結果になるとは考えづらい訳ですが、その辺によって変わってきます。
---stax---

2019/03/04 12:52

今回使用している画像は製品検査工程で撮影したもので、製品に付着する異物を検出出来ればと考えています。検出物(製品)自体は常に位置が決まっているのですが、異物は撮影範囲内のどこに付着するかはわからないのと、変わるとすれば微量ですが輝度とかになるのかなと考えています。なので反転したり回転させたりは元のデータと意味合いが変わってしまう気がするけど効果が出るのかな?という部分で疑問に感じています。
guest

回答1

0

ベストアンサー

回転や平行移動をすると、画素がないピクセルが出てきてそれをなんらかの方法で補完することになるので、本来画像にはなかった画素が出てきてしまうんですよね。

なので、水増しするパラメータは

  • brightness_range
  • horizontal_flip

ぐらいにしておいたほうがいいのではないでしょうか。

Keras - Keras の ImageDataGenerator を使って学習画像を増やす

投稿2019/03/04 08:08

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

---stax---

2019/03/04 13:38

回答ありがとうございます。 ある程度は実際撮影される環境と近しいものをイメージして水増しすべきという感じでしょうか。 またkerasのドキュメントを読んでも確認する方法が分からなかったのですが、例えば訓練データが100枚あったとして、質問欄に記載したコードのようにImageDataGeneratorでパラメータを指定して作成したジェネレータを、flow_from_directoryに渡してデータを水増しした場合、結果100枚→何枚のデータが作成されるのでしょうか?
tiitoi

2019/03/04 13:52 編集

パラメータに従ってリアルタイムに変換するので、予め n 倍に増やすというわけではないです。 例えば、全データが9枚でバッチサイズが3だとしたら、 ImageDataGenerator を使わない場合は、3枚で1バッチとしてネットワークに流しますよね。 ImageDataGenerator を使う場合は、3枚取り出したあと、パラメータに従いランダムな変換を行い、1バッチ作成します。 生成された画像は flow_from_directory() の引数 save_to_dir に出力先のディレクトリを指定しておくと、実際どんな画像がネットワークに流れたのか確認できます。
---stax---

2019/03/04 14:17

なるほど。。。 ではImageDataGenerator を使う場合は元の訓練データとしての状態は維持されない(すべて変換された画像になる)ということでしょうか。 水増しというのは画像の枚数を増やすことだとばかり理解していたのですが、そうではなく様々な形状を学習させることで表現力を上げる(ロバスト性?)ということが本来の目的ということでしょうか? また重ねて質問して申し訳ないのですがImageDataGenerator で複数のパラメータを指定した場合(例えば回転、水平移動、ズームの3つ)は回転だけ適応された画像、回転とズームが適応された画像、のように様々なパターンの画像が出来ると解釈しているのですが、この組み合わせは完全ランダムでしょうか?
tiitoi

2019/03/04 16:11

> (すべて変換された画像になる)ということでしょうか。 ランダムです。例えば、回転だけ設定したとして、ランダムに角度を決めたときにたまたま0°であれば、元と同じ画像が使われますが、そうでなければ変換された元とは異なる画像になります。 > 様々な形状を学習させることで表現力を上げるということが本来の目的ということでしょうか? そうなります。なので、予め n 倍に増やすかどうかは本質ではないです。 > この組み合わせは完全ランダムでしょうか? 完全にランダムです。 回転をどのくらいするか、水平移動をどのくらいするかというのはそれぞれ独立に決まります。なので、回転して、平行移動して、ズームしてといったすべての変換が基本的に行われると思って良いです。 詳しい挙動はソースに書いてあります。 https://github.com/keras-team/keras-preprocessing/blob/master/keras_preprocessing/image/image_data_generator.py
---stax---

2019/03/05 00:10

回答ありがとうございます。 水増しをするにしても最低限の枚数がないと効果を感じにくいのかなと感じました。 ImageDataGenerator のパラメータをアドバイス頂いたように項目を絞ってどのように変化するかの確認をまずは実施してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問