CNNでマスクつけてるかどうかの画像判定
実行結果
このプログラムではCNNモデルを使用してマスクをつけている画像かそうでない画像かの判定を行う。
画像形式の指定
in_shape = (50, 50, 3)
nb_classes = 2
in_shapeは入力値。
nd_classは出力値。
モデル構築
model = Sequential()
model.add(Conv2D(32,
kernel_size=(3, 3),
activation='relu',
input_shape=in_shape))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes, activation='softmax'))
# モデルをコンパイル --- (※3)
model.compile(
loss='categorical_crossentropy',
optimizer=RMSprop(),
metrics=['accuracy'])
畳み込み、畳み込み、プーリング、ドロップアウトを2回繰り返し、平滑化、全結合層、ドロップアウト、出力層、という流れでCNNモデルの定義し、コンパイルする。
read_files()関数を呼び出し、学習用、テスト用のデータに変換
read_files("imageset/mask_off/*.jpg", [1,0])
read_files("imageset/mask_on/*.jpg", [0,1])
x_train, y_train = (np.array(x), np.array(y))
# テスト用の画像をNumpy形式で得る
x, y = [, ]
read_files("imageset/mask_off_test/*.jpg", [1,0])
x_test, y_test = (np.array(x), np.array(y))
テスト用の画像データをread_filesで処理する際、x,y = [,]と定義し直しているのは中身を空にするため。
それぞれ最後にnumpy形式に変換し学習用、テスト用の変数に格納。
read_files()関数、画像データとラベルデータに分割し新たな配列を作成
引数に画像データが格納されているパスとラベルデータを渡す。
opencvでデータを読み込んで、画像データ、ラベルデータを空のリストに追加していく。
学習
テストデータを評価しモデルの保存
score = model.evaluate(x_test, y_test, verbose=1)
print("正解率=", score[1], 'loss=', score[0])
# モデルを保存 --- (※6)
model.save('mask_model.h5')
学習の様子を描画
plt.title('Accuracy')
plt.legend(['train', 'test'], loc='upper left')
plt.show()