Keras で画像読み込み

Kerasで画像分類~前処理から分類テストまで~
https://qiita.com/neet-AI/items/2b3d7f743e4d6c6d8e10

こちらの記事を参考にさせて頂きました。有益な情報に感謝です。

from keras.preprocessing.image import load_img, img_to_array, array_to_img
import glob
import numpy as np

arraylist = []
files = glob.glob("01/*.tiff")
for file in files:
    img = load_img(file)
    array = img_to_array(img)
    arraylist.append(array)

nplist = np.array(arraylist)

これで、特定フォルダ以下の画像を読み込み numpy array に出来ました。画像は 135x240px RGB が 151枚あるので nplist.shape で表示させてみると (151, 135, 240, 3) になりました。

Matplitlib で表示

import matplotlib.pyplot as plt
plt.imshow(nplist[0])

このまま直接 imshow をやったら表示されました。

keras.preprocessing.image

色々出来そう。

下記の指定で読み込んだ時にグレースケール (135, 24, 1) 次元になる。
load_img(file, color_mode=”grayscale”)

グレースケール化した画像の表示

matplitlib の imshow に渡す時は RGB のみでしかも [0..1] にクリップされている必要がある。img_to_array(img) / 255. などを呼び出して [0..1] に収める。

グレースケールを RGB に変換するには下記のコードを使った。

import tensorflow as tf
from keras import backend
rgb = tf.image.grayscale_to_rgb(nplist[0])
array = backend.get_session().run(rgb)

tf.image.grayscale_to_rgb() を使うと Tensor 型になってしまうので、それを Numpy に変換している。

学習済みデータの保存

model.save_weights('weights.h5')

Matplotlib 覚書

普通に画像を表示させるだけであれば、下記で表示出来る。

import matplotlib.pyplot as plt
plt.imshow(decoded_img[0].reshape(28, 28))

下記の表記でサイズが 20, 5 の新規領域を作り、(2, 10, i+1) で、2行10列ごとにサブプロットで領域を分割している?

n = 10
plt.figure(figsize=(20, 5))
for i in range(n):
    ax = plt.subplot(2, 10, i+1)
    plt.imshow(x_test[i].reshape(28, 28))
    plt.gray()
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)

    ax = plt.subplot(2, 10, i+1+n)
    plt.imshow(decoded_img[i].reshape(28, 28))
    plt.gray()
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)
plt.show()

Keras でのコーディング

Keras は Sequential API と Functional API で分かれており、Sequential API であれば、レイヤーインスタンスを add していくだけで、簡単にニューラルネットワークの層を構築することが出来る。

最初のレイヤーには、imput_shape=() として、入力の形状を指定する必要がある。(後続のレイヤーが推定できるため、指定は必要ない)

Compile

Model の Training 前には、compile メソッドに学習プロセスに必要な3つの引数を設定する必要がある。

  • Optimizer (最適化アルゴリズム)
  • Loss Function (損失関数, 目的関数)
  • Metrics (評価関数)

Training

Keras は fit 関数を呼び出して訓練が開始される。訓練データ, 正解ラベル, エポック, バッチサイズなどを引数に取る。x_train の値を y_train の正解データに近づけるように学習を行なっていく。

model.fit(x_train, y_train, epochs=10, batch_size=32)

Evaluate

テストモードで、損失値と評価値を返す。処理はバッチ単位で行われる。テストデータラベルデータを指定して、List 型で [0.0711811, 0.9792] のような値が帰る。恐らく、損失値が 0.0711 で評価値(精度?)が 97% の正解値ということ。

score = model.evaluate(x_test, y_test)

Functional API

Keras で、マルチアウトプットモデルのような複雑なモデルを作るときは Functional API を使用する。Sequential API はレイヤーを順番に Add して重ねることしか出来ない?が、Functional API では任意の位置に、任意のレイヤーを差し込め、多重な output も作れるようになっている。

複数の input や output を行う場合は、compile や fit には複数の連想配列で追加する。

Model Class API

Functional API で Model(inputs=a, outputs-b) を与えてモデルを作る。例えば inputs=[a1, a2], outputs=[b1, b2, b3] のように、複数の入力と出力を得ることが出来る。全てのモデルはレイヤーのように呼び出しが可能で再利用できる。

NumPy ndarray と MINIST のサイズ

Keras で (x_train, ) , (x_test, ) = mnist.load_data() などで読み込んだ MINIST データは type(x_train) で表示させてみると numpy.ndarray 型であることが分かり、x_train.shape などで次元の大きさを確認することが出来る。

x_train.shape をやってみると (60000, 784) のサイズになる。28×28=784 次元の画像が 60000 個存在する。

Windows Anaconda での OpenCV 環境構築

Anaconda の Environments タブから Create を選択して、Python は 3.6 を選び作成。Terminal を立ち上げて下記 pip コマンドでインストール。

pip install opencv-python
pip install opencv-contrib-python

下の contrib は最新のアルゴリズムや試験的な機能が入っているものらしい。たぶん使わないと思うが、一応インストール。

pip freeze

コマンドを打ち込み、無事にインストールされたことを確認。

プログラミング

cv2.imread() で読み込み
cv2.imwrite() で書き出し
この間に、ピクセルの加工を行う。例えばリサイズしたければ、
cv2.resize() などで処理する。

PyCharm で開発

PyCharm を立ち上げ、File から NewProject を選択して、Existing interpreter から Anaconda で作成した仮想環境を選択して作成する。

Visual Studio Code で開発

普通に Anaconda と連携しようとするとエラーになって実行できない。
conda activate xxx
のコマンドが通らない。環境変数が設定されていないっぽい。環境変数を通せば良いが、単一のファイルを実行するだけであれば毎回 Activate する必要もない?

File -> Preferences -> settings から activate で検索して、一番上の Activate Python Environment in Terminal のチェックをオフにして、Activate を一旦止める。

Ctrl + Shift + P で「Python: Select Interpreter」で実行する仮想環境の選択。もしくは、VSCode 左下から環境を選択できる。

あとは、Ctrl+F5 で実行できる。(Debug したいときは F5 キーを押せば良い)

Autoencoder 資料

Building Autoencoders in Keras
https://blog.keras.io/building-autoencoders-in-keras.html

KerasでAutoEncoder【備忘録】
https://gangannikki.hatenadiary.jp/entry/2018/12/09/235956

KerasでDAE(Denoising AE)を試してみた【備忘録】
https://gangannikki.hatenadiary.jp/entry/2019/01/19/000000

【ノイズ除去】kerasでノイズ除去を試してみた1【DNCNN】
https://gangannikki.hatenadiary.jp/entry/2019/01/26/210651

KerasでAutoEncoder
https://qiita.com/fukuit/items/2f8bdbd36979fff96b07

Variational Autoencoder徹底解説
https://qiita.com/kenmatsu4/items/b029d697e9995d93aa24

素晴らしい資料に感謝です。

Keras で処理した画像を書き出し

# PIL をインストールしておく
conda install -c anaconda pillow

from PIL import Image
decoded_imgs[0] = decoded_imgs[0].astype('float32') * 255.0
pil_img = Image.fromarray(decoded_imgs[0].reshape(28,28))
if pil_img.mode != 'RGB':
    pil_img = pil_img.convert('RGB')

pil_img.save('0.png')

シングルクォーテーションがエンコードされているので注意。