EfficientNetの転移学習でマスク分類してみた

Keras CNN

2021.11.10 更新

新型コロナウィルスの流行で、普段の生活の中で常にマスクをつけることが当たり前の世の中になっていると思います。 カメラに写る人がマスクをしているかどうかを判定する画像分類モデルがあれば、さまざまな場面で活用できそうです。

今回は、EfficientNetモデルの転移学習を用いて、マスクあり/なし判定を行う画像分類モデルを構築してみたいと思います。

EfficientNetモデルとは

EfficientNetは、2019年にGoogleが発表したモデルです。それまでのResNetに代表されるような、より多層にすることで高性能の目指す考え方ではなく、効率的なパラメータ数で、高い精度を出すことを目指したモデルです。

Kaggleなどのコンペでも転移学習のベースとしてよく用いられており、AIを応用することに主眼をおく弊社としても、ぜひ検証しておきたいモデルです。

論文)https://arxiv.org/abs/1905.11946

EfficientNetは、B0からB7のモデルがあり、数字が上がるにしたがってパラメータ数が大きくなり、精度も向上します。下図はImageNetによる分類性能をEfficientNet以外のモデルも含めて比較したものです。

EfficientNet性能比較グラフ

下表からも、他と比べてかなり小さなモデルで高い性能が出ていることが確認できます。

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のほうが高性能になりました。

弊社では、お客様の研究開発や、製品開発をアウトソーシングしていただけます。独自の画像認識モデルを作りたいというテーマがあれば、ぜひご相談ください!

Reference

[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

その他の記事

校務システム キャンパスフォース スマートウォッチでバイタル見守り ECCUBE構築
engage AI・人工知能EXPO
校務システム キャンパスフォース
スマートウォッチでバイタル見守り
EC-CUBE構築
engage
AI・人工知能EXPO

TOP