20200914のTensorFlowに関する記事は3件です。

【画像前処理】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 ImageDataGenerator
ImageDataGeneratorクラスのインスタンス
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_modebinary で 2 クラス分類、categorical で多クラス。None でディレクトリから自動でラベル付け。
  • batch_size:デフォルト 32:学習時のバッチサイズにも影響する。
  • subsettraining で学習用、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.]

スクリーンショット 2020-09-14 1.35.25.png

しっかりラベル付け、シャッフルできています。
データ準備がこれで完了です!

あとはモデルを構築して、学習
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]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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つのオプション選択メニューになります。
Screenshot_20200913-074331.png Screenshot_20200913-074319.png
下の「3 DAY FREE TRIAL」をクリックします。
Screenshot_20200913-074343.png
定期購入を押すと、個人認証ダイアログがでるので指紋で認証します。これで申し込み完了です。

ライブラリインストール

申し込み完了すると、ライブラリメニューでグレーアウトしていたものがインストール可能になっています。
Screenshot_20200913-075009.png
全部インストールしました。
tensorflow-2.2.0, opencv-python-4.3.0, torch-1.5.0 がインストールされました。

サンプルプログラム

サイドメニューの Samples からサンプルプログラムをダウンロードできます。ここもグレーアウトしていたものが選択可能になっています。
Screenshot_20200913-210722.png

Tensorflow

MNIST

よくあるやつです。サンプルデータをダウンロードして学習させるやつです。もの凄く遅いので、epoch=5に設定されています。5回まわすだけでも大変なんですが。モデルはKerasの普通のソースが使えそうです。
Screenshot_20200913-173630.png

Image Classification

Screenshot_20200913-173816.png Screenshot_20200913-173924.png

Text classification

衣類画像の識別のようです。最後にmatplotlibで画像とグラフが表示されます。
Screenshot_20200913-173816.png Screenshot_20200913-173924.png
このサンプルソースをWindowsに持っていって走らせてみたら、そのまま1行も変えずに動かすことができました。
Figure_1.png

Regression

車のスペックから燃費を推測して、本当の値と比べてるのかな?
Screenshot_20200913-174249.png
これも同じソースが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: -2147483638

Laplacian

これもカメラが安定しません。何度かやってると動きました。リアルタイムに輪郭抽出します。
Screenshot_20200913-184729.png

Face detector

これはキャプチャのやり方が他と違うのか安定してます。リアルタイムに顔を検出します。
Screenshot_20200913-185402.png
サンプルは自撮り用に前面カメラ(1)を使ってますが、カメラ番号を(0)にするとPCでも動作します。PyQt5をインストールする必要があります。
Screenshot_20200913-094118.png

ASCII camera

これまたまたカメラが安定しません。右の人形を撮ると左のようにASCII文字で表示します。
Screenshot_20200913-184036.png IMG_20200913_184053s.jpg

Camera options

カメラの設定をするもののようですが、よく分かりません。
Screenshot_20200913-233723.png

PyTorch

Tensors

なんか動いているようです。
Screenshot_20200913-234202.png

MNIST

動いているようですが、ものすごく時間がかかります。Epoch=5 ですが、30分くらいかかりました。
Screenshot_20200913-234722.png

Pretrained model

画像をダウンロードして何が写ってるか判定します。ダウンロード済の画像でも判定に数十秒かかりました。
Screenshot_20200913-081552.png Screenshot_20200913-081711.png

Quantized model

このカメラは安定しているようです。カメラに写ったものをリアルタイムに識別します。ステンレスのタンブラーがカクテルシェーカーと判定されましたが似てるかも。
Screenshot_20200913-192101.png

まとめ

互換性は高く、たいていのサンプルはPCでもそのまま動きます。OpenCVのサンプルでカメラが不安定なものがあるのが気になりますが、安定した動きをするサンプルもあるので回避する方法はありそうです。Pydroid3でカメラを使うには、別アプリで撮影し、すぐに切り替えて処理する手もありますか、リアルタイムにカメラ画像を使うには、この有料オブションを使うしかないでしょう。

モデルの学習もできますが、スマホは遅いので実用にはならないと思います。大量にデータを取ってバッチ的にイッキに学習させるというのは、気の向いたときに写真をとったりネットを見たり電話がかかってきたり、何かと割り込みが多いスマホには向いてません。ホームではなく出先でデータや写真を撮ってすぐに学習させていくというやり方がいいのかもしれません。

スマホでブログラムが組めるというのは楽しそうです。以前自分でもそういう環境( アプリを作るためのAndroidアプリ、「PineVentor」 )を作ったことがあります。ただしスマホだけで開発するのはなかなかキツいものがありました。Pydroid3はPCでも同じスクリプトが使えるので、いったりきたりしながら作るといいことがあるかもしれません。ただし今のところ気軽にいろんなところでスクリプトを渡り歩いていく仕組みはないので、いろいろ工夫する必要はありそうです。

出先にノートPCを持っていくほどではないが、ちょっとした空き時間にプログラムしてパズルをといたりゲームでズルしたりしたい人向けでしょうか。現場でデータを取ってすぐに時系列のグラフにすることができると、より深いデータ収集ができるかもしれません。無料のPydroid3でもかなり遊べるので、リアルタイムにカメラを使う必要がなければ、有料オプションはぜひとも必要ではありませんが、無料で3日お試しする価値はあると思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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つのオプション選択メニューになります。
Screenshot_20200913-074331.png Screenshot_20200913-074319.png
下の「3 DAY FREE TRIAL」をクリックします。
Screenshot_20200913-074343.png
定期購入を押すと、個人認証ダイアログがでるので指紋で認証します。これで申し込み完了です。

ライブラリインストール

申し込み完了すると、ライブラリメニューでグレーアウトしていたものがインストール可能になっています。
Screenshot_20200913-075009.png
全部インストールしました。
tensorflow-2.2.0, opencv-python-4.3.0, torch-1.5.0 がインストールされました。

サンプルプログラム

サイドメニューの Samples からサンプルプログラムをダウンロードできます。ここもグレーアウトしていたものが選択可能になっています。
Screenshot_20200913-210722.png

Tensorflow

MNIST

よくあるやつです。サンプルデータをダウンロードして学習させるやつです。もの凄く遅いので、epoch=5に設定されています。5回まわすだけでも大変なんですが。モデルはKerasの普通のソースが使えそうです。
Screenshot_20200913-173630.png

Image Classification

Screenshot_20200913-173816.png Screenshot_20200913-173924.png

Text classification

衣類画像の識別のようです。最後にmatplotlibで画像とグラフが表示されます。
Screenshot_20200913-173816.png Screenshot_20200913-173924.png
このサンプルソースをWindowsに持っていって走らせてみたら、そのまま1行も変えずに動かすことができました。
Figure_1.png

Regression

車のスペックから燃費を推測して、本当の値と比べてるのかな?
Screenshot_20200913-174249.png
これも同じソースがWindowsでも動きます。

OpenCV

古い機種ではOpenCVがダウンロードができないものがありました。別の機種ではカメラが動作しない、カメラが使える機種でも動作が安定しない、などカメラ機能は問題があります。

Hello camera

カメラが安定しません。一度だけ動きましたが、キャプチャを撮るのを忘れてました。
Zenfone3 Maxで試したところ次のようなメッセージがでて動作しませんでした。
Camera NDK APIをサポートしている機種でないとダメみたいです。
Screenshot_20200914-140205.jpg

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: -2147483638

Laplacian

これもカメラが安定しません。何度かやってると動きました。リアルタイムに輪郭抽出します。
Screenshot_20200913-184729.png

Face detector

これはキャプチャのやり方が他と違うのか安定してます。リアルタイムに顔を検出します。
Screenshot_20200913-185402.png
サンプルは自撮り用に前面カメラ(1)を使ってますが、カメラ番号を(0)にするとPCでも動作します。PyQt5をインストールする必要があります。
Screenshot_20200913-094118.png

ASCII camera

これまたまたカメラが安定しません。右の人形を撮ると左のようにASCII文字で表示します。
Screenshot_20200913-184036.png IMG_20200913_184053s.jpg

Camera options

カメラの設定をするもののようですが、よく分かりません。
Screenshot_20200913-233723.png

PyTorch

Tensors

なんか動いているようです。
Screenshot_20200913-234202.png

MNIST

動いているようですが、ものすごく時間がかかります。Epoch=5 ですが、30分くらいかかりました。
Screenshot_20200913-234722.png

Pretrained model

画像をダウンロードして何が写ってるか判定します。ダウンロード済の画像でも判定に数十秒かかりました。
Screenshot_20200913-081552.png Screenshot_20200913-081711.png

Quantized model

このカメラは安定しているようです。カメラに写ったものをリアルタイムに識別します。ステンレスのタンブラーがカクテルシェーカーと判定されましたが似てるかも。
Screenshot_20200913-192101.png

まとめ

互換性は高く、たいていのサンプルはPCでもそのまま動きます。OpenCVのサンプルでカメラが不安定なものがあるのが気になりますが、安定した動きをするサンプルもあるので回避する方法はありそうです。Pydroid3でカメラを使うには、別アプリで撮影し、すぐに切り替えて処理する手もありますか、リアルタイムにカメラ画像を使うには、この有料オブションを使うしかないでしょう。ただし、サポートしていない機種の場合はどうにもなりません。

モデルの学習もできますが、スマホは遅いので実用にはならないと思います。大量にデータを取ってバッチ的にイッキに学習させるというのは、気の向いたときに写真をとったりネットを見たり電話がかかってきたり、何かと割り込みが多いスマホには向いてません。ホームではなく出先でデータや写真を撮ってすぐに学習させていくというやり方がいいのかもしれません。

スマホでブログラムが組めるというのは楽しそうです。以前自分でもそういう環境( アプリを作るためのAndroidアプリ、「PineVentor」 )を作ったことがあります。ただしスマホだけで開発するのはなかなかキツいものがありました。Pydroid3はPCでも同じスクリプトが使えるので、いったりきたりしながら作るといいことがあるかもしれません。ただし今のところ気軽にいろんなところでスクリプトを渡り歩いていく仕組みはないので、いろいろ工夫する必要はありそうです。

出先にノートPCを持っていくほどではないが、ちょっとした空き時間にプログラムしてパズルをといたりゲームでズルしたりしたい人向けでしょうか。現場でデータを取ってすぐに時系列のグラフにすることができると、より深いデータ収集ができるかもしれません。無料のPydroid3でもかなり遊べるので、リアルタイムにカメラを使う必要がなければ、有料オプションはぜひとも必要ではありませんが、無料で3日お試しする価値はあると思います。
機種によってはカメラが動かなかったり、古い機種だとOpenCVまるごと動かなかったりするので、購入するにしても゛お試しはやった方がいいです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む