- 投稿日:2020-09-14T02:20:23+09:00
【画像前処理】tf.keras.preprocessing.image.ImageDataGenerator
ImageDataGenerator とは
https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator
Generate batches of tensor image data with real-time data augmentation.
リアルタイムのデータ増強でテンソル画像データのバッチを生成。このリアルタイムというのは学習実行時のことです。
学習実行時にファイル(データ)を逐次読み込んでくれます。
flow_from_directory()
,flow_from_dataframe()
を使用することで
学習時にメモリに乗り切らない大量の画像も学習可能になります。メリット
- OpenCV, Pillow 不要
- 画像読み込み、ラベル付け、NumPy 変換、正規化、データ分割を一度にできる
- 大量のデータを扱う場合の学習時メモリ不足解消
- データ拡張(水増し)可能
- 従来の手法と学習時間の差は無し
犬猫分類で実装
- dog_cat_data
- train
- cat:150 枚
- dog:150 枚
- test
- cat:100 枚
- dog:100 枚
from tensorflow.keras.preprocessing.image import ImageDataGeneratorImageDataGeneratorクラスのインスタンスdatagen = ImageDataGenerator( rescale=1./255, validation_split=0.3 )
rescale
で正規化validation_split
で検証用データセット分割可能他にも、データ拡張(水増し)もできます。
詳しく知りたい方はこちらと KIKAGAKU を参考にしてみてください。画像データの読み込みbatch_size=10 train_generator = datagen.flow_from_directory( '/content/dog_cat_data/train', target_size=(224, 224), class_mode='binary', batch_size=batch_size, subset='training', ) val_generator = datagen.flow_from_directory( '/content/dog_cat_data/train', target_size=(224, 224), class_mode='binary', batch_size=batch_size, subset='validation' ) >>> Found 210 images belonging to 2 classes. >>> Found 90 images belonging to 2 classes.
target_size
:デフォルト(256, 256)class_mode
:binary
で 2 クラス分類、categorical
で多クラス。None
でディレクトリから自動でラベル付け。batch_size
:デフォルト 32:学習時のバッチサイズにも影響する。subset
:training
で学習用、validation
で検証用。ImageGenerator クラスのインスタンスでvalidation_split
を指定した場合に可能。今回は train に犬猫 150 枚ずつ、計 300 枚。
バッチサイズを 10 にしたためこうなる。確認# train 画像データ train_generator.image_shape >>> (224, 224, 3) # train ラベル train_generator.class_indices >>> {'cat': 0, 'dog': 1} # train 全てのラベル train_generator.classes >>> array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=int32)1 つのバッチ分を可視化して確認してみます。
可視化training_images, training_labels = next(train_generator) def plotImages(images_arr): fig, axes = plt.subplots(1, 5, figsize=(20,20)) axes = axes.flatten() for img, ax in zip( images_arr, axes): ax.imshow(img) ax.axis('off') plt.tight_layout() plt.show() print(training_labels) plotImages(training_images[:5]) >>> [1. 1. 0. 1. 0. 1. 0. 0. 0. 1.]しっかりラベル付け、シャッフルできています。
データ準備がこれで完了です!あとはモデルを構築して、学習
ImageDataGenerator の挙動確認のため、精度は気にしない。学習
fit_generator
が tf 2.1 から.fit
に統合されました。
そのためこれまで通り.fit
で学習できます。学習history = model.fit( train_generator, epochs=10, validation_data=val_generator ) >>> Epoch 1/10 21/21 [==============================] - 1s 52ms/step - loss: 0.9283 - sparse_categorical_accuracy: 0.5333 - val_loss: 0.7018 - val_sparse_categorical_accuracy: 0.5000 . . .1epoch で
21/21
なのでImageDataGenerator
のバッチサイズが適用されていることがわかります。テスト用データセットで検証
test には犬猫 200 枚が用意されています。
test_datagen = ImageDataGenerator(rescale=1./255) test_generator = datagen.flow_from_directory( '/content/dog_cat_data/test', target_size=(224, 224), class_mode='binary', batch_size=batch_size ) model.evaluate(test_generator) >>> 20/20 [==============================] - 0s 22ms/step - loss: 0.6969 - sparse_categorical_accuracy: 0.5000 [0.6969258189201355, 0.5]
- 投稿日:2020-09-14T01:44:20+09:00
Pydroid 3 - IDE for Python 3 (Android) の有料オプションを試した
Pydroid 3 - IDE for Python 3 はAndroidで動くPythonですが、PC上のPythonと互換性が高くtkinterなどのGUIプログラムも同じソースを使うことができます。スマホだけでまあまあ使えるアプリが書けるのでお勧めです。さらにOpenCVやTensorFlowまで動くそうです。残念ながらこれらのライブラリは有料オプションとなっていますが、3日間のお試しができるので申し込んでみました。
有料オプション申し込み
有料オプションは次の2つの種類があります。
・買い切り¥1160
・月々¥110 最初の3日は無料
3日間お試しをやってみることにしました。申し込みは製品から行えます。
左上アイコンをクリックしてサイドメニューを開くと一番上に有料オプション申し込みメニューがあります。申し込みメニューに入ると上記2つのオプション選択メニューになります。
下の「3 DAY FREE TRIAL」をクリックします。
定期購入を押すと、個人認証ダイアログがでるので指紋で認証します。これで申し込み完了です。ライブラリインストール
申し込み完了すると、ライブラリメニューでグレーアウトしていたものがインストール可能になっています。
全部インストールしました。
tensorflow-2.2.0, opencv-python-4.3.0, torch-1.5.0 がインストールされました。サンプルプログラム
サイドメニューの Samples からサンプルプログラムをダウンロードできます。ここもグレーアウトしていたものが選択可能になっています。
Tensorflow
MNIST
よくあるやつです。サンプルデータをダウンロードして学習させるやつです。もの凄く遅いので、epoch=5に設定されています。5回まわすだけでも大変なんですが。モデルはKerasの普通のソースが使えそうです。
Image Classification
Text classification
衣類画像の識別のようです。最後にmatplotlibで画像とグラフが表示されます。
このサンプルソースをWindowsに持っていって走らせてみたら、そのまま1行も変えずに動かすことができました。
Regression
車のスペックから燃費を推測して、本当の値と比べてるのかな?
これも同じソースがWindowsでも動きます。OpenCV
Hello camera
カメラが安定しません。一度だけ動きましたが、キャプチャを撮るのを忘れてました。
Windowsで実行すると次のようなエラーがでまくります。[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (374) `anonymous-namespace'::SourceReaderCB::OnReadSample videoio(MSMF): OnReadSample() is called with error status: -1072875772 [ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (386) `anonymous-namespace'::SourceReaderCB::OnReadSample videoio(MSMF): async ReadSample() call is failed with error status: -1072875772 [ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (906) CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -1072875772 [ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (906) CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -2147483638 [ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (906) CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -2147483638Laplacian
これもカメラが安定しません。何度かやってると動きました。リアルタイムに輪郭抽出します。
Face detector
これはキャプチャのやり方が他と違うのか安定してます。リアルタイムに顔を検出します。
サンプルは自撮り用に前面カメラ(1)を使ってますが、カメラ番号を(0)にするとPCでも動作します。PyQt5をインストールする必要があります。
ASCII camera
これまたまたカメラが安定しません。右の人形を撮ると左のようにASCII文字で表示します。
Camera options
PyTorch
Tensors
MNIST
動いているようですが、ものすごく時間がかかります。Epoch=5 ですが、30分くらいかかりました。
Pretrained model
画像をダウンロードして何が写ってるか判定します。ダウンロード済の画像でも判定に数十秒かかりました。
Quantized model
このカメラは安定しているようです。カメラに写ったものをリアルタイムに識別します。ステンレスのタンブラーがカクテルシェーカーと判定されましたが似てるかも。
まとめ
互換性は高く、たいていのサンプルはPCでもそのまま動きます。OpenCVのサンプルでカメラが不安定なものがあるのが気になりますが、安定した動きをするサンプルもあるので回避する方法はありそうです。Pydroid3でカメラを使うには、別アプリで撮影し、すぐに切り替えて処理する手もありますか、リアルタイムにカメラ画像を使うには、この有料オブションを使うしかないでしょう。
モデルの学習もできますが、スマホは遅いので実用にはならないと思います。大量にデータを取ってバッチ的にイッキに学習させるというのは、気の向いたときに写真をとったりネットを見たり電話がかかってきたり、何かと割り込みが多いスマホには向いてません。ホームではなく出先でデータや写真を撮ってすぐに学習させていくというやり方がいいのかもしれません。
スマホでブログラムが組めるというのは楽しそうです。以前自分でもそういう環境( アプリを作るためのAndroidアプリ、「PineVentor」 )を作ったことがあります。ただしスマホだけで開発するのはなかなかキツいものがありました。Pydroid3はPCでも同じスクリプトが使えるので、いったりきたりしながら作るといいことがあるかもしれません。ただし今のところ気軽にいろんなところでスクリプトを渡り歩いていく仕組みはないので、いろいろ工夫する必要はありそうです。
出先にノートPCを持っていくほどではないが、ちょっとした空き時間にプログラムしてパズルをといたりゲームでズルしたりしたい人向けでしょうか。現場でデータを取ってすぐに時系列のグラフにすることができると、より深いデータ収集ができるかもしれません。無料のPydroid3でもかなり遊べるので、リアルタイムにカメラを使う必要がなければ、有料オプションはぜひとも必要ではありませんが、無料で3日お試しする価値はあると思います。
- 投稿日:2020-09-14T01:44:20+09:00
Pydroid 3 - IDE for Python 3 (Android) のOpenCVとTensorFlowオプションを試した
Pydroid 3 - IDE for Python 3 はAndroidで動くPythonですが、PC上のPythonと互換性が高くtkinterなどのGUIプログラムも同じソースを使うことができます。スマホだけでまあまあ使えるアプリが書けるのでお勧めです。さらにOpenCVやTensorFlowまで動くそうです。残念ながらこれらのライブラリは有料オプションとなっていますが、3日間のお試しができるので申し込んでみました。
※サンプルスクリプトはすべてPixel3で実行確認しています。機種によってはカメラが動かなかったりします。
有料オプション申し込み
有料オプションは次の2つの種類があります。
・買い切り¥1160
・月々¥110 最初の3日は無料
3日間お試しをやってみることにしました。申し込みは製品から行えます。
左上アイコンをクリックしてサイドメニューを開くと一番上に有料オプション申し込みメニューがあります。申し込みメニューに入ると上記2つのオプション選択メニューになります。
下の「3 DAY FREE TRIAL」をクリックします。
定期購入を押すと、個人認証ダイアログがでるので指紋で認証します。これで申し込み完了です。ライブラリインストール
申し込み完了すると、ライブラリメニューでグレーアウトしていたものがインストール可能になっています。
全部インストールしました。
tensorflow-2.2.0, opencv-python-4.3.0, torch-1.5.0 がインストールされました。サンプルプログラム
サイドメニューの Samples からサンプルプログラムをダウンロードできます。ここもグレーアウトしていたものが選択可能になっています。
Tensorflow
MNIST
よくあるやつです。サンプルデータをダウンロードして学習させるやつです。もの凄く遅いので、epoch=5に設定されています。5回まわすだけでも大変なんですが。モデルはKerasの普通のソースが使えそうです。
Image Classification
Text classification
衣類画像の識別のようです。最後にmatplotlibで画像とグラフが表示されます。
このサンプルソースをWindowsに持っていって走らせてみたら、そのまま1行も変えずに動かすことができました。
Regression
車のスペックから燃費を推測して、本当の値と比べてるのかな?
これも同じソースがWindowsでも動きます。OpenCV
古い機種ではOpenCVがダウンロードができないものがありました。別の機種ではカメラが動作しない、カメラが使える機種でも動作が安定しない、などカメラ機能は問題があります。
Hello camera
カメラが安定しません。一度だけ動きましたが、キャプチャを撮るのを忘れてました。
Zenfone3 Maxで試したところ次のようなメッセージがでて動作しませんでした。
Camera NDK APIをサポートしている機種でないとダメみたいです。
Windowsで実行すると次のようなエラーがでまくります。
[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (374) `anonymous-namespace'::SourceReaderCB::OnReadSample videoio(MSMF): OnReadSample() is called with error status: -1072875772 [ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (386) `anonymous-namespace'::SourceReaderCB::OnReadSample videoio(MSMF): async ReadSample() call is failed with error status: -1072875772 [ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (906) CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -1072875772 [ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (906) CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -2147483638 [ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (906) CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -2147483638Laplacian
これもカメラが安定しません。何度かやってると動きました。リアルタイムに輪郭抽出します。
Face detector
これはキャプチャのやり方が他と違うのか安定してます。リアルタイムに顔を検出します。
サンプルは自撮り用に前面カメラ(1)を使ってますが、カメラ番号を(0)にするとPCでも動作します。PyQt5をインストールする必要があります。
ASCII camera
これまたまたカメラが安定しません。右の人形を撮ると左のようにASCII文字で表示します。
Camera options
PyTorch
Tensors
MNIST
動いているようですが、ものすごく時間がかかります。Epoch=5 ですが、30分くらいかかりました。
Pretrained model
画像をダウンロードして何が写ってるか判定します。ダウンロード済の画像でも判定に数十秒かかりました。
Quantized model
このカメラは安定しているようです。カメラに写ったものをリアルタイムに識別します。ステンレスのタンブラーがカクテルシェーカーと判定されましたが似てるかも。
まとめ
互換性は高く、たいていのサンプルはPCでもそのまま動きます。OpenCVのサンプルでカメラが不安定なものがあるのが気になりますが、安定した動きをするサンプルもあるので回避する方法はありそうです。Pydroid3でカメラを使うには、別アプリで撮影し、すぐに切り替えて処理する手もありますか、リアルタイムにカメラ画像を使うには、この有料オブションを使うしかないでしょう。ただし、サポートしていない機種の場合はどうにもなりません。
モデルの学習もできますが、スマホは遅いので実用にはならないと思います。大量にデータを取ってバッチ的にイッキに学習させるというのは、気の向いたときに写真をとったりネットを見たり電話がかかってきたり、何かと割り込みが多いスマホには向いてません。ホームではなく出先でデータや写真を撮ってすぐに学習させていくというやり方がいいのかもしれません。
スマホでブログラムが組めるというのは楽しそうです。以前自分でもそういう環境( アプリを作るためのAndroidアプリ、「PineVentor」 )を作ったことがあります。ただしスマホだけで開発するのはなかなかキツいものがありました。Pydroid3はPCでも同じスクリプトが使えるので、いったりきたりしながら作るといいことがあるかもしれません。ただし今のところ気軽にいろんなところでスクリプトを渡り歩いていく仕組みはないので、いろいろ工夫する必要はありそうです。
出先にノートPCを持っていくほどではないが、ちょっとした空き時間にプログラムしてパズルをといたりゲームでズルしたりしたい人向けでしょうか。現場でデータを取ってすぐに時系列のグラフにすることができると、より深いデータ収集ができるかもしれません。無料のPydroid3でもかなり遊べるので、リアルタイムにカメラを使う必要がなければ、有料オプションはぜひとも必要ではありませんが、無料で3日お試しする価値はあると思います。
機種によってはカメラが動かなかったり、古い機種だとOpenCVまるごと動かなかったりするので、購入するにしても゛お試しはやった方がいいです。