CNNでマスクつけてるかどうかの画像判定

f:id:hanamichi_sukusuku:20210304102751p:plain

f:id:hanamichi_sukusuku:20210304102815p:plain

実行結果

f:id:hanamichi_sukusuku:20210304102837p:plain

このプログラムでは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])
read_files("imageset/mask_on_test/*.jpg", [0,1])
x_test, y_test = (np.array(x), np.array(y))

テスト用の画像データをread_filesで処理する際、x,y = [,]と定義し直しているのは中身を空にするため。

それぞれ最後にnumpy形式に変換し学習用、テスト用の変数に格納。

 

read_files()関数、画像データとラベルデータに分割し新たな配列を作成

f:id:hanamichi_sukusuku:20210304104721p:plain

引数に画像データが格納されているパスとラベルデータを渡す。

opencvでデータを読み込んで、画像データ、ラベルデータを空のリストに追加していく。

 

学習

f:id:hanamichi_sukusuku:20210304105000p:plain

 

テストデータを評価しモデルの保存

score = model.evaluate(x_test, y_test, verbose=1)
print("正解率=", score[1], 'loss=', score[0])
# モデルを保存 --- (※6)
model.save('mask_model.h5')

 

学習の様子を描画

plt.plot(hist.history['accuracy'])
plt.plot(hist.history['val_accuracy'])
plt.title('Accuracy')
plt.legend(['train', 'test'], loc='upper left')
plt.show()