Keras CNN
2021.11.10 更新
新型コロナウィルスの流行で、普段の生活の中で常にマスクをつけることが当たり前の世の中になっていると思います。 カメラに写る人がマスクをしているかどうかを判定する画像分類モデルがあれば、さまざまな場面で活用できそうです。
今回は、EfficientNetモデルの転移学習を用いて、マスクあり/なし判定を行う画像分類モデルを構築してみたいと思います。
EfficientNetは、2019年にGoogleが発表したモデルです。それまでのResNetに代表されるような、より多層にすることで高性能の目指す考え方ではなく、効率的なパラメータ数で、高い精度を出すことを目指したモデルです。
Kaggleなどのコンペでも転移学習のベースとしてよく用いられており、AIを応用することに主眼をおく弊社としても、ぜひ検証しておきたいモデルです。
論文)https://arxiv.org/abs/1905.11946
EfficientNetは、B0からB7のモデルがあり、数字が上がるにしたがってパラメータ数が大きくなり、精度も向上します。下図はImageNetによる分類性能をEfficientNet以外のモデルも含めて比較したものです。
下表からも、他と比べてかなり小さなモデルで高い性能が出ていることが確認できます。
まずマスクをしている画像を集めます。今回は、Kaggleで公開されているこちらのデータセットを用いました。
Face Mask Detection ~12K Images Dataset
https://www.kaggle.com/ashishjangra27/face-mask-12k-images-dataset
データをダウンロードして、いくつか学習データを描画してみます。
Kerasを用いてEfficientNetのモデルを準備します。
model = EfficientNetB0(include_top=False, input_shape=input_shape, pooling='avg', weights='imagenet')
これに全結合層をつけてモデル全体を構築し、転移学習を行います。以下はEfficientNetB0による学習の様子です。
Epoch 1/20 14016/14016 [==============================] - 51s 4ms/step - loss: 0.0907 - acc: 0.9658 - val_loss: 0.0182 - val_acc: 0.9949 Epoch 2/20 14016/14016 [==============================] - 39s 3ms/step - loss: 0.0198 - acc: 0.9935 - val_loss: 0.0131 - val_acc: 0.9969 Epoch 3/20 14016/14016 [==============================] - 38s 3ms/step - loss: 0.0092 - acc: 0.9974 - val_loss: 0.0162 - val_acc: 0.9963 Epoch 4/20 14016/14016 [==============================] - 39s 3ms/step - loss: 0.0056 - acc: 0.9982 - val_loss: 0.0122 - val_acc: 0.9974 Epoch 5/20 14016/14016 [==============================] - 39s 3ms/step - loss: 0.0047 - acc: 0.9986 - val_loss: 0.0115 - val_acc: 0.9977 Epoch 6/20 14016/14016 [==============================] - 38s 3ms/step - loss: 0.0026 - acc: 0.9995 - val_loss: 0.0107 - val_acc: 0.9980 Epoch 7/20 14016/14016 [==============================] - 39s 3ms/step - loss: 0.0026 - acc: 0.9996 - val_loss: 0.0114 - val_acc: 0.9971 Epoch 8/20 14016/14016 [==============================] - 39s 3ms/step - loss: 0.0046 - acc: 0.9986 - val_loss: 0.0143 - val_acc: 0.9960 Epoch 9/20 14016/14016 [==============================] - 39s 3ms/step - loss: 0.0016 - acc: 0.9996 - val_loss: 0.0129 - val_acc: 0.9963 Epoch 10/20 14016/14016 [==============================] - 39s 3ms/step - loss: 9.9155e-04 - acc: 0.9998 - val_loss: 0.0122 - val_acc: 0.9960 Epoch 11/20 14016/14016 [==============================] - 39s 3ms/step - loss: 5.1359e-04 - acc: 0.9999 - val_loss: 0.0123 - val_acc: 0.9966 Epoch 12/20 14016/14016 [==============================] - 38s 3ms/step - loss: 7.9006e-04 - acc: 0.9998 - val_loss: 0.0115 - val_acc: 0.9966 Epoch 13/20 14016/14016 [==============================] - 39s 3ms/step - loss: 7.8376e-04 - acc: 0.9998 - val_loss: 0.0117 - val_acc: 0.9966 Epoch 14/20 14016/14016 [==============================] - 39s 3ms/step - loss: 5.4456e-04 - acc: 1.0000 - val_loss: 0.0119 - val_acc: 0.9966 Epoch 15/20 14016/14016 [==============================] - 39s 3ms/step - loss: 3.5746e-04 - acc: 0.9999 - val_loss: 0.0119 - val_acc: 0.9966 Epoch 16/20 14016/14016 [==============================] - 38s 3ms/step - loss: 3.4325e-04 - acc: 0.9999 - val_loss: 0.0116 - val_acc: 0.9969 Epoch 17/20 14016/14016 [==============================] - 39s 3ms/step - loss: 8.6487e-04 - acc: 0.9999 - val_loss: 0.0118 - val_acc: 0.9969 Epoch 18/20 14016/14016 [==============================] - 39s 3ms/step - loss: 3.6752e-04 - acc: 0.9999 - val_loss: 0.0116 - val_acc: 0.9969 Epoch 19/20 14016/14016 [==============================] - 39s 3ms/step - loss: 3.4365e-04 - acc: 1.0000 - val_loss: 0.0119 - val_acc: 0.9969 Epoch 20/20 14016/14016 [==============================] - 39s 3ms/step - loss: 8.6147e-04 - acc: 0.9998 - val_loss: 0.0119 - val_acc: 0.9969
順調に損失が下がっていき、20エポックで検証データでの正解率が0.9969になっています。またこのあと、B4、B7も同様に学習して精度を見てみましたが、順により精度が高くなることを確認できました。
データセットは外国人が多いようでしたので、試しに日本人の写真で検証してみました。すると、このようにバッチリ予測できています!(画像下の数値はマスクをしている確率です)
今回は、マスク画像の分類モデルを作成してみました。実はVGGNetの転移学習とも比較してみたのですが、同じ条件でモデルを差し替えただけで、ちゃんとEfficientNetのほうが高性能になりました。
弊社では、お客様の研究開発や、製品開発をアウトソーシングしていただけます。独自の画像認識モデルを作りたいというテーマがあれば、ぜひご相談ください!
[1] EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
https://arxiv.org/abs/1905.11946
[2] Face Mask Detection ~12K Images Dataset
https://www.kaggle.com/ashishjangra27/face-mask-12k-images-dataset