Abstract
Keras と OpenCV を使って、画像を分類するプログラムを試作しました。バックギャモンのプレシジョンダイスの出目を判定することができます。精度もまあまあのものが出来ました。
Backgammon dice recognition with Keras https://t.co/XO8vibXdBy via @YouTube
— Masahiro Kisono (@mkisono) July 16, 2016
Related work
去年も同じものを作りました。その時は、Caffe + OpenCV でした。
そこそこ動いたのですが、Caffeが難しかったのと、C++でちまちま書くのが面倒になり、すぐに飽きてしまいました。
しかし、この時作った学習用データは今回も同じものを使いました。ある意味、学習用データを作る作業が一番大変なので、今回は去年の自分の肩の上に乗った仕事です。
モデルを学習させる
CIFAR10のサンプルのモデルを使いました。
画像ファイルから、トレーニングと検証用のデータを読み込ませるには、ここにあるように ImageDataGenerator.flow_from_directory() を使うと楽チンです。
OpenCVの画像で predictする
出来上がったモデルを使って、画像を分類してみます。JPEGファイルを読み込んで分類するなら、先ほどのblogにあるコードが使えます。
img = load_img('data/train/cats/cat.0.jpg') # this is a PIL image
x = img_to_array(img) # this is a Numpy array with shape (3, 150, 150)
x = x.reshape((1,) + x.shape) # this is a Numpy array with shape (1, 3, 150, 150)
x /= 255
この x を引数にして model.predict() を呼べばいいです。
しかし、OpenCV形式のデータを使うにはひと手間必要でした。
OpenCVの画像データは、すでに numpy の arrayでしたが、色の順番が BGR になっているので RGB へ変換が必要です。さらに、arrayの形を合わせるためにごにょごにょします。
x = cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.float32)
x = x.transpose((2, 0, 1))
x = x.reshape((1,) + x.shape)
x /= 255
Conclusions
Caffeに挫折した私ですが、Kerasならなんとかなりそうです。冒頭にあるYouTube動画のプログラムは 100行そこそこです。Python覚えてマジでよかったです。
Future work
バックギャモンのチェッカー認識にもチャレンジしようと思っています。
Acknowlegements
以下のページを参考にさせていただきました。