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

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

こんにちは、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のインストール
  • 必要なライブラリのインストール:streamlitopencv-pythonultralytics

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
  • streamlit: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'] = False
  • st.session_state を使って、アプリの状態を管理。
  • runningTrue のとき、カメラが動作する。

ボタンの処理

Python
if start_button:
    st.session_state['running'] = True
if stop_button:
    st.session_state['running'] = False
  • start_button を押すと runningTrue にしてカメラを開始。
  • stop_button を押すと runningFalse にしてカメラを停止。

リアルタイム物体検出の実行

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. まとめ

  • StreamlitとYOLOv8を組み合わせることで、手軽にリアルタイム物体検出アプリを作成できました。
  • YOLOは様々な分野で応用されており、今後の発展が期待されます。

8. 参考サイト

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

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

コメント

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