【サンプルコード】Python・KerasでCNN機械学習。自作・自前画像のオリジナルデータセットで画像認識入門

【サンプルコード】Python・KerasでCNN機械学習。自作・自前画像のオリジナルデータセットで画像認識入門

 

オリジナルデータセットで画像認識 | CNNサンプルコード – Colaboratory・Keras・Python

 

Google ColaboratoryでKerasを使って、自作・自前画像のオリジナルデータセットを活用して、ディープラーニング(深層学習)でおなじみの「畳み込みニューラルネットワーク」(CNN:Convolutional Neural Network)を実装出来るようにしたサンプルコードを作成してみました。

* Keras:Pythonで書かれているTensorFlow上などで実行可能な高水準のニューラルネットワークライブラリ

 

機械学習プログラミングを始めたものの、自前データセットの壁が超えられない・・・

オリジナルデータで自分の好きな画像認識に挑戦してみたい!

と考えている方の参考になることがありましたら幸いです。
オリジナルデータセットを使えることで、応用範囲は無限になるのではないかと思います。

 

【参考情報】

今回のサンプルコードではありませんが、MNISTの基本的なCNNの解説記事を作成しました。コード理解にお役立てください。
【コード解説】畳み込みニューラルネットワーク(CNN)サンプルコード – Colaboratory・Keras・MNIST

解説版も公開しました。学習の利便性を考えて記事をPDF化した印刷用PDFも公開中です。
【コード解説】自作画像認識AI:Keras・CNN・Pythonオリジナルデータセット対応の機械学習サンプルコード 

オリジナルデータセット編のFlask(Python)Web機械学習アプリ開発サンプルコードの日本語解説も公開しました。
【コード解説】自作画像認識編 Flask(Python)Web機械学習アプリ開発入門:画像アップロード判定プログラム 

このページのコードを改変して7セグメントのデジタル数字画像認識に挑戦
【4桁 – 7セグメント編】連続デジタル数字画像認識プログラミング入門(Python・OpenCV・Keras・CNN)

このページのコードを改変して日本語OCRに挑戦
【日本語手書きOCR編】連続文字画像認識プログラミング入門(Python・OpenCV・Keras・CNN

【情報】

この記事のサンプルコードを理解するために必要な画像認識関連の深層学習プログラミングの知識を学ぶ上で補助教材となりそうな書籍をレビューしておきました。日々の学習の一助になることがありましたら幸いです。

【1周目 – 学習レビュー】Pythonで動かして学ぶ!あたらしい深層学習の教科書 機械学習の基本から深層学習まで(Aidemy公式教科書)

 

2021年6月7日時点で、Google Colaboratoryに公開中のサンプルコードでエラーが出ないように修正しておきました。
2021年9月6日時点で、Google Colaboratoryに公開中のサンプルコードでエラーが出ないように修正しておきました。
2023年2月14日時点で、Google Colaboratoryに公開中のサンプルコードでエラーが出ないように修正しておきました。

 




 

オリジナルデータセット対応 | 人工知能(AI)プログラミング用データセット・サンプルコード・サンプルソース

 

 

【Google Colaboratory用のサンプルコードリンク | Python・Keras:自作データセットでCNNで学習・分類用】

 

実行環境 – Google Colaboratory

Google Colaboratoryで公開中のサンプルコードのページへ
program_Keras_cnn_originaldataset_basic.ipynb | Google Colaboratory共有リンク

 

サンプルコードで利用しているオリジナルデータセット(zip形式)

 

 

 

サンプルコードで、CNN学習モデルの結果を使い画像認識している○×画像

 

1.png

ダウンロード(○の画像)

2.png

ダウンロード(×の画像)

 

2020年9月30日以前の状態では、ファイル圧縮の兼ね合いで各画像(1.png・2.png)をダウンロード後に、パソコンで画像を開こうとしても正常に描画されていませんでしたので修正しておきました。

 

 

丸バツ判定AIできました。
【人工知能・機械学習プログラミングの進捗状況を報告】
Colaboratory・Keras・自前データセット(動画)

視聴時間:2分11秒

サンプルコードの動かし方がわからない方は、参考にしてみてください。
動画では、データセットの構造例や、Colaboratoryの環境にフォルダをアップロードする方法例を解説してあります。
今回のプログラムを動かすために必要なデータセットの構造例(機械学習用データセットの作り方)

dataset(フォルダ名)
circle(datasetフォルダ内のフォルダ名 – ラベル情報)
cross(datasetフォルダ内のフォルダ名 – ラベル情報)

* データセットの作り方は簡単です。「circle」「cross」の各フォルダ内に、対応する画像を配置するだけです。
* 画像の大きさは、特に指定はありません。バラバラの大きさでも実行できるようですが、必要に応じて調整してみてください。

 

Google Colaboratoryでプログラムを実行する際には、Googleアカウントが必要です。GPUも無料で使えるのでありがたいですね。
Google Colaboratory用のサンプルコードリンク先では、GPUを設定しています。

 

***以下:サンプルコード***

 

#① zipファイルをGoogle Colaboratoryにアップロードし、フォルダ化

!unzip dataset.zip #解凍:ここを変更。「dataset」のところをアップロードしたzipファイル名に変更してください。 - ファイルを消す場合「!rm data.zip」

 

#② 用意した自前画像で学習(畳み込みニューラルネットワーク:CNN)
#このプログラムでは、「判別したい “ラベル情報(フォルダ名)” と “画像” をセットにしたフォルダ」をアップロードすると動くようにしてあります。

#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 = 'dataset' # ここを変更。Colaboratoryにアップロードしたzipファイルを解凍後の、データセットのフォルダ名を入力

image_size = 28 # ここを変更。必要に応じて変更してください。「28」を指定した場合、縦28横28ピクセルの画像に変換します。

color_setting = 1  #ここを変更。データセット画像のカラー:「1」はモノクロ・グレースケール。「3」はカラー。

folder = ['circle', 'cross'] # ここを変更。データセット画像のフォルダ名(クラス名)を半角英数で入力

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_size, image_size))  
    elif color_setting == 3:
      img = load_img(file, color_mode = 'rgb' ,target_size=(image_size, image_size))
    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_size, image_size, 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=」の数字を変更してみてください。
history = model.fit(x_train,y_train, batch_size=2, epochs=5, 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()

open('cnn_model.json','w').write(model.to_json()) 
model.save_weights('cnn_weights.h5') 
#model.save('cnn_model_weight.h5') #モデル構造と重みを1つにまとめることもできます

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))

 

#③ 自前画像で判定(○×判定等)

#1 ライブラリのインポート等

import cv2 
import matplotlib.pyplot as plt
import numpy as np
from keras.models import model_from_json
#from keras.models import load_model #model = load_model('cnn_model_weight.h5') #model.save('cnn_model_weight.h5') で保存したファイルを読み込む場合に使用

#2 各種設定

recognise_image = '1.png' #ここを変更。画像認識したい画像ファイル名。(実行前に認識したい画像ファイルを1つアップロードしてください)


folder = ['○:丸', '×:バツ']  #ここを変更。今回は日本語の表示にしたかったので、folder = ['circle', 'cross'] の順番で日本語にしています。

image_size = 28 # ここを変更。「28」を指定した場合、縦28横28ピクセルの画像に変換
                # 「② 用意した自前画像で学習」と同じにする。

color_setting = 1  # ここを変更。画像認識する画像のカラー。「1」はモノクロ・グレースケール。「3」はカラー
                   # 「② 用意した自前画像で学習」と同じにする。

#3 各種読み込み
model = model_from_json(open('cnn_model.json', 'r').read())
model.load_weights('cnn_weights.h5')
#model = load_model('cnn_model_weight.h5') #model.save('cnn_model_weight.h5') で保存したファイルを読み込む場合に使用

#4 画像の表示・各種設定等
img = cv2.imread(recognise_image, 0)  #ここを変更。モノクロ・グレースケールの場合は「0」。カラーの場合は「1」 。         
img = cv2.resize(img, (image_size, image_size))
plt.imshow(img)
plt.gray()  #ここを変更。カラーの場合は「plt.gray()」を消す。モノクロ・グレースケールの場合は「plt.gray()」が無いと変な色になります。
plt.show()

img = img.reshape(image_size, image_size, color_setting).astype('float32')/255 

#5 予測と結果の表示等
prediction = model.predict(np.array([img]), batch_size=2, verbose=1)
result = prediction[0]

for i, accuracy in enumerate(result):
  print('画像認識AIは「', folder[i], '」の確率を', int(accuracy * 100), '% と予測しました。')

print('-------------------------------------------------------')
print('画像認識AI:○ or × の予測結果は、「', folder[result.argmax()],'」です。')

* 「acc」「val_acc」ではエラーが出るので「accuracy」「val_accuracy」に変更したのに伴い、こちらのコードでも「acc」を「accuracy」に変更しておきました。

 

***終わり:サンプルコード***

 

 

【応用例】M5core2で7セグメント文字をリアルタイム画像認識

 

 

AI・IoT関連の開発をされている

Defios株式会社

の社員の方が書かれているブログで、このページのプログラムを参考にしていただきモデルを学習し、M5core2でリアルタイム画像認識をされた記事

M5CORE2でリアルタイム7SEG推論 – 2023年12月 | Defios Lab

を公開してくださっていました。
ブログのサイト自体も、こだわり抜かれた感じを受けました。工場のIoT化に興味のある方にとっては、貴重な情報ではないかと思いますので、ぜひ詳細をチェックしてみてください。

また、活用したプログラムも公開してくださっているようでしたのでM5core2でリアルタイム画像認識に関心のある方は以下のプログラムもチェックしてみてください。

DefiosLab/M5_7seg_program | GitHub

 

 

【応用例】ローカル環境でAIプログラムを実行の際に遭遇するエラーと対応例

 

 

ITエンジニア特化型Q&Aサイトの

teratail(テラテイル)| レバレジーズ株式会社

を見てみると、この記事のコードを改変したプログラムを、Windows 11のローカル環境でanacondaを利用してコードを実行した際のエラーと解決例について投稿されているようでした。

ディープラーニングの学習過程におけるエラーについて 2022年8月投稿 | teratail(テラテイル)

一連の質問へのコメントを確認してみると、回答してくださっているWindows 10の環境の方は、コードを実行出来ているようでしたが、質問者の環境では学習中に

Process finished with exit code -1073740791 (0xC0000409)

というエラーが出るようでした。GPUを使う際に諸々の環境が合わないとエラーとなるようです。
同様のエラーでお困り中の方は、質問ページをチェックしてみてください。

 

 

ディープラーニング学習向けのPythonサンプルコードとして紹介

 

 

情報を探してみると、2022年にAIなどのテーマについて情報発信してくださっているメディアでお馴染みの

AINOW(エーアイナウ)| ディップ株式会社

の記事

ディープラーニングにPythonを使う本当の理由|適したライブラリと勉強方法を解説!- ディープラーニングのためのPythonサンプルコード(2022年6月)| AINOW

で、このページのプログラムを、ディープラーニング学習向けのPythonサンプルコードの1例として紹介してくださっているようでした。(2022年9月確認時点)
ありがとうございます。

このサイトでは、訪問してくださったAI初学者の方がAIプログラミングの学習の幅を広げられるように、このページのコードを応用した以下の

 

【動画チュートリアル】7セグメントのデジタル数字画像認識AI開発に挑戦
【Python機械学習入門】高精度の自作OCRを作ろう(7セグメントデジタル連続数字画像認識AI:1桁〜4桁 – 静止画トリミング編)by RehabC – デジタルで、遊ぶ。(YouTube動画)
視聴時間:30分36秒

【記事ページ】7セグメントのデジタル数字画像認識AI開発に挑戦
【4桁 – 7セグメント編】連続デジタル数字画像認識プログラミング入門(Python・OpenCV・Keras・CNN)

 

【動画チュートリアル】日本語OCR開発に挑戦
Pythonではじめる日本語OCR開発 – 手書き文字認識編 by RehabC – デジタルで、遊ぶ。(YouTube動画)
視聴時間:1時間12分38秒

【記事ページ】日本語OCR開発に挑戦
【日本語手書きOCR編】連続文字画像認識プログラミング入門(Python・OpenCV・Keras・CNN

 

AIプログラミングのサンプルコードも、すぐに試せるように公開中ですので、ご興味のある方は、学習の進捗状況に合わせてご活用頂けますと幸いです。

 

 

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

 

 

Webアプリ化に挑戦 – この記事のサンプルコードを活用して機械学習Webアプリ開発
【コード解説】自作画像認識編 Flask(Python)Web機械学習アプリ開発入門:画像アップロード判定プログラム