コンテンツへスキップ

分析Ultralytics YOLOv8

はじめに

このガイドでは、折れ線グラフ、棒グラフ、円グラフという 3 種類の基本的なデータ可視化の包括的な概要を説明します。各セクションには、Python を使用してこれらのビジュアライゼーションを作成する方法について、ステップバイステップの手順とコード・スニペットが含まれています。

ビジュアル・サンプル

折れ線グラフ バー・プロット 円グラフ
折れ線グラフ バー・プロット 円グラフ

グラフが重要な理由

  • 折れ線グラフは、短期および長期の変化を追跡したり、同じ期間における複数のグループの変化を比較するのに理想的である。
  • 一方、棒グラフは、異なるカテゴリー間の量を比較したり、カテゴリーとその数値の関係を示したりするのに適している。
  • 最後に、円グラフはカテゴリー間の比率を示したり、全体の一部を示したりするのに効果的である。

アナリティクスの例

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("Path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("line_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="line",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
)
total_counts = 0
frame_count = 0

while cap.isOpened():
    success, frame = cap.read()

    if success:
        frame_count += 1
        results = model.track(frame, persist=True, verbose=True)

        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            for box in boxes:
                total_counts += 1

        analytics.update_line(frame_count, total_counts)

        total_counts = 0
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("Path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
out = cv2.VideoWriter("multiple_line_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="line",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
    max_points=200,
)

frame_count = 0
data = {}
labels = []

while cap.isOpened():
    success, frame = cap.read()

    if success:
        frame_count += 1

        results = model.track(frame, persist=True)

        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            track_ids = results[0].boxes.id.int().cpu().tolist()
            clss = results[0].boxes.cls.cpu().tolist()

            for box, track_id, cls in zip(boxes, track_ids, clss):
                # Store each class label
                if model.names[int(cls)] not in labels:
                    labels.append(model.names[int(cls)])

                # Store each class count
                if model.names[int(cls)] in data:
                    data[model.names[int(cls)]] += 1
                else:
                    data[model.names[int(cls)]] = 0

        # update lines every frame
        analytics.update_multiple_lines(data, labels, frame_count)
        data = {}  # clear the data list for next frame
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("Path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("pie_chart.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="pie",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
)

clswise_count = {}

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True, verbose=True)
        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            clss = results[0].boxes.cls.cpu().tolist()
            for box, cls in zip(boxes, clss):
                if model.names[int(cls)] in clswise_count:
                    clswise_count[model.names[int(cls)]] += 1
                else:
                    clswise_count[model.names[int(cls)]] = 1

            analytics.update_pie(clswise_count)
            clswise_count = {}

        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("Path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("bar_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="bar",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
)

clswise_count = {}

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True, verbose=True)
        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            clss = results[0].boxes.cls.cpu().tolist()
            for box, cls in zip(boxes, clss):
                if model.names[int(cls)] in clswise_count:
                    clswise_count[model.names[int(cls)]] += 1
                else:
                    clswise_count[model.names[int(cls)]] = 1

            analytics.update_bar(clswise_count)
            clswise_count = {}

        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("area_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="area",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
)

clswise_count = {}
frame_count = 0

while cap.isOpened():
    success, frame = cap.read()
    if success:
        frame_count += 1
        results = model.track(frame, persist=True, verbose=True)

        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            clss = results[0].boxes.cls.cpu().tolist()

            for box, cls in zip(boxes, clss):
                if model.names[int(cls)] in clswise_count:
                    clswise_count[model.names[int(cls)]] += 1
                else:
                    clswise_count[model.names[int(cls)]] = 1

        analytics.update_area(frame_count, clswise_count)
        clswise_count = {}
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()

議論 Analytics

以下はその表である。 Analytics という議論がある:

名称 タイプ デフォルト 説明
type str None データまたはオブジェクトのタイプ。
im0_shape tuple None 初期画像の形状。
writer cv2.VideoWriter None ビデオファイルを書き込むためのオブジェクト。
title str ultralytics ビジュアライゼーションのタイトル
x_label str x X軸のラベル。
y_label str y Y軸のラベル。
bg_color str white 背景色。
fg_color str black 前景色。
line_color str yellow ラインの色。
line_width int 2 線の幅。
fontsize int 13 テキストのフォントサイズ。
view_img bool False 画像またはビデオを表示するフラグ。
save_img bool True 画像またはビデオを保存するフラグ。
max_points int 50 複数の線分の場合、最初の点を削除する前に、フレーム上に描画された合計点。
points_width int 15 ラインポイントの蛍光ペンの幅。

論争 model.track

名称 タイプ デフォルト 説明
source im0 None 画像またはビデオのソース・ディレクトリ
persist bool False フレーム間のトラックの持続
tracker str botsort.yaml トラッキングメソッド「bytetrack」または「botsort
conf float 0.3 信頼閾値
iou float 0.5 借用書のしきい値
classes list None つまり、class=0、またはclass=[0,2,3]。
verbose bool True 物体追跡結果を表示する

結論

効果的なデータ分析には、さまざまな種類のビジュアライゼーションをいつ、どのように使用するかを理解することが重要です。折れ線グラフ、棒グラフ、円グラフは、データのストーリーをより明確かつ効果的に伝えるのに役立つ基本的なツールです。

よくあるご質問

Ultralytics YOLOv8 アナリティクスを使って折れ線グラフを作成するには?

Ultralytics YOLOv8 Analyticsを使用して折れ線グラフを作成するには、以下の手順に従ってください:

  1. YOLOv8 モデルを読み込み、ビデオファイルを開きます。
  2. を初期化する。 Analytics クラスで、タイプは "line "に設定されている。
  3. ビデオフレームを繰り返し、フレームごとのオブジェクト数などの関連データで折れ線グラフを更新する。
  4. 折れ線グラフを表示する出力ビデオを保存する。

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("Path/to/video/file.mp4")
out = cv2.VideoWriter("line_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(type="line", writer=out, im0_shape=(w, h), view_img=True)

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        total_counts = sum([1 for box in results[0].boxes.xyxy])
        analytics.update_line(frame_count, total_counts)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

の設定の詳細については Analytics クラスは Ultralytics YOLOv8 📊を使った分析 セクションを参照されたい。

棒グラフの作成にUltralytics YOLOv8 を使用する利点は何ですか?

棒グラフの作成にUltralytics YOLOv8 を使うと、いくつかの利点がある:

  1. リアルタイムのデータ可視化:オブジェクト検出結果をバープロットにシームレスに統合し、ダイナミックに更新。
  2. 使いやすさ:シンプルなAPIと関数により、データの実装と可視化が簡単に行える。
  3. カスタマイズ:タイトル、ラベル、色など、お客様のご要望に合わせてカスタマイズできます。
  4. 効率性:大量のデータを効率的に処理し、ビデオ処理中にリアルタイムでプロットを更新。

棒グラフを作成するには、次の例を使用する:

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("Path/to/video/file.mp4")
out = cv2.VideoWriter("bar_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(type="bar", writer=out, im0_shape=(w, h), view_img=True)

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        clswise_count = {
            model.names[int(cls)]: boxes.size(0)
            for cls, boxes in zip(results[0].boxes.cls.tolist(), results[0].boxes.xyxy)
        }
        analytics.update_bar(clswise_count)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

詳しくは、ガイドの「バー・プロット」のセクションをご覧ください。

データ可視化プロジェクトで円グラフを作成するのにUltralytics YOLOv8 を使用するのはなぜですか?

Ultralytics YOLOv8 は円グラフの作成に最適である:

  1. 物体検出との統合:物体検出の結果を直接円グラフに統合し、即座に洞察を得ることができます。
  2. ユーザーフレンドリーなAPI:最小限のコードで簡単に設定、使用できます。
  3. カスタマイズ可能:色やラベルなど、さまざまなカスタマイズが可能。
  4. リアルタイム更新:ビデオ解析プロジェクトに最適な、リアルタイムのデータ処理と可視化。

簡単な例を挙げよう:

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("Path/to/video/file.mp4")
out = cv2.VideoWriter("pie_chart.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(type="pie", writer=out, im0_shape=(w, h), view_img=True)

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        clswise_count = {
            model.names[int(cls)]: boxes.size(0)
            for cls, boxes in zip(results[0].boxes.cls.tolist(), results[0].boxes.xyxy)
        }
        analytics.update_pie(clswise_count)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

詳細については、ガイドの円グラフのセクションを参照してください。

Ultralytics YOLOv8 を使ってオブジェクトを追跡し、ビジュアライゼーションを動的に更新することは可能か?

はい、Ultralytics YOLOv8 、オブジェクトを追跡し、ビジュアライゼーションを動的に更新することができます。リアルタイムで複数のオブジェクトを追跡し、追跡されたオブジェクトのデータに基づいて折れ線グラフ、棒グラフ、円グラフのような様々なビジュアライゼーションを更新することができます。

折れ線グラフの追跡と更新の例:

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("Path/to/video/file.mp4")
out = cv2.VideoWriter("line_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(type="line", writer=out, im0_shape=(w, h), view_img=True)

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        total_counts = sum([1 for box in results[0].boxes.xyxy])
        analytics.update_line(frame_count, total_counts)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

全機能については、トラッキングのセクションをご覧ください。

Ultralytics YOLOv8 、OpenCVやTensorFlow のような他のオブジェクト検出ソリューションと何が違うのか?

Ultralytics YOLOv8 は、OpenCVやTensorFlow のような他の物体検出ソリューションと比較して、複数の理由で際立っている:

  1. 最先端の精度:YOLOv8 は、物体検出、セグメンテーション、分類タスクにおいて優れた精度を提供します。
  2. 使いやすさ:ユーザーフレンドリーなAPIは、大規模なコーディングなしで迅速な実装と統合を可能にします。
  3. リアルタイム性能:高速推論に最適化されており、リアルタイムアプリケーションに適しています。
  4. 多様なアプリケーション:複数オブジェクトの追跡、カスタムモデルのトレーニング、ONNX 、TensorRT 、CoreML のような異なるフォーマットへのエクスポートなど、さまざまなタスクをサポートします。
  5. 包括的なドキュメント:豊富なドキュメントと ブログリソースで、ユーザーをあらゆるステップでガイドします。

より詳細な比較や使用例については、Ultralytics ブログをご覧ください。



作成日:2024-05-23 更新日:2024-07-05
著者:glenn-jocher(4),IvorZhu331(1),RizwanMunawar(3)

コメント