サイトアイコン アマチュア無線局JS2IIU

【Streamlit】YOLOv8によるリアルタイム物体検出アプリ

こんにちは、JS2IIUです。

Streamlitの活用例として、WEBカメラを使った物体検知アプリの例を紹介します。YOLOは比較的高速に物体検知処理を行うことができるディープラーニングモデルです。今回もよろしくお願いします。

1. はじめに

2. YOLOとは?

GitHub - ultralytics/ultralytics: Ultralytics YOLO11 🚀
Ultralytics YOLO11 🚀. Contribute to ultralytics/ultralytics development by creating an account on GitHub.

3. 開発環境の準備

必要な環境構築はそれほど大変ではありません。Pythonはすでに入れてあると思いますので、pipを使ってあっという間に準備が整います。

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 YOLO

YOLO モデルの読み込み

Python
# Load YOLO model
model = YOLO("yolov8n.pt")

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([])

カメラのセットアップ

Python
camera = cv2.VideoCapture(1)

アプリの状態管理

Python
if 'running' not in st.session_state:
    st.session_state['running'] = False

ボタンの処理

Python
if start_button:
    st.session_state['running'] = True
if stop_button:
    st.session_state['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.")

処理の流れ

  1. camera.read() でカメラからフレームを取得。
  2. cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) で BGR から RGB に変換。
  3. results = model(frame) で YOLOv8 に画像を入力。
  4. results[0].plot() で検出結果を可視化。
  5. FRAME_WINDOW.image(annotated_frame, channels="RGB") で結果を表示。
  6. if not st.session_state['running']: でカメラが停止されたか確認。

カメラの解放

Python
camera.release()

6. アプリの実行方法

  1. 上記のコードをapp.pyなどの名前で保存します。
  2. ターミナルで保存したディレクトリに移動し、streamlit run app.pyを実行します。
  3. ブラウザでアプリが起動します。

7. まとめ

8. 参考サイト

最後に、書籍のPRです。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。ぜひ手に取ってみてください。

最後まで読んでいただきありがとうございます。

モバイルバージョンを終了