irisuinwl’s diary

サークル不思議(略)入巣次元の、数学や技術的なことを書きます。

InceptionV3をfine-tuningしてクリクリ画像分類器を作り、streamlitでwebアプリを作る

題名の通り。 streamlitとkerasで遊んだ。

動画デモ:

環境情報

  • 機械学習モデル作成環境: google colaboratory
  • web app環境: windows 10+anaconda 

InceptionV3をファインチューニングする

下記google colabにて実施。

colab.research.google.com

streamlitでwebアプリを作る

下記githubにコードを格納

github.com

  • WIP: deployしたり、精度あげたり

詰まったところ:

anacondaでconda install tensorflow-gpu kerasすると、tf 2.1.0がインストールされるが、windows環境ではAttributeError: ‘_thread._local’ object has no attribute 'value’というエラーが出る。

実際、下記のissueでも議論されている。

discuss.streamlit.io

github.com

ググると、「tf 1.xに下げろ」という方法が散見されるが、google colabのtfは2.x系なので抵抗がある、また、やっても失敗したので下記のように対応した。

  • AttributeError: ‘_thread._local’ object has no attribute 'value’の対処は下記を追加
import keras.backend.tensorflow_backend as tb

tb._SYMBOLIC_SCOPE.value = True
st.set_option('deprecation.showfileUploaderEncoding', False)
  • さらにValueError: Cannot create an execution function which is comprised of elements from multiple graphs.というエラーが出るが、

これはkerasからインポートしているモデル構築モジュールをtensorflow.kerasにして対処。

InceptionV3の場合は下記のようにimport文を変更して対処した。

from tensorflow.keras.applications.inception_v3 import InceptionV3
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
from tensorflow.keras import backend as K
from tensorflow.keras.optimizers import SGD

イベント発火時(画像をアップロードしたりチェックボックス操作時など)にstreamlitのコードは再実行される。

そのため、機械学習モデルの再構築を再読み込みが行われて時間がかかる。

これはstreamlitのyoloを使った物体認識webアプリのチュートリアル に、機械学習モデル読み込み時にcacheを使って対処している。

@st.cache(allow_output_mutation=True)
def load_inception_v3(weight_path: str):
    """
    指定パスからパラメータ重みを読込、InceptionV3をfine-tuningしたモデルをloadする。
    """

    ...

    model.load_weights(weight_path)

    return model

参考記事

qiita.com

qiita.com

docs.streamlit.io

aidiary.hatenablog.com