今回は、先日作成した手書き文字画像を分類するニューラルネットワークモデルを使って、Photoshopで用意した手書き風画像を正しく分類できるかを実験してみる。
使用するモデルは以下の記事で詳しくまとめている。
手書き風文字の用意
今回はPhotoshopのブラシツールを使って、8×8ピクセルのjpg画像を用意する。
ブラシツールで以下のとおり数字を書いてみる。
今回使用する分類器は、0〜9までの数字を分類するモデルなので、今回は適当に「2」を書いてみた。
完成したファイルは「num2.jpg」というファイル名にして保存する。
OpenCVを使った画像の読み込みとデータの前処理
画像の処理にはOpenCVというライブラリを使う。
インストールされていなければ、pipでインストールしてくれ。
とりあえず先にコードを紹介しよう。
import cv2
import itertools
import numpy as np
img = cv2.imread('num2.jpg')
# グレースケールに変換
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 白黒反転
img = cv2.bitwise_not(img)
# 2次元配列を1次元配列に平坦化し、ndarray型に変換
img = list(itertools.chain.from_iterable(img))
img = np.array([img])
何をしているかはコメントを見れば大体把握できるだろう。
まず、imread関数で画像の読み込みをおこなう。
これでRGB形式の色情報が、8×8(ピクセル数)×3(RGB)の配列に格納された。
次に、cvtColor関数でグレースケールに変換する。
こうすることで、RGBの情報がなくなり配列のサイズが8×8となる。
※分類モデルはグレースケールの画像にしか対応していないため配列のサイズを合わせる必要がある。
そして今回用意した画像は、モデルの学習で使った画像と白黒が逆になっているので、bitwise_not関数で白黒を反転させる。
最後に配列をndarray型に変換して、データの前処理は完了だ。
分類器を使ってテスト
あとはモデルに画像データを渡し、分類の結果を確認してみる。
# 分類実行
model.predict_classes(img, batch_size=1)
# array([2])
俺の作成したモデル(精度94%程度)では正しく手書き文字を分類することに成功した。