【4桁】連続数字画像認識プログラミング入門(Python・OpenCV・SVM)

【4桁】連続数字画像認識プログラミング入門(Python・OpenCV・SVM)

 

動画:【4桁に挑戦】手書き連続数字画像認識プログラミング入門(Python・OpenCV・SVM)

 


視聴時間:2分36秒

機械学習モデルのサポートベクターマシーン(SVM:support vector machine)で手書き数字画像を学習後、800 × 200(横800 × 縦200)の画像に4等分に数字が配置されている場合に活用できる、4桁の数字を認識できる簡単なプログラムを作成してみました。

 




 

今回のプログラムは、以前YouTubeに投稿させていただいた以下の数字画像認識プログラムを改変して作っています。
興味のある方は、併せてご活用ください。

Pythonで機械学習・人工知能(AI)プログラミング入門 | scikit-learn SVM 学習データの確認〜画像認識(数値予測)編 by RehabC – デジタルで遊ぶ。(YouTube動画)

 

 

サンプル画像・サンプルコードリンク:手書き連続数字画像認識プログラム

 

【4桁】連続数字画像認識プログラミング入門(Python・OpenCV・SVM)で試せるサンプル画像です。
動画のデモで利用した画像です。

 

すぐに使えるGoogle Colaboratoryサンプルコードリンク

SVM-4digits-recognition.ipynb | Google Colaboratory
https://colab.research.google.com/drive/1MzBfQPdJ3Dn0IC1CN2Yzv5N6phOymPEm?usp=sharing

 

数字画像認識 – 4桁の連続数字認識(連続文字認識):
800 × 200(横800 × 縦200)の画像を4等分し、個別に認識した結果をまとめて表示させることで4桁の連続数字を認識できるプログラムです。

print(‘認識結果(予測結果):’, int(n1), int(n2), ‘.’ ,int(n3), int(n4))
などとプログラムを変更すると小数点も入れられます。

学習データが手書き数字文字のため、デジタルの数字(7セグメント)は認識しにくいかもしれません。

・機械学習モデル:SVM(Support Vector Machine:サポートベクターマシン )
・データセット:手書き数字画像

*ローカル環境で行うには、事前にOpenCV(cv2)のインストールが必要です。

 

import sklearn.datasets
import sklearn.svm
import numpy
import PIL.Image
import matplotlib.pyplot as plt
import cv2

#画像の読み込み
img = cv2.imread('4508_800*200.png') #ここに数字画像認識をしたい画像を入れます

#画像のトリミング [y1:y2, x1:x2]
data1 = img[0:800, 0:200] #yの範囲が0〜800・xの範囲が0〜200までをトリミング
data2 = img[0:800, 200:400] #yの範囲が0〜800・xの範囲が200〜400までをトリミング
data3 = img[0:800, 400:600] #yの範囲が0〜800・xの範囲が400〜600までをトリミング
data4 = img[0:800, 600:800] #yの範囲が0〜800・xの範囲が600〜800までをトリミング

#トリミングした画像を保存
cv2.imwrite('data1.png', data1)
cv2.imwrite('data2.png', data2)
cv2.imwrite('data3.png', data3)
cv2.imwrite('data4.png', data4)

#4桁目の画像の数値リスト化(データ化)と、手書き数字のデータセットでの学習と予測
gazou = PIL.Image.open('data1.png').convert("L")
gazou = gazou.resize((8,8),PIL.Image.ANTIALIAS)
suuti = numpy.asarray(gazou, dtype = float)
suuti = numpy.floor(16 - 16 * (suuti / 256))
suuti = suuti.flatten()

suuji = sklearn.datasets.load_digits()
ai = sklearn.svm.SVC(gamma = 0.001)
ai.fit(suuji.data, suuji.target)
n1 = ai.predict(suuti.reshape(1, -1))

#3桁目の画像の数値リスト化(データ化)とと予測
gazou = PIL.Image.open('data2.png').convert("L")
gazou = gazou.resize((8,8),PIL.Image.ANTIALIAS)
suuti = numpy.asarray(gazou, dtype = float)
suuti = numpy.floor(16 - 16 * (suuti / 256))
suuti = suuti.flatten()

n2 = ai.predict(suuti.reshape(1, -1))

#2桁目の画像の数値リスト化(データ化)と予測
gazou = PIL.Image.open('data3.png').convert("L")
gazou = gazou.resize((8,8),PIL.Image.ANTIALIAS)
suuti = numpy.asarray(gazou, dtype = float)
suuti = numpy.floor(16 - 16 * (suuti / 256))
suuti = suuti.flatten()

n3 = ai.predict(suuti.reshape(1, -1))

#1桁目の画像の数値リスト化(データ化)と予測
gazou = PIL.Image.open('data4.png').convert("L")
gazou = gazou.resize((8,8),PIL.Image.ANTIALIAS)
suuti = numpy.asarray(gazou, dtype = float)
suuti = numpy.floor(16 - 16 * (suuti / 256))
suuti = suuti.flatten()

n4 = ai.predict(suuti.reshape(1, -1))

#結果の表示(個別に認識した結果を4桁目から順番に並べています)
print('認識結果(予測結果):', int(n1), int(n2), int(n3), int(n4))

print('\n\n【今回認識した元の画像】')

#元の画像を4分割でトリミングした画像の表示:複数の画像を表示させる
img_list=[data1, data2, data3, data4]
for bangou, imagenamae in enumerate(img_list):
plt.subplot(2, 4, bangou+1) #(行数,列数,何番目に画像を表示させるか)
plt.axis("off") #画像の軸をオフ
plt.title('data' +str(bangou+1))
plt.imshow(cv2.cvtColor(imagenamae, cv2.COLOR_BGR2RGB))

 

by 子供プログラマー | プログラミング入門ウェブ教室

 

 

【Python等】OCRプログラミング入門講座(一覧)

 

【音声認識】

【Python入門】日本語の文字起こしのやり方(音声認識:音声ファイル編)サンプルコード 

 

【音声合成】

【PyTorch入門】日本語のテキスト音声合成(E2E-TTS)- ESPnet・Tacotron 2版