phonon-py / DatabaseSpecialistStudy

0 stars 0 forks source link

ここではないけどyolov5 #1

Open phonon-py opened 3 months ago

phonon-py commented 3 months ago

ビデオアップロードの機能を削除し、検出結果をフレーム内のテキストラベルに表示するように変更したコードは以下の通りです。

# 必要なモジュールをインポート
import tkinter as tk
from tkinter import Tk
import cv2
from PIL import Image, ImageTk
import torch
import numpy as np

# Tkinterオブジェクトを作成
root = Tk()
# Escapeキーを押すとアプリケーションを終了するバインドを設定
root.bind("<Escape>", lambda e: root.quit())

# ウィンドウのサイズを調整
root.attributes('-fullscreen', True)

# YOLOv5モデルをロード
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)

# メインページを表示する関数
def main_page():
    # Webカメラを使用する関数
    def web_cam_func():
        # メインフレームに戻る関数
        def go_back_to_main_frame():
            cap.release()
            display_frame1.place_forget()
            display_frame2.place_forget()
            back_frame.place_forget()
            main_frame.place(relx=0.5, rely=0.5, width=500, height=500, anchor=tk.CENTER)

        # メインフレームを隠す
        main_frame.place_forget()
        width, height = 700, 700
        # Webカメラをキャプチャ
        cap = cv2.VideoCapture(0)
        cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
        cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)

        # 動画表示フレームを作成
        display_frame1 = tk.Frame(root)
        display_frame1.place(relx=0.2, rely=0.5, width=600, height=700, anchor=tk.CENTER)
        display_frame1_label = tk.Label(display_frame1, text="Original video", font=('Rockwell', 16), bg="yellow")
        display_frame1_label.pack(side=tk.TOP)

        display_frame2 = tk.Frame(root)
        display_frame2.place(relx=0.8, rely=0.5, width=600, height=700, anchor=tk.CENTER)
        display_frame2_label = tk.Label(display_frame2, text="Detection", font=('Rockwell', 16), bg="yellow")
        display_frame2_label.pack(side=tk.TOP)

        # 検出結果表示用ラベル
        detection_label = tk.Label(display_frame2, text="", font=('Rockwell', 14), bg="white", anchor='nw', justify='left')
        detection_label.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

        back_frame = tk.Frame(root)
        back_frame.pack(side=tk.TOP, anchor=tk.NW)
        back_button = tk.Button(back_frame, text="BACK", font=("Rockwell", 12), command=go_back_to_main_frame)
        back_button.pack()

        lmain = tk.Label(display_frame1)
        lmain.place(x=0, y=100, width=600, height=600)

        # フレームを表示する関数
        def show_frame():
            _, frame = cap.read()
            frame2 = cv2.flip(frame, 1)
            cv2image = cv2.cvtColor(frame2, cv2.COLOR_BGR2RGBA)
            img = Image.fromarray(cv2image)
            imgtk = ImageTk.PhotoImage(image=img)
            lmain.imgtk = imgtk
            lmain.configure(image=imgtk)

            # 物体検出を行う
            results = model(frame)

            detection_text = ""
            # 検出結果を解析してバウンディングボックスを描画
            for *xyxy, conf, cls in results.xyxy[0]:
                if conf > 0.5:
                    label = f'{model.names[int(cls)]} {conf:.2f}'
                    detection_text += f'{label}\n'
                    cv2.rectangle(frame, (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])), (255, 0, 0), 2)
                    cv2.putText(frame, label, (int(xyxy[0]), int(xyxy[1])-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

            detection_label.config(text=detection_text)

            frame3 = frame
            cv2image2 = cv2.cvtColor(frame3, cv2.COLOR_BGR2RGBA)
            img2 = Image.fromarray(cv2image2)
            imgtk2 = ImageTk.PhotoImage(image=img2)

            lmain.after(10, show_frame)

        show_frame()

    main_frame = tk.Frame(root, bg="orange")
    main_frame.place(relx=0.5, rely=0.5, width=500, height=500, anchor=tk.CENTER)

    web_cam = tk.Button(main_frame, text="Web cam", command=web_cam_func, bg="yellow", fg="purple", font=('Rockwell', 18))
    web_cam.place(x=10, y=100)

main_page()

Title_label = tk.Label(root, text="YOLOv5 Object detection", font=('Rockwell', 20), bg="yellow")
Title_label.pack(side=tk.TOP)

Exit_label = tk.Label(root, text="Press escape to quit", font=('Rockwell', 20), bg="yellow")
Exit_label.pack(side=tk.BOTTOM)

# Tkinterメインループを実行
root.mainloop()

このコードは、YOLOv5を使用してWebカメラから物体検出を行い、その結果をTkinterウィンドウ内に表示します。検出結果はフレーム内のテキストラベルに表示されます。ビデオアップロード機能は削除され、Webカメラのみを使用します。

phonon-py commented 3 months ago

実際だと、リアルタイム検出だと常に更新されているので、どのタイミングでトリガーするか?現在の画像内に同一のオブジェクトが存在するか、カウントできるかを確認する

phonon-py commented 3 months ago

YOLOを使用してリアルタイムでオブジェクトを検出し、その結果に基づいて特定のラベルの個数をカウントし、特定の条件を満たす場合に画面にメッセージを表示することは可能です。以下にその方法の概要と具体的なPythonコードの例を示します。

概要

  1. YOLOモデルの読み込み: 事前に学習させたYOLOモデルを読み込みます。
  2. リアルタイムのビデオキャプチャ: OpenCVを使用してカメラからのビデオフレームをキャプチャします。
  3. オブジェクト検出: 各ビデオフレームに対してYOLOを使用してオブジェクトを検出します。
  4. ラベルのカウント: 検出されたオブジェクトのラベルをカウントします。
  5. 条件の判定: カウント結果に基づいて条件を判定し、条件を満たす場合は画面にメッセージを表示します。
  6. 画面表示: OpenCVを使用してビデオフレームを表示し、必要なメッセージを描画します。

具体的なコード例

以下のコード例はYOLOv5を使用して、リアルタイムで特定のラベルの個数をカウントし、その個数が10以上であれば「OK」と表示するものです。

import cv2
import torch

# YOLOv5モデルの読み込み
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')

# 特定のラベル(例: 'person')をカウント
target_label = 'person'
threshold_count = 10

# ビデオキャプチャの設定(デフォルトカメラを使用)
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # オブジェクト検出
    results = model(frame)

    # 検出結果の解析
    labels = results.xyxyn[0][:, -1].cpu().numpy()
    label_names = [model.names[int(label)] for label in labels]

    # 特定のラベルの個数をカウント
    count = label_names.count(target_label)

    # フレームに情報を描画
    cv2.putText(frame, f'{target_label} count: {count}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)

    # 条件判定とメッセージ表示
    if count >= threshold_count:
        cv2.putText(frame, 'OK', (10, 70), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

    # 検出結果の描画
    results.render()
    frame = results.imgs[0]

    # フレームを表示
    cv2.imshow('YOLOv5 Real-Time Object Detection', frame)

    # 'q'キーが押されたらループを終了
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# リソースの解放
cap.release()
cv2.destroyAllWindows()

解説

このコードを実行することで、特定のラベルが指定された個数に達した場合にメッセージを画面に表示することができます。