こんにちは、JS2IIUです。
Streamlitの活用例として、WEBカメラを使った物体検知アプリの例を紹介します。YOLOは比較的高速に物体検知処理を行うことができるディープラーニングモデルです。今回もよろしくお願いします。
1. はじめに
- 近年、AI技術の発展により、画像認識や物体検出が身近なものになりました。
- 今回は、リアルタイム物体検出で注目を集める「YOLO」と、手軽にWebアプリを作成できる「Streamlit」を組み合わせて、Webカメラ映像から物体を検出するアプリを作成します。
2. YOLOとは?
- YOLO(You Only Look Once)は、Joseph Redmonらによって開発された、リアルタイム物体検出のためのディープラーニングモデルです。
- 従来の物体検出モデルと比較して、高速かつ高精度な検出が可能です。
- YOLOの主な特徴:
- 高速性:画像を一度だけ処理することで、リアルタイム検出を実現。
- 高精度:高い検出精度を持ち、小さな物体や密集した物体の検出にも強い。
- 柔軟性:様々なタスクに適応可能で、画像認識、セグメンテーションなどにも応用可能。
- 最新版はこちらを参照してください:ultralytics/ultralytics: Ultralytics YOLO11 🚀
GitHub - ultralytics/ultralytics: Ultralytics YOLO11 🚀
Ultralytics YOLO11 🚀. Contribute to ultralytics/ultralytics development by creating an account on GitHub.
3. 開発環境の準備
必要な環境構築はそれほど大変ではありません。Pythonはすでに入れてあると思いますので、pipを使ってあっという間に準備が整います。
- Pythonのインストール
- 必要なライブラリのインストール:
streamlit、opencv-python、ultralytics
4. 実装
Python
import streamlit as st
import cv2
import numpy as np
from ultralytics import YOLO
# Load YOLO model
model = YOLO("yolov8n.pt")
# Streamlit app setup
st.title("Real-time Object Detection (YOLOv8 + Web Camera)")
start_button = st.button("Start Camera")
stop_button = st.button("Stop Camera")
FRAME_WINDOW = st.image([])
# Camera setup
camera = cv2.VideoCapture(1)
# App state
if 'running' not in st.session_state:
st.session_state['running'] = False
# Button actions
if start_button:
st.session_state['running'] = True
if stop_button:
st.session_state['running'] = False
# Real-time object detection
if st.session_state['running']:
while True:
_, frame = camera.read()
if frame is None:
st.write("Camera disconnected or unavailable.")
st.session_state['running'] = False
break
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = model(frame)
annotated_frame = results[0].plot()
FRAME_WINDOW.image(annotated_frame, channels="RGB")
if not st.session_state['running']:
break
else:
st.write("Camera stopped.")
camera.release()5. コード解説
使用ライブラリの説明
Python
import streamlit as st
import cv2
import numpy as np
from ultralytics import YOLOstreamlit:Python で Web アプリを簡単に作成できるライブラリ。cv2(OpenCV):画像処理を行うライブラリ。numpy:画像データの処理に必要な数学ライブラリ。ultralytics(YOLO):物体検出モデル YOLOv8 を使用するためのライブラリ。
YOLO モデルの読み込み
Python
# Load YOLO model
model = YOLO("yolov8n.pt")YOLO("yolov8n.pt")を使って、事前学習済みの YOLOv8n(ナノモデル) をロードします。
Streamlit アプリの UI 設定
Python
st.title("Real-time Object Detection (YOLOv8 + Web Camera)")
start_button = st.button("Start Camera")
stop_button = st.button("Stop Camera")
FRAME_WINDOW = st.image([])st.title():アプリのタイトルを設定。st.button("Start Camera"):カメラの起動ボタン。st.button("Stop Camera"):カメラの停止ボタン。st.image([]):画像を表示するためのプレースホルダー。
カメラのセットアップ
Python
camera = cv2.VideoCapture(1)cv2.VideoCapture(1)でカメラを起動します。1は外部カメラを指定(0は内蔵カメラ)。ただし、Macの方は0がiPhoneにつながってしまいますのでご注意ください。
アプリの状態管理
Python
if 'running' not in st.session_state:
st.session_state['running'] = Falsest.session_stateを使って、アプリの状態を管理。runningがTrueのとき、カメラが動作する。
ボタンの処理
Python
if start_button:
st.session_state['running'] = True
if stop_button:
st.session_state['running'] = Falsestart_buttonを押すとrunningをTrueにしてカメラを開始。stop_buttonを押すとrunningをFalseにしてカメラを停止。
リアルタイム物体検出の実行
Python
if st.session_state['running']:
while True:
_, frame = camera.read()
if frame is None:
st.write("Camera disconnected or unavailable.")
st.session_state['running'] = False
break
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = model(frame)
annotated_frame = results[0].plot()
FRAME_WINDOW.image(annotated_frame, channels="RGB")
if not st.session_state['running']:
break
else:
st.write("Camera stopped.")処理の流れ
camera.read()でカメラからフレームを取得。cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)で BGR から RGB に変換。results = model(frame)で YOLOv8 に画像を入力。results[0].plot()で検出結果を可視化。FRAME_WINDOW.image(annotated_frame, channels="RGB")で結果を表示。if not st.session_state['running']:でカメラが停止されたか確認。
カメラの解放
Python
camera.release()- カメラのリソースを解放。
6. アプリの実行方法
- 上記のコードを
app.pyなどの名前で保存します。 - ターミナルで保存したディレクトリに移動し、
streamlit run app.pyを実行します。 - ブラウザでアプリが起動します。
7. まとめ
- StreamlitとYOLOv8を組み合わせることで、手軽にリアルタイム物体検出アプリを作成できました。
- YOLOは様々な分野で応用されており、今後の発展が期待されます。
8. 参考サイト
- Ultralytics YOLOv8 GitHubリポジトリ:https://github.com/ultralytics/ultralytics
- Streamlit公式ドキュメント:https://streamlit.io/
- OpenCV公式ドキュメント:https://opencv.org/
最後に、書籍のPRです。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。ぜひ手に取ってみてください。
最後まで読んでいただきありがとうございます。

