画像分類モデル EfficientNet を Google colab で使いたい
[注意] この記事は勉強中の自分が 2021 年の 7 月に執筆したものです。今ならもう少し別の方法(例えばこちら)をおススメしますが、勉強の記録として残しておきます。
お久しぶりの投稿です.深層学習を利用した画像分類モデル "EfficientNet" を Google Colab で動かしてみました.
忙しい人向けに書いておくと,Google Colab で動かす際の注意点は適切なライブラリのバージョンを指定することで,
keras: 2.3.1
tensorflow: 1系
h5py: 2.10.0
を指定するときちんと回ってくれました.
EfficienNet とは
2019年に提案された画像分類のモデルです.詳しい話は元論文や日本語の解説記事を読んで頂ければと思いますが,パラメータの数を抑えながら高い分類精度を出すことを目的に開発されたモデルです.
![画像1](https://assets.st-note.com/production/uploads/images/55175751/picture_pc_4a7d0a7e141ebc114186c45326b42eac.png?width=1200)
様々な画像分類モデルのパラメータ数と分類精度の比較.赤線が EfficientNet (Tan & Le, 2019).
パラメータ数を抑えることによって,
・少ない画像データで効率よく学習する
・短時間で学習する
といった効果が期待されます.
ちなみに最近,EfficientNet の version 2 が報告されました (2021年4月にsubmit).やや時代遅れ感がありますが,気にせず version 1 の方の実装を書いていきます.
準備
GitHub からフォルダ一式をダウンロードします.
![無題](https://assets.st-note.com/production/uploads/images/56522225/picture_pc_90ea4b218473e5af7b0e994da6e08566.png?width=1200)
zip ファイルを解凍して,efficientnet-master というフォルダを Google Drive にアップします.
Code
GitHub の examples にあるコードを参考に,訓練済みのモデルを用いてテスト画像の予測をしてみます.
Google colab で回すので,まずはドライブのマウントから.
from google.colab import drive
drive.mount('/content/drive', force_remount=True)
drive_path = '/content/drive/MyDrive/efficientnet-master'
import os
os.chdir(drive_path)
いくつかのライブラリのバージョンを指定します.「efficientnet colab」等で検索するといくつかサンプルコードは出てくるのですが,バージョンを書いてくれているものは見当たりませんでした.以下が正解なのかは分かりませんが,これを指定すると回りました(2021年7月時点).
!pip install keras==2.3.1
%tensorflow_version 1.x
!pip install h5py==2.10.0
最後の h5py の指定は後輩に教えてもらいました.感謝.
ライブラリをインポートします
import os
import sys
import numpy as np
from skimage.io import imread
import matplotlib.pyplot as plt
efficientnet-master の中で定義されている関数やら何やらを読み込みます.
sys.path.append('..')
from keras.applications.imagenet_utils import decode_predictions
from efficientnet.keras import EfficientNetB0
from efficientnet.keras import center_crop_and_resize, preprocess_input
テスト画像を読み込んでクラスを予測します.
# test image
image = imread(f'{drive_path}/misc/panda.jpg')
plt.figure(figsize=(8,8))
plt.imshow(image)
plt.show()
# loading pretrained model
model = EfficientNetB0(weights='imagenet')
# preprocess input
image_size = model.input_shape[1]
x = center_crop_and_resize(image, image_size=image_size)
x = preprocess_input(x)
x = np.expand_dims(x, 0)
# make prediction and decode
y = model.predict(x)
decode_predictions(y)
上のセルを実行すると,パンダの画像とともに以下が出力されます.
[[('n02510455', 'giant_panda', 0.75878686),
('n02134084', 'ice_bear', 0.00835475),
('n02132136', 'brown_bear', 0.007207226),
('n02509815', 'lesser_panda', 0.0041302294),
('n02120079', 'Arctic_fox', 0.004021076)]]
訓練済みのモデルを使って,画像からクラスを予測することができるようになりました.
この先のモデルの訓練については,vgg model 等での分類と大きな違いはなかったと思います.参考にしたコードのリンクだけ紹介しておきます.
(気が向いたら書きます…)
最後に
ライブラリのバージョン探しは結構時間がかかりました.
今後,(特に colab での)プログラミング記事を書いて下さる方は,一緒にライブラリのバージョン情報も書いてくれるととても嬉しいな~と思いました.
引用文献
Tan, M., & Le, Q. (2019). Efficientnet: Rethinking model scaling for convolutional neural networks. In International Conference on Machine Learning (pp. 6105-6114). PMLR.