雑記

Anaconda 環境を利用した Windows への Keras (TensorFlow backend) 導入

以下の記事の手順でできました。
qiita.com今回は Keras を利用するので Keras も導入しました。Anaconda インストール後、コマンドプロンプトを立ち上げて以下のように「仮想環境作成 → 仮想環境立ち上げ → TensorFlow導入 → Keras導入」しました。仮想環境を作成するとき Python のバージョンを指定できますが、3.5 にしないといけないようです。

C:\work> conda create -n tensorflow python=3.5 anaconda
C:\work> activate tensorflow
(tensorflow) C:\work> pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.0.1-cp35-cp35m-win_amd64.whl
(tensorflow) C:\work> pip install keras

これで Keras (TensorFlow backend) がつかえるようになったことを確認するために以下のスクリプトを実行してみます。中間層が2層の全結合ニューラルネットワークで iris を分類します。

# -*- coding: utf-8 -*-
import numpy
import random
from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.utils import np_utils
from sklearn import datasets

if __name__ == '__main__':
  # irisデータのロード
  iris = datasets.load_iris()
  x = iris.data
  y = np_utils.to_categorical(iris.target, num_classes=3)

  # シャッフルして訓練データとテストデータに分割
  n = iris.target.shape[0]
  indices = random.sample(range(n), n)
  x = x[indices]
  y = y[indices]
  n_train = int(n / 2)
  x_train = x[range(n_train)]
  y_train = y[range(n_train)]
  x_test = x[range(n_train, n)]
  y_test = y[range(n_train, n)]

  # モデルの構築と学習
  model = Sequential()
  model.add(Dense(10, input_shape=(x.shape[1],), activation='relu'))
  model.add(Dense(10, activation='relu'))
  model.add(Dense(3, activation='softmax'))
  model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
  model.fit(x_train, y_train, epochs=100, batch_size=10, shuffle=True)

  # テスト結果表示
  scores = model.evaluate(x_train, y_train, verbose=0)
  print('Accuracy (train): %.2f%%' % (scores[1]*100))
  scores = model.evaluate(x_test,  y_test,  verbose=0)
  print('Accuracy (test) : %.2f%%' % (scores[1]*100))

以下のように学習できました。

(tensorflow) C:\work> python test.py
...
Epoch 99/100
75/75 [==============================] - 0s - loss: 0.3137 - acc: 0.9733
Epoch 100/100
75/75 [==============================] - 0s - loss: 0.3072 - acc: 0.9733
Accuracy (train): 97.33%
Accuracy (test) : 96.00%
さらに Anaconda 環境への OpenCV の導入

さらに画像処理ライブラリ OpenCV も導入します。
Anaconda で対象の仮想環境を立ち上げた状態で、以下のコマンドで導入できます。

(tensorflow) C:\work> conda install -c menpo opencv3

導入が上手くいったかどうか、以下のスクリプトで確認します。

# -*- coding: utf-8 -*-
import cv2
import numpy

if __name__ == '__main__':
  image = numpy.zeros((256, 256, 3), numpy.uint8)
  for i in range(256):
    for j in range(256):
      image[i, j, 0] = i
      image[i, j, 1] = j
  cv2.imwrite('hoge.png', image)

以下のような画像ファイル hoge.png が生成されます。

f:id:cookie-box:20170806220129p:plain

OpenCV で動画作成

OpenCV で動画を作成することができます。以下のスクリプトで movie.avi が生成されます。以下では各フレームを画素の行列から生成していますが、画像ファイルを読み込んでつなげて動画にすることもできます。

# -*- coding: utf-8 -*-
import cv2
import numpy

if __name__ == '__main__':
  vvw = cv2.VideoWriter('movie.avi', cv2.VideoWriter_fourcc('X','V','I','D'), 10, (200, 200))
  for i in range(10):
    for j in range(10):
      j_ = (9 - j) if (i % 2 == 1) else j
      image = numpy.zeros((10, 10, 3), numpy.uint8)
      image[i, j_, 0] = i  * 25
      image[i, j_, 1] = j_ * 25
      image = cv2.resize(image, (200, 200), interpolation=cv2.INTER_AREA)
      vvw.write(image)

以下のような動画ができます。.avi ははてなブログに貼り付けられないようなので、以下のページで .gif に変換しました。
AVI GIF 変換。オンライン フリー — Convertio

f:id:cookie-box:20170806222204g:plain

なお、cv2.VideoWriter の第2引数の4文字はコーデック指定です( Video Codecs by FOURCC - fourcc.org )。最適かどうかはわかりませんがとりあえず ('X','V','I','D') で生成できました。第3引数は1秒あたりのフレーム数、第4引数は画像サイズです。