学習モデルを使って手書き数字を判定

前回作成した学習モデルを使って手書き数字を判定します。

判定したい画像ファイルを36行目に指定して実行します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from __future__ import print_function
import argparse

import chainer
import chainer.functions as F
import chainer.links as L
import chainer.initializers as I
from chainer import training
from chainer.training import extensions
from PIL import Image
import numpy as np

class MLP(chainer.Chain):
def __init__(self, n_units, n_out):
w = I.Normal(scale=0.05) # モデルパラメータの初期化
super(MLP, self).__init__(
conv1=L.Convolution2D(1, 16, 5, 1, 0), # 1層目の畳み込み層(フィルタ数は16)
conv2=L.Convolution2D(16, 32, 5, 1, 0), # 2層目の畳み込み層(フィルタ数は32)
l3=L.Linear(None, n_out, initialW=w), #クラス分類用
)
def __call__(self, x):
h1 = F.max_pooling_2d(F.relu(self.conv1(x)), ksize=2, stride=2) # 最大値プーリングは2×2,活性化関数はReLU
h2 = F.max_pooling_2d(F.relu(self.conv2(h1)), ksize=2, stride=2)
y = self.l3(h2)
return y
"""
自分で用意した手書き文字画像をモデルに合うように変換する処理
"""
def convert_cnn(img):
data = np.array(Image.open(img).convert('L').resize((28, 28)), dtype=np.float32) # ファイルを読込み,リサイズして配列に変換
data = (255.0 - data) / 255.0 # 白黒反転して正規化
data = data.reshape(1, 1, 28, 28) # データの形状を変更
return data

def main():
inputimage = '3.png' # 入力する画像
modelfile = 'result/MLP.model' # 学習済みモデルファイル
unit = 1000 # ユニット数

print('自分の手書き文字を学習したモデルで評価してみるプログラム')
print('# 入力画像ファイル: {}'.format(inputimage))
print('# 学習済みモデルファイル: {}'.format(modelfile))
print('')

# モデルのインスタンス作成
model = L.Classifier(MLP(unit, 10))
# モデルの読み込み
chainer.serializers.load_npz(modelfile, model)

# 入力画像を28x28のグレースケールデータ(0-1に正規化)に変換する
img = convert_cnn(inputimage)
x = chainer.Variable(np.asarray(img)) # 配列データをchainerで扱う型に変換

y = model.predictor(x) # フォワード
c = F.softmax(y).data.argmax()
print('判定結果は{}です。'.format(c))

if __name__ == '__main__':
main()

200x200の画像ファイルに手書きで数字をかいた画像ファイルを3つ用意して判定しました。

[入力ファイル]
手書きの3
[結果]

1
2
3
4
5
自分の手書き文字を学習したモデルで評価してみるプログラム
# 入力画像ファイル: 3.png
# 学習済みモデルファイル: result/MLP.model

判定結果は3です。

[入力ファイル]
手書きの5
[結果]

1
2
3
4
5
自分の手書き文字を学習したモデルで評価してみるプログラム
# 入力画像ファイル: 5.png
# 学習済みモデルファイル: result/MLP.model

判定結果は5です。

[入力ファイル]
手書きの9
[結果]

1
2
3
4
5
自分の手書き文字を学習したモデルで評価してみるプログラム
# 入力画像ファイル: 9.png
# 学習済みモデルファイル: result/MLP.model

判定結果は3です。

1問不正解となりました。。。最後の手書き数字はどうみても9ですよね。

(Google Colaboratoryで動作確認しています。)