スポンサーリンク

【機械学習】Pythonでひらがな(日本語)の文字分類手順。〜 Keras使用 〜

Keras
スポンサーリンク

今回の記事は日本語のひらがなを自作ニューラルネットで分類する方法について記載いたします。

ニューラルネットの高瀬に関してはネットにあるものを使用していますが、中間層などの数をいくつか変更しては見たのですが特に識別率に変化が見られなかったため元の転がっているものを使っております。後ほど後述します。

スポンサーリンク

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を読み込んで任意画像を識別させる記事も挙げておきますのでひらがな識別のテストに使用して見て下さい。

本記事を読んでいただき感謝です。サイトを訪れていただいた方はプログラミング勉強中かと思いますのでプログラミング勉強のコツを合わせてご紹介。

スポンサーリンク
スポンサーリンク
スポンサーリンク

ブログに関しては500円程度かかりますが、それ以外は無料です。知識の吸収と並行してアウトプットは非常に効率が良いです。テックアカデミーに関しては講座レベルが高いにも関わらず、無料体験や人気口座も大幅値下げがあるので、重点的に学びたいものを無料体験してみてください。

転職時にも、エンジニアからテックアカデミー・Paizaは認知度が高いので、未経験入社採用を行う際履歴書で目に留まります。特にPaizaのスキルレベルA・SなどはIT業界でも評価されます。

テックアカデミー・Paizaの無料登録ができる期間中にぜひご利用してみてください。私も活用経験ありです。

Keras
スポンサーリンク
スポンサーリンク

コメント

  1. […] ここまで来れればあとは自作AIモデルの作成や既存のAIモデルを利用して、画像の分類を行ってみましょう。私の記事でも多数書いておりますがまずはmnistモデルで数字画像を分類してみたり、こちらの記事のように「自作AIモデルでひらがなの「あ」「い」を分類してみる」などを行ってみましょう。 […]

  2. […] 「日本語文字を画像分類する方法」 […]

  3. […] 「【Python】日本語の文字分類を行う方法ご紹介。」 […]

タイトルとURLをコピーしました