【Python】Streamlitアプリ公開の方法|OpenCVとメモリでつまずかないために

python

Python × Webアプリの開発環境として定番になりつつある「Streamlit」ですが、いざ公開しようとすると意外とつまずくポイントもあります。

筆者もこれまでにOpenCVやMediaPipeを使ったアプリを何本もデプロイしてきましたが、その中で見えてきたポイントを整理してみました。

私の場合は動画処理の読み込み、Opencvのインポートの部分で躓きましたので、備忘録として残しておきます。


Streamlitアプリを公開する基本の手順

  1. GitHubでリポジトリを作成
     main.py や app.py などのメインコードと、requirements.txt を用意します。requirement.txtの中にはアプリで使用するパッケージ名が入ります。
  2. Streamlit Cloud にアクセス
     → https://streamlit.io/cloud
     GitHub連携でログインすれば、リポジトリを選んで即デプロイできます。基本的にはGithubアカウントで入っておくのが無難だと思います。
  3. デプロイ設定を記入
     ブランチ(通常はmain)、起動ファイル名(例:main.py)を入力すればOK。

OpenCV使用時の注意点

OpenCVを使っていると、Webカメラ処理やGUI関連でエラーが出ることがあります。

カメラ使用で止まる

cap = cv2.VideoCapture(0)  # ← これはWebでは動きません!

Streamlit CloudはGUIもカメラのストリーミング機能も使えないので、これはローカル限定にする必要があります。GUIを使用する場合にはStreamlit内の機能を使う必要があります。

tkinterでファイル選択 → 失敗

GUIライブラリ tkinter は非対応。
st.file_uploader() を使ってWebアップロードに置き換えましょう。tkinterもいわゆるGUIを作るパッケージなので、Streamlitでは使用することができないです。


requirements.txt のサンプル

このポイントがローカル環境でアプリを作成するときに最も大事な部分になります。私の場合にはOpencvを使っていたため普通にopencv-pythonを使用していましたが、Streamlitではエラーが出て今井使うことができません。

下記のようにopencv-python-headlessをrequirement.txtに記載するようにしましょう。

streamlit
opencv-python-headless
mediapipe
matplotlib
pandas
numpy

opencv-python ではなく opencv-python-headless を使用してください!


メモリ制限への対策(無料枠は約1GB)

Streamlit Cloud(無料)は1GB以下のメモリ制限があります。重たい動画ファイルを一気に処理しようとするとアプリがクラッシュします。もしくは動画をアップロードする時点でファイルサイズを小さくしておくのも良いでしょう。

NG例:全フレーム読み込み

all_frames = [cap.read() for _ in range(frame_count)]

OK例:1フレームずつ読み込み

cap.set(cv2.CAP_PROP_POS_FRAMES, idx)
ret, frame = cap.read()

tempfileを活用

アップロードファイルは一時保存してから処理するのが◎。

import tempfile

tfile = tempfile.NamedTemporaryFile(delete=False)
tfile.write(uploaded_file.read())
video_path = tfile.name

アプリ作成時にチェックすべきこと

項目内容
アップロードst.file_uploader() を使う
メモリ制御全フレームの読み込みを避ける
カメラ使用Web公開では使えない(ローカル用に分岐を)
デプロイ方法GitHub → Streamlit Cloud に連携
依存パッケージopencv-python-headless, mediapipeなど

📝 まとめ

Streamlitはすごく便利ですが、Web公開を意識して設計しないと動かなくなる部分も多いです。特に、OpenCVを使った処理やメモリの扱いには注意が必要です。デプロイがうまく通ったとしても、うまくいかないことが多々あるので、その際にはアプリ右下から見ることができるログを見ながら対応していくようにしましょう。

今回紹介したような点を押さえておけば、よりスムーズにアプリ公開ができるはずです。

わたしもこれまでにいろいろとアプリを作っており、その記事も書いているのでご参照いただけますと幸いです。

記事URL:

MediaPipe × Streamlit|手の3Dポーズを可視化できる動画解析アプリ【Python】
🎬 はじめに今回紹介するのは、動画内の手の形状をMediaPipeで検出して、3Dで可視化するStreamlitアプリです。手の形状の計測は三次元動作解析装置でもなかなか難しいですが、禁煙ではMediaPipeのような有益なアプリを使うこと...
【Python × rembg】10秒動画の背景を消すAIアプリを作ってみた
今回は Python の人気ライブラリ「rembg」を使い、動画の背景を自動で削除する Web アプリを開発しました。動画の背景を消すのは、動画をクロマキー合成したり、骨格推定で邪魔なものを消して整理するのに役に立ちます。本アプリは Str...

コメント

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