【サンプルコード】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オリジナルデータセット対応の機械学習サンプルコード 

【情報】

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

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

 




 

オリジナルデータセット対応 | 人工知能(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 keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Dense, Dropout, Flatten
from keras.utils import plot_model
from keras.optimizers import Adam
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)

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

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['acc'])
plt.plot(history.history['val_acc'])
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')

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

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

#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, acc in enumerate(result):
print('画像認識AIは「', folder[i], '」の確率を', int(acc * 100), '% と予測しました。')

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

 

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

 




 

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