今回の記事は日本語のひらがなを自作ニューラルネットで分類する方法について記載いたします。
ニューラルネットの高瀬に関してはネットにあるものを使用していますが、中間層などの数をいくつか変更しては見たのですが特に識別率に変化が見られなかったため元の転がっているものを使っております。後ほど後述します。
Kerasの識別モデル作成の大まかな流れ
Kerasの学習モデルの大まかな流れは簡単です。まずは識別対象になる画像を集めます。
今回で言うとひらがなですのでひらがな全てを集めます。とかは流石に学習の時間がかかりすぎますし、PCスペック的にしんどいのでひらがな の「あ」と「い」のみの学習です。
適宜クラスを増やせば47文字識別も可能なのでクラスの記述場所はコードないにて記載します。
まずは画像を必要数集めます。枚数は下記の訓練データの章にて記載。
訓練データの収集と整理と水増し
必要がぞう枚数ですが、私の経験識別用の各クラスの最低画像数は100枚程度と感じました。ちなみにその際の識別クラス数は50クラス程度でしたので今回の様に2クラスに識別するのみの場合はもっと画像が少なくても問題ないと思われます。
では画像を集めます。と言うか増やします。
10枚程度はネット検索と画面切り取りで画像が集まると思いますのでその画像をKerasのメソッドを使って水増ししていきます。下記にその参考記事がありますので参照ください。
回転は文字なのであんまり多用すると違う文字になってしまうかもです。こちらで画像を増やしたらあとはフォルダを分けて一つのフォルダに格納します。
├── a
│ └── a.jpg
└── i
└── i.jpg
識別用のコードと解説
では実際にコードです。
コードは下記のディレクトリに入れとけばOK!
ただ、Kerasのインストールは忘れない様にしてください。pip installでOKです。
import keras
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.layers.core import Dense, Dropout, Activation, Flatten
import numpy as np
from sklearn.model_selection import train_test_split
from PIL import Image
import glob
folders = ['a','i']
print("147,151,149,152,154,153,154,137,149,153,158,158,157,157,154,152")
X = []
Y = []
image_size = 50
# 対象Aの画像
index = 0
for folder in folders:
files = glob.glob('./test/' + str(folder) + '/*.JPG')
print(files)
for file in files:
print(file)
image = Image.open(file)
image = image.convert("RGB")
image = image.resize((image_size, image_size))
data = np.asarray(image)
X.append(data)
Y.append(index)
index = index + 1
X = np.array(X)
Y = np.array(Y)
X = X.astype('float32')
X = X / 255.0
# 正解ラベルの形式を変換
Y = np_utils.to_categorical(Y, 16)
# 学習用データとテストデータ
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.20)
# CNNを構築
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',input_shape=X_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(16))
model.add(Activation('softmax'))
# コンパイル
model.compile(loss='categorical_crossentropy',optimizer='SGD',metrics=['accuracy'])
history = model.fit(X_train, y_train, epochs=200)
print("完了")
model.save('/only_test/model.hdf5')
print("保存完了")
まず初めに必要なモジュールのインポートがあって、その後に画像の読み込みを行っております。
画像の読み込み時はPILのImageを使って読み込んでおります。読み込み時に配列として良j見込んでおり、データyの方は成果ラベルが同時に入っております。
この読み込んだ画像の配列データを下のmodelで学習させていく流れです。
細かい処を見ていくとmodelの作成の流れはSequential()でニューラルネットを定義して必要な中間層にあたる関数メソッドをaddで追加していく流れです。
Kerasは記述がわかりやいのでありたいです。conv2Dとかは畳み込み積分で画像サイズが大きいと特徴量が抽出しにくいので使用しているのかなと思ってます。
てな感じです。学習精度とかに関しては確認して見てください。
ほぼ行けてます。念のためKerasのModelを読み込んで任意画像を識別させる記事も挙げておきますのでひらがな識別のテストに使用して見て下さい。
コメント
[…] ここまで来れればあとは自作AIモデルの作成や既存のAIモデルを利用して、画像の分類を行ってみましょう。私の記事でも多数書いておりますがまずはmnistモデルで数字画像を分類してみたり、こちらの記事のように「自作AIモデルでひらがなの「あ」「い」を分類してみる」などを行ってみましょう。 […]
[…] 「日本語文字を画像分類する方法」 […]
[…] 「【Python】日本語の文字分類を行う方法ご紹介。」 […]