こんにちは、JS2IIUです。
前回はテキストの分類モデルについて取り上げました(前回記事)。今回はアップロードされた画像のカテゴリを予測するモデルのUIをStreamlit上に構築していきます。今回もよろしくお願いします。
1. はじめに
この記事では、StreamlitというPythonライブラリを使って、画像分類モデルのデモアプリを作成する方法をご紹介します。
画像をアップロードすると、その内容をAIが判定してカテゴリを予測してくれるWebアプリを、Pythonだけで簡単に作ることができます。
2. 画像分類とは?
画像分類(Image Classification)とは、「画像に写っているものが何か」をAIが判断して、あらかじめ用意されたカテゴリ(クラス)の中から該当するものを選ぶタスクです。
たとえば以下のようなケースがあります:
- 犬と猫の判別
- 商品画像のカテゴリ分類(Tシャツ、ズボン、靴など)
- 医療画像から病気の有無を検出
今回は、事前学習済みのモデルを使って、一般的な画像分類を行うデモアプリを作成します。
3. Streamlitとは?
Streamlitは、PythonコードだけでシンプルにWebアプリが作れるライブラリです。以下の特徴があります:
- HTMLやJavaScriptの知識不要
- 機械学習モデルと簡単に連携
- ローカル環境での動作も簡単
今回のようなAIモデルの可視化やデモの作成にとても向いています。
4. アプリの構成と機能
今回作るアプリには以下の機能があります:
- 画像ファイルをアップロード
- 画像を画面に表示
- AIモデルで画像を分類
- 分類結果(カテゴリ名)と信頼度を表示
処理の流れは以下のようになります:
画像アップロード → モデルで分類 → 結果表示
5. 必要なライブラリと環境構築
まずはPythonの仮想環境を用意して、必要なライブラリをインストールします。
5.1 仮想環境の作成(任意)
python -m venv venv
source venv/bin/activate # Windowsの場合は venv\Scripts\activate5.2 必要なライブラリのインストール
pip install streamlit torch torchvision pillow6. サンプルコードの解説
ここからは、Streamlitアプリのコードをステップごとに説明します。
6.1 必要なライブラリのインポート
import streamlit as st
from PIL import Image
import torch
from torchvision import models, transforms
import io6.2 モデルの読み込み
事前学習済みのResNet18モデルを使います。
ラベルはImageNetの1000カテゴリを想定します。
model = models.resnet18(pretrained=True)
model.eval()
# ImageNetのラベル読み込み
LABELS_URL = "https://raw.githubusercontent.com/pytorch/hub/master/imagenet_classes.txt"
labels = []
with open("imagenet_classes.txt", "r") as f:
labels = [line.strip() for line in f.readlines()]※ imagenet_classes.txt はダウンロードしておく必要があります。以下コマンドで取得できます:
curl -O https://raw.githubusercontent.com/pytorch/hub/master/imagenet_classes.txtResNetについては以下にあげる参考ページをご覧ください。詳しい情報が得られます。
6.3 画像の前処理
モデルに画像を渡す前に、サイズ調整や正規化を行います。
preprocess = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])6.4 StreamlitのUI構築
画像のアップロードと表示、分類実行のインターフェースを作成します。
st.title("画像分類デモアプリ")
uploaded_file = st.file_uploader("画像をアップロードしてください", type=["jpg", "jpeg", "png"])
if uploaded_file is not None:
image = Image.open(uploaded_file).convert('RGB')
st.image(image, caption="アップロードされた画像", use_column_width=True)
# 前処理と予測
input_tensor = preprocess(image).unsqueeze(0) # バッチ次元を追加
with st.spinner("分類中..."):
with torch.no_grad():
output = model(input_tensor)
probabilities = torch.nn.functional.softmax(output[0], dim=0)
top_prob, top_idx = torch.topk(probabilities, 1)
predicted_label = labels[top_idx.item()]
confidence = top_prob.item()
st.markdown(f"### 結果:**{predicted_label}**")
st.markdown(f"予測信頼度:**{confidence:.2%}**")作成したコードの全体
import streamlit as st
from PIL import Image
import torch
from torchvision import models, transforms
import io
model = models.resnet18(pretrained=True)
model.eval()
# ImageNetのラベル読み込み
LABELS_URL = "https://raw.githubusercontent.com/pytorch/hub/master/imagenet_classes.txt"
labels = []
with open("imagenet_classes.txt", "r") as f:
labels = [line.strip() for line in f.readlines()]
preprocess = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
st.title("画像分類デモアプリ")
uploaded_file = st.file_uploader("画像をアップロードしてください", type=["jpg", "jpeg", "png"])
if uploaded_file is not None:
image = Image.open(uploaded_file).convert('RGB')
st.image(image, caption="アップロードされた画像", use_column_width=True)
# 前処理と予測
input_tensor = preprocess(image).unsqueeze(0) # バッチ次元を追加
with st.spinner("分類中..."):
with torch.no_grad():
output = model(input_tensor)
probabilities = torch.nn.functional.softmax(output[0], dim=0)
top_prob, top_idx = torch.topk(probabilities, 1)
predicted_label = labels[top_idx.item()]
confidence = top_prob.item()
st.markdown(f"### 結果:**{predicted_label}**")
st.markdown(f"予測信頼度:**{confidence:.2%}**")7. アプリを起動してみよう!
アプリを起動するには、ターミナルで以下のコマンドを実行します:
streamlit run app.pyブラウザが自動で開き、画像をアップロードできる画面が表示されます。
自分の画像をアップロードして、モデルの分類結果を試してみましょう!
8. 応用のアイデア
以下のような機能追加で、より実用的なアプリにできます:
- 自作モデルへの差し替え(PyTorchで訓練したモデルを読み込み)
- 複数画像の一括分類
- 分類結果の棒グラフ表示
- 分類結果の履歴表示・ログ保存
9. まとめ
今回の記事では、以下の内容を学びました:
- 画像分類とは何か
- Streamlitを使ってWebアプリを作る方法
- PyTorchの事前学習済みモデルで画像を分類する方法
- Streamlitアプリとして結果を表示する方法
このように、Streamlitを使えば手軽に機械学習モデルのデモを公開できます。学習したモデルの動作確認や社内・顧客への説明にも便利です。
10. 参考リンク
最後に書籍のPRです。
24年11月に第3版が発行された「scikit-learn、Keras、TensorFlowによる実践機械学習 第3版」、Aurélien Géron 著。下田、牧、長尾訳。機械学習のトピックスについて手を動かしながら網羅的に学べる書籍です。ぜひ手に取ってみてください。
最後まで読んでいただきありがとうございます。

