動画:【4桁 – 7セグメント編】連続デジタル数字画像認識プログラミング入門(Python・OpenCV・Keras・CNN)
【Python機械学習入門】高精度の自作OCRを作ろう
7セグメントデジタル連続数字画像認識AI:1桁〜4桁 – 静止画トリミング編(7 Segment Digits Training)
視聴時間:30分36秒
使い方がわからない方は動画の該当箇所をご視聴いただけますと幸いです。
【動画の内容】
0:00 はじめに – 7セグメントデジタル数字OCRについて
3:14 ステップ1 – 学習済みモデルの作成 ← ここ
9:58 ステップ2 – 1文字判定 7セグメントデジタル数字
16:24 ステップ3 – 1桁〜4桁の連続文字認識+再学習
29:14 おわりに – AIを賢く
【コードの修正情報:2021年6月7日】
2021年6月7日時点で、Google Colaboratoryに公開中のサンプルコードでエラーが出ないように修正しておきました。
【コードの修正情報:2021年9月6日】
②のコード内の「#1 各種インポート」の
from keras.optimizers import Adam
でエラーとなるため修正しておきました。
不具合を教えてくださった方、ありがとうございました。
【コードの修正情報:2023年2月14日】
②のコード内の「#1 各種インポート」の
# from keras.preprocessing.image import load_img, img_to_array
でエラーとなるため修正しておきました。
不具合を教えてくださった方、ありがとうございました。
機械学習モデルのディープラーニング(深層学習)でおなじみの「畳み込みニューラルネットワーク」(CNN:Convolutional Neural Network)で、7セグメントのデジタル数字画像のオリジナルデータセットを学習させて、学習済みモデルを作成できる簡単なプログラムを作成してみました。
既存のOCRプログラムで7セグメントのデジタル数字認識をしてみても、思ったよりも上手く行かない経験をされる方もいるのではないかと思います。
一連のプログラムが、これから、計量器や時計、温度計をはじめとしたデジタル数字認識に挑戦したい方の参考になることがありましたら幸いです。
7 Segment Edition(Seven Segment Edition)
:How to Create an Original Trained Model.
Introduction to Continuous Digital Number Display Image Recognition Python Programming.
今回のプログラムは、以前投稿させていただいた
:【コード解説】自作画像認識AI:Keras・CNN・Pythonオリジナルデータセット対応の機械学習サンプルコード
のオリジナルデータセットで自作画像認識AIを作れるプログラムを改変して作っています。そのため、AIプログラムの詳細を知りたい方は、記事ページを参照ください。Google Colaboratoryですぐに試せる、サンプルコードと学習用のPDFなども無料公開しています。
サンプル画像・サンプルコードリンク:7セグメント連続デジタル数字画像認識プログラム用
7セグメントのデジタル数字画像認識用オリジナルデータセット
ダウンロード:7セグメントのデジタル数字画像認識用オリジナルデータセット
7セグメントのデジタル数字画像の学習済みモデル作成プログラムで試せるサンプルデータセットです。
すぐに使えるGoogle Colaboratoryサンプルコードリンク
Keras_CNN_7segment_digits_originaldataset.ipynb | Google Colaboratory
(ファイル – ドライブにコピーを保存後にコピー環境で実行)
【プログラムのライセンス】
The MIT License
Copyright 2021 child programmer
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
【7セグメントのデジタル数字認識用:Pythonサンプルコード】
KerasでCNN機械学習。自作・自前画像のオリジナルデータセットで画像認識入門
以下の①②の手順を順番に実行すると.h5形式の「model.h5」という名前の学習済みモデル(機械学習モデル構造+学習済みの重み)が出力されます。
その後、ローカル環境(自分のパソコン)にダウンロードして使えます。
① zipファイルをGoogle Colaboratoryにアップロードし、フォルダ化
② 用意した自前画像で学習(畳み込みニューラルネットワーク:CNN)
バージョン情報(Python・各種ライブラリ)
python 3.7.10
tensoflow 2.5.0
keras 2.5.0
sklearn(scikit-learn) 0.22.2.post1
opencv(opencv-python)4.1.2
matplotlib 3.2.2
ローカル環境で、指定したバージョンのインストールが難しい場合、Python・TensorFlow・Keras以外は最新のバージョンを入れてみてください。
mata
また、Google Colaboratoryのサンプルコードではランタイム:GPUで実行しています。
【2021年9月6日にコード修正時点のバージョン】
python 3.7.11
tensoflow 2.6.0
keras 2.6.0
sklearn(scikit-learn) 0.22.2.post1
opencv(opencv-python)4.1.2
matplotlib 3.2.2
【2023年2月14日にコード修正時点のバージョン】
python 3.8.10
tensoflow 2.11.0
keras 2.11.0
sklearn(scikit-learn) 1.0.2
opencv(opencv-python)4.6.0
matplotlib 3.2.2
① zipファイルをGoogle Colaboratoryにアップロードし、フォルダ化
オリジナルデータセットをアップロードします。
このプログラムでは、「判別したい “ラベル情報(フォルダ名)” と “画像” をセットにしたフォルダ」をアップロードすると動くようにしてあります。
今回のプログラムを動かすために必要なデータセットの構造例(機械学習用データセットの作り方)
dataset(フォルダ名)
— 0(datasetフォルダ内のフォルダ名 – ラベル情報)
— 1(datasetフォルダ内のフォルダ名 – ラベル情報)
— 2(datasetフォルダ内のフォルダ名 – ラベル情報)
— 3(datasetフォルダ内のフォルダ名 – ラベル情報)
— 4(datasetフォルダ内のフォルダ名 – ラベル情報)
— 5(datasetフォルダ内のフォルダ名 – ラベル情報)
— 6(datasetフォルダ内のフォルダ名 – ラベル情報)
— 7(datasetフォルダ内のフォルダ名 – ラベル情報)
— 8(datasetフォルダ内のフォルダ名 – ラベル情報)
— 9(datasetフォルダ内のフォルダ名 – ラベル情報)
— blank:空白(datasetフォルダ内のフォルダ名 – ラベル情報)
* データセットの作り方は簡単です。「0」〜「9」「blank」の各フォルダ内に、対応する画像を配置するだけです。
画像の大きさは、特に指定はありません。バラバラの大きさでも実行できるようですが、必要に応じて調整してみてください。
* サンプルデータセットでは「7segment_digits_dataset」というフォルダ名にしています。
!unzip 7segment_digits_dataset.zip #解凍:ここを変更。「dataset」のところをアップロードしたzipファイル名に変更してください。- ファイルを消す場合「!rm dataset.zip」
② 用意した自前画像で学習・学習済みモデルの保存(畳み込みニューラルネットワーク:CNN)
デフォルトでは、
:画像のカラーモード – モノクロ・グレースケール
:学習時の画像の大きさ – 横の幅28・縦の高さ28ピクセル
の「model.h5」という名前の学習済みモデルが保存されます。
#1 ライブラリのインポート等
import keras
import glob
import numpy as np
from sklearn.model_selection import train_test_split
# from keras.preprocessing.image import load_img, img_to_array #ここでエラーとなるので以下のコードに変更
from tensorflow.keras.utils import load_img, img_to_array
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Dense, Dropout, Flatten
#from keras.utils import plot_model #これはKerasのバージョンなどにより使えないのでコメントアウト
from keras.utils import np_utils #keras.utils.to_categoricalでエラーが出るので追加
# from keras.optimizers import Adam # ここでエラーとなるので以下のコードに変更
from tensorflow.keras.optimizers import Adam # 「tensorflow.」を追加
import matplotlib.pyplot as plt
import time
#2 各種設定
train_data_path = '7segment_digits_dataset' # ここを変更。Colaboratoryにアップロードしたzipファイルを解凍後の、データセットのフォルダ名を入力
image_width = 28 # ここを変更。必要に応じて変更してください。「28」を指定した場合、縦の高さ28ピクセルの画像に変換します。
image_height = 28 # ここを変更。必要に応じて変更してください。「28」を指定した場合、横の幅28ピクセルの画像に変換します。
# 画像のサイズは、原寸大や長方形などでも試してみましたが、少ない学習回数で実際の正解率が高いのは28*28の正方形でした。
color_setting = 1 #ここを変更。データセット画像のカラー指定:「1」はモノクロ・グレースケール。「3」はカラーとして画像を処理。
folder = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'blank'] #データセット画像のフォルダ名(クラス名)
class_number = len(folder)
print('今回のデータで分類するクラス数は「', str(class_number), '」です。')
#3 データセットの読み込みとデータ形式の設定・正規化・分割
X_image = []
Y_label = []
for index, name in enumerate(folder):
read_data = train_data_path + '/' + name
files = glob.glob(read_data + '/*.png') # ここを変更。png形式のファイルを利用する場合のサンプルです。
print('--- 読み込んだデータセットは', read_data, 'です。')
for i, file in enumerate(files):
if color_setting == 1:
img = load_img(file, color_mode = 'grayscale' ,target_size=(image_width, image_height))
elif color_setting == 3:
img = load_img(file, color_mode = 'rgb' ,target_size=(image_width, image_height))
array = img_to_array(img)
X_image.append(array)
Y_label.append(index)
X_image = np.array(X_image)
Y_label = np.array(Y_label)
X_image = X_image.astype('float32') / 255
#Y_label = keras.utils.to_categorical(Y_label, class_number) #Kerasのバージョンなどにより使えないのでコメントアウト
Y_label = np_utils.to_categorical(Y_label, class_number) #上記のコードのかわり
train_images, valid_images, train_labels, valid_labels = train_test_split(X_image, Y_label, test_size=0.10)
x_train = train_images
y_train = train_labels
x_test = valid_images
y_test = valid_labels
#4 機械学習(人工知能)モデルの作成 – 畳み込みニューラルネットワーク(CNN)・学習の実行等
model = Sequential()
model.add(Conv2D(16, (3, 3), padding='same',
input_shape=(image_width, image_height, color_setting), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, (3, 3), padding='same', activation='relu'))
model.add(Conv2D(256, (3, 3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(class_number, activation='softmax'))
model.summary()
#plot_model(model, to_file='model.png') #ここはKerasのバージョンなどにより使えないのでコメントアウト
model.compile(loss='categorical_crossentropy',
optimizer=Adam(),
metrics=['accuracy'])
start_time = time.time()
# ここを変更。必要に応じて「batch_size=」(バッチサイズ:重みとバイアスの更新を行う間隔の数)「epochs=」(学習回数)の数字を変更してみてください。
# モノクロ・グレースケールでは「batch_size=4, epochs=10」、カラーでは「batch_size=4, epochs=20」程度でも比較的良い成績が得られました。
history = model.fit(x_train,y_train, batch_size=4, epochs=10, verbose=1, validation_data=(x_test, y_test))
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.grid()
plt.legend(['Train', 'Validation'], loc='upper left')
plt.show()
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.grid()
plt.legend(['Train', 'Validation'], loc='upper left')
plt.show()
score = model.evaluate(x_test, y_test, verbose=0)
print('Loss:', score[0], '(損失関数値 - 0に近いほど正解に近い)')
print('Accuracy:', score[1] * 100, '%', '(精度 - 100% に近いほど正解に近い)')
print('Computation time(計算時間):{0:.3f} sec(秒)'.format(time.time() - start_time))
# 学習済みモデル(モデル構造と学習済みの重み)の保存
model.save('model.h5')
#model.save('keras_cnn_7segment_digits_gray28*28_model.h5') #名前は自分がわかりやすい名前にしてください。モノクロ・グレー形式の学習済みモデルの例:color_setting = 1 にした場合
#model.save('keras_cnn_7segment_digits_color28*28_model.h5') #カラー形式の学習済みモデルの例:color_setting = 3 にした場合
続いて、作成した7セグメントデジタル数字の学習済みモデル「model.h5」を使い、1文字の画像認識をさせてみましょう。
:【7セグメント編】1文字判定(デジタル数字:0〜9+空白)
:【4桁 – 7セグメント編】連続デジタル数字画像認識プログラミング入門講座(Python・OpenCV・Keras・CNN)| 一覧ページ