【Streamlit】画像分類AIのためのUIを作成する

Streamlit
この記事は約11分で読めます。

こんにちは、JS2IIUです。

画像分類AIを活用するためには、ユーザーが簡単に操作できるUIが必要です。本記事では、Streamlitを使用して画像分類AIのためのシンプルで直感的なUIを構築する方法を解説します。今回もよろしくお願いします。

背景と目的

画像分類AIの活用シーン

画像分類AIは、医療画像の診断、製造業での不良品検出、セキュリティ分野での顔認識など、さまざまな分野で活用されています。これらの技術を効率的に利用するためには、ユーザーが簡単に操作できるUIが不可欠です。

UIの重要性

適切なUIがあることで、専門知識がないユーザーでもAIの機能を活用できます。特に、画像分類AIでは、画像のアップロードや結果の表示が直感的に行えることが重要です。

Streamlitの特徴と利点

Streamlitは、Pythonで簡単にインタラクティブなWebアプリケーションを作成できるフレームワークです。以下の特徴があります:

  • 簡単なコードでUIを構築可能
  • リアルタイムでのデータ更新
  • デプロイが容易

必要なツールと環境

PythonとStreamlitのインストール

以下のコマンドでPythonとStreamlitをインストールします:

Bash
pip install streamlit

必要なライブラリ

画像分類AIを構築するために、以下のライブラリを使用します:

  • TensorFlowまたはPyTorch
  • PIL(Python Imaging Library)

画像分類AIモデルの準備

事前学習済みモデルの利用

事前学習済みモデルを使用することで、開発時間を大幅に短縮できます。例えば、TensorFlowのMobileNetやPyTorchのResNetなどがあります。

これらのモデルは、すでに大規模なデータセット(一般に ImageNet)でトレーニングされており、一般的な画像分類タスクにおいて高い精度を発揮します。

  • MobileNet / MobileNetV2 (TensorFlow / Keras)
    • 特徴: モバイル・エッジ向けに設計された軽量アーキテクチャで、深さ方向の畳み込み(depthwise separable convolution)を多用して計算量を削減します。
    • 主な利点: パラメータ数と推論コストが小さいため、モバイルデバイスやリアルタイム推論に向く。
    • 注意点: 非常に軽量なモデルは、同等サイズの重いモデルに比べて精度がやや劣る場合がある。
    • 公式ドキュメント: MobileNetV2 (Keras) ドキュメント
  • ResNet (PyTorch / TensorFlow)
    • 特徴: 残差接続(skip connections)を導入し、非常に深いネットワーク(ResNet-50/101/152など)でも学習を安定化させる設計。
    • 主な利点: 深いネットワークにより高い表現力が得られ、汎用的で多くのタスクで高精度を達成。
    • 注意点: パラメータ数や計算量はモデルによって大きく異なる(ResNet-50 は中程度だが ResNet-152 は高負荷)。GPUやメモリのリソースを考慮する必要がある。
    • 公式ドキュメント(PyTorch torchvision): ResNet (torchvision) ドキュメント
  • EfficientNet (TensorFlow / Keras)
    • 特徴: ネットワーク幅・深さ・解像度を同時にスケーリングすることで、モデルサイズと精度のトレードオフを最適化したアーキテクチャ(EfficientNet-B0~B7など)。
    • 主な利点: 同程度の精度でパラメータ数や計算量が小さく、リソース効率が良い。
    • 注意点: 実装や最適化によっては推論速度の違いが出ることがある。プリプロセスや入力解像度に注意。
    • 公式ドキュメント: EfficientNet (Keras) ドキュメント
    • 論文: EfficientNet 論文 (arXiv)
  • Inception (InceptionV3 など, TensorFlow / Keras)
    • 特徴: 異なるサイズの畳み込みフィルタを並列に組み合わせるモジュール(Inceptionモジュール)を持ち、幅広いスケールの特徴を効率的に捉える。
    • 主な利点: 異なる受容野を同時に扱えるため、複雑な画像表現を学習しやすい。
    • 注意点: アーキテクチャがやや複雑で、実装上の最適化が必要な場面がある。
    • 公式ドキュメント: InceptionV3 (Keras) ドキュメント
  • VGG (VGG16 / VGG19)
    • 特徴: 一貫して小さな畳み込みフィルタ(3×3)を積み重ねるシンプルな構造。設計が直感的でわかりやすい。
    • 主な利点: 実装と理解が容易で、基礎的な比較や教育目的に適している。
    • 注意点: パラメータ数が非常に多く、モデルサイズと計算量が大きい。リソース制約のある環境では不利。
    • 公式(VGG研究グループ): VGG 研究ページ

選択の指針(簡単まとめ):

  • 軽量でエッジ向け: MobileNet / EfficientNet-B0
  • 高精度で汎用的: ResNet (より深いモデル)
  • バランス重視(効率 vs 精度): EfficientNet 系
  • 教育・比較目的: VGG
  • 複雑な特徴抽出が必要: Inception 系

転移学習の簡単なヒント:

  • まずベースモデルの重みを固定(freeze)して、上位層だけを学習させる(少量データ向け)。
  • 十分なデータがある場合、ベースの一部または全部を微調整(fine-tune)して精度向上を図る。
  • 出力層はタスクに合わせて差し替え(クラス数や活性化関数など)。
  • 正規化・データ拡張・適切な学習率スケジューラを併用する。

その他の選択肢

  • 転移学習に特化した軽量モデル(MobileNetV3, GhostNet 等)や、最新のアーキテクチャ(Vision Transformer, Swin Transformer など)も検討可能。用途やリソースに応じて選ぶと良いでしょう。

モデルのロードと推論の実装

以下は、TensorFlowを使用したモデルのロード例です:

Python
import tensorflow as tf

model = tf.keras.applications.MobileNetV2(weights='imagenet')

推論は以下のように行います:

Python
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions
import numpy as np
from PIL import Image

# 画像の前処理
image = Image.open('example.jpg').resize((224, 224))
image_array = np.expand_dims(preprocess_input(np.array(image)), axis=0)

# 推論
predictions = model.predict(image_array)
print(decode_predictions(predictions, top=3))

StreamlitでのUI構築

ファイルアップロード機能の実装

以下のコードで、ユーザーが画像をアップロードできるUIを作成します:

Python
import streamlit as st
from PIL import Image
import numpy as np
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions
import tensorflow as tf

# モデルのロード
model = tf.keras.applications.MobileNetV2(weights='imagenet')

# Streamlitアプリの構築
st.title("画像分類AIデモ")

uploaded_file = st.file_uploader("画像をアップロードしてください", type=["jpg", "png"])

if uploaded_file is not None:
    # 画像の表示
    image = Image.open(uploaded_file)
    st.image(image, caption='アップロードされた画像', use_container_width=True)

    # 画像の前処理
    image = image.resize((224, 224))
    image_array = np.expand_dims(preprocess_input(np.array(image)), axis=0)

    # 推論
    predictions = model.predict(image_array)
    decoded_predictions = decode_predictions(predictions, top=3)

    # 結果の表示
    st.write("推論結果:")
    for i, (imagenet_id, label, score) in enumerate(decoded_predictions[0]):
        st.write(f"{i+1}. {label}: {score:.2f}")

プログラム解説

  1. ライブラリのインポート:
  • streamlitを使用してUIを構築。
  • PILを使用して画像を処理。
  • tensorflow.keras.applications.mobilenet_v2からモデルと関連関数をインポート。
  1. モデルのロード:
  • MobileNetV2を事前学習済みモデルとしてロード。
  • weights='imagenet'を指定してImageNetでトレーニングされた重みを使用。
  1. Streamlitアプリのタイトル設定:
  • st.title("画像分類AIデモ")でアプリのタイトルを設定。
  1. ファイルアップロード機能:
  • st.file_uploaderを使用して画像ファイルをアップロード可能に。
  • サポートされるファイル形式はjpgpng
  1. 画像の表示:
  • アップロードされた画像をst.imageで表示。
  • captionでキャプションを追加し、use_column_width=Trueで幅を調整。
  1. 画像の前処理:
  • 画像を224x224にリサイズ。
  • preprocess_inputを使用して画像をモデル入力用に正規化。
  • np.expand_dimsでバッチ次元を追加。
  1. 推論の実行:
  • model.predictで画像の分類を実行。
  • decode_predictionsで予測結果を人間が読める形式にデコード。
  1. 結果の表示:
  • st.writeを使用して推論結果を表示。
  • 各ラベルとスコアをループで出力。

デプロイと運用

Streamlit Cloudを使用したデプロイ

Streamlit Cloudを使用すると、簡単にアプリを公開できます。以下の手順でデプロイします:

  1. GitHubリポジトリにコードをプッシュ
  2. Streamlit Cloudにログインし、リポジトリを選択
  3. デプロイボタンをクリック

ローカル環境での運用方法

以下のコマンドでローカルサーバーを起動します:

Bash
streamlit run app.py

トラブルシューティング

よくあるエラーとその対処法

  • モジュールが見つからない: 必要なライブラリがインストールされているか確認してください。
  • 画像が読み込めない: ファイル形式やサイズを確認してください。

パフォーマンス改善のヒント

  • モデルの軽量化
  • キャッシュ機能の活用

まとめ

Streamlitを使用することで、画像分類AIのためのUIを簡単に構築できます。本記事を参考に、ぜひ実際にアプリケーションを作成してみてください。

参考

最後まで読んでいただきありがとうございます。
ご意見、ご感想、ご質問は是非コメント欄へお願いします。

コメント

タイトルとURLをコピーしました