roboflow/supervision
主な特徴
- **モデル統合**: Ultralytics (YOLO)、Transformers、SAM、VLMなど人気モデルとのシームレスな統合
- **統一Detectionsクラス**: バウンディングボックス、マスク、信頼度、クラスIDなどを統一的に扱う
- **20+のアノテーター**: BoxAnnotator、MaskAnnotator、HeatMapAnnotatorなど多様な可視化ツール
- **ゾーン分析**: PolygonZone、LineZoneによる領域内カウントやライン通過検出
- **オブジェクト追跡**: ByteTrack実装によるマルチオブジェクトトラッキング
- **データセット管理**: YOLO、COCO、Pascal VOCフォーマットのサポートと変換ツール
- **ビデオ処理**: フレームジェネレータ、VideoSink、FPSモニタリング
- **評価メトリクス**: Confusion Matrix、mAP、Precision/Recall/F1スコア
リポジトリ解析: roboflow/supervision
基本情報
- リポジトリ名: roboflow/supervision
- 主要言語: Python
- スター数: 29,556
- フォーク数: 2,318
- 最終更新: 2024年(活発に開発中)
- ライセンス: MIT License
- トピックス: computer-vision, object-detection, segmentation, tracking, annotation, yolo, detection-visualization
概要
一言で言うと
あらゆるコンピュータビジョンモデルの出力を統一し、再利用可能なツールで簡単に可視化・分析できるようにするオープンソースコンピュータビジョンライブラリ。
詳細説明
SupervisionはRoboflowが開発したオープンソースのコンピュータビジョンライブラリで、一般的なコンピュータビジョンタスクのための再利用可能なツールを提供します。異なる物体検出/セグメンテーションモデルと実用的なアプリケーションをつなぐブリッジとして機能し、モデル出力を処理するための統一されたAPIを提供します。
このライブラリの主な目的は:
- 異なるコンピュータビジョンモデル(YOLO、Transformers、SAMなど)の出力を標準化
- アノテーション、可視化、分析のためのすぐに使えるツールを提供
- オブジェクト追跡、ゾーンカウント、データセット管理などの一般的なCVワークフローを簡素化
- コンピュータビジョンプロジェクトのボイラープレートコードを削減
主な特徴
- モデル統合: Ultralytics (YOLO)、Transformers、SAM、VLMなど人気モデルとのシームレスな統合
- 統一Detectionsクラス: バウンディングボックス、マスク、信頼度、クラスIDなどを統一的に扱う
- 20+のアノテーター: BoxAnnotator、MaskAnnotator、HeatMapAnnotatorなど多様な可視化ツール
- ゾーン分析: PolygonZone、LineZoneによる領域内カウントやライン通過検出
- オブジェクト追跡: ByteTrack実装によるマルチオブジェクトトラッキング
- データセット管理: YOLO、COCO、Pascal VOCフォーマットのサポートと変換ツール
- ビデオ処理: フレームジェネレータ、VideoSink、FPSモニタリング
- 評価メトリクス: Confusion Matrix、mAP、Precision/Recall/F1スコア
使用方法
インストール
前提条件
- Python: >= 3.9
- コア依存関係:
- numpy >= 1.21.2
- opencv-python >= 4.5.5.64
- scipy >= 1.10.0
- matplotlib >= 3.6.0
- pillow >= 9.4
- pyyaml >= 5.3
- requests >= 2.26.0
- tqdm >= 4.62.3
インストール手順
# 方法1: 基本インストール
pip install supervision
# 方法2: メトリクスサポート付き
pip install "supervision[metrics]"
# 方法3: アセット(サンプルビデオ)付き
pip install "supervision[assets]"
# 方法4: 開発版(最新機能)
pip install git+https://github.com/roboflow/supervision.git
基本的な使い方
物体検出とアノテーション
import cv2
import supervision as sv
from ultralytics import YOLO
# モデルと画像の読み込み
model = YOLO("yolov8m.pt")
image = cv2.imread("image.jpg")
# 推論実行
results = model(image)[0]
detections = sv.Detections.from_ultralytics(results)
# アノテーション
box_annotator = sv.BoxAnnotator()
label_annotator = sv.LabelAnnotator()
labels = [f"{model.names[class_id]}" for class_id in detections.class_id]
annotated_image = box_annotator.annotate(image.copy(), detections=detections)
annotated_image = label_annotator.annotate(annotated_image, detections=detections, labels=labels)
実践的な使用例:ゾーンカウント
import numpy as np
# ポリゴンゾーンの定義
polygon = np.array([[100, 100], [200, 100], [200, 200], [100, 200]])
zone = sv.PolygonZone(polygon=polygon)
zone_annotator = sv.PolygonZoneAnnotator(zone=zone)
# ゾーン内の検出をカウント
detections_in_zone = detections[zone.trigger(detections=detections)]
count = len(detections_in_zone)
# ゾーンを可視化
annotated_frame = zone_annotator.annotate(scene=image, label=f"Count: {count}")
高度な使い方:ビデオ処理とトラッキング
# トラッカーの初期化
tracker = sv.ByteTrack()
# ビデオ処理
video_info = sv.VideoInfo.from_video_path("input.mp4")
frame_generator = sv.get_video_frames_generator("input.mp4")
with sv.VideoSink("output.mp4", video_info) as sink:
for frame in frame_generator:
# 検出
result = model(frame)[0]
detections = sv.Detections.from_ultralytics(result)
# トラッキング
detections = tracker.update_with_detections(detections)
# アノテーション
labels = [
f"#{tracker_id} {model.names[class_id]}"
for tracker_id, class_id in zip(detections.tracker_id, detections.class_id)
]
annotated_frame = box_annotator.annotate(frame, detections)
annotated_frame = label_annotator.annotate(annotated_frame, detections, labels)
# 保存
sink.write_frame(annotated_frame)
ドキュメント・リソース
公式ドキュメント
- README.md: プロジェクト概要、クイックスタートガイド
- docs/index.md: ライブラリの全体像と主要機能
- docs/cookbooks.md: 実用的なユースケースとレシピ
- docs/trackers.md: トラッキング機能の詳細
- 公式サイト: https://supervision.roboflow.com
サンプル・デモ
- demo.ipynb: ライブラリの主要機能を紹介するJupyterノートブック
- examples/: 各種ユースケースのサンプルコード
- ビデオチュートリアル: YouTubeで公開されている実践ガイド
チュートリアル・ガイド
- オブジェクト検出からアノテーションまでのクイックスタート
- トラッキングとカウンティングの実装ガイド
- データセット変換と管理のチュートリアル
- カスタムアノテーターの作成方法
技術的詳細
アーキテクチャ
全体構造
モジュラー設計を採用し、各機能が独立したモジュールとして整理されています。データフローは「モデル出力→Detections標準化→処理/フィルタリング→アノテーション/分析」という流れで、ファクトリーメソッドを使用して異なるモデルの統合を実現しています。
ディレクトリ構成
supervision/
├── supervision/ # メインパッケージ
│ ├── detection/ # 検出コア機能とツール
│ │ ├── core.py # Detectionsクラス
│ │ └── tools/ # ゾーン、ラインツール
│ ├── annotators/ # 可視化コンポーネント
│ ├── dataset/ # データセット管理
│ ├── tracker/ # オブジェクトトラッキング
│ ├── metrics/ # 評価メトリクス
│ └── utils/ # ヘルパーユーティリティ
├── docs/ # ドキュメント
├── test/ # テストスイート
└── demo.ipynb # デモノートブック
主要コンポーネント
-
Detectionsクラス: すべての検出操作の中心的なデータ構造
- 場所:
detection/core.py - 依存: numpy, 各モデルアダプター
- インターフェース: from_ultralytics, from_transformers, filter, merge
- 場所:
-
アノテーター: モジュラーな可視化コンポーネント
- 場所:
annotators/ - 依存: opencv-python, pillow
- インターフェース: annotate(scene, detections, labels)
- 場所:
-
ゾーンツール: 空間領域分析とカウント
- 場所:
detection/tools/ - 依存: Detections, numpy
- インターフェース: trigger(detections), get_count()
- 場所:
-
ByteTrack: マルチオブジェクトトラッカー
- 場所:
tracker/byte_tracker.py - 依存: scipy (Kalman filter), numpy
- インターフェース: update_with_detections(detections)
- 場所:
技術スタック
コア技術
- 言語: Python >= 3.9(型ヒント、データクラスを活用)
- フレームワーク: 純粋Pythonライブラリ(フレームワーク非依存)
- 主要ライブラリ:
- numpy: 数値計算と配列操作
- opencv-python: 画像処理と描画
- scipy: Kalmanフィルタ(トラッキング)
- matplotlib: グラフ描画(メトリクス)
- pillow: 画像操作
- tqdm: 進捗バー
開発・運用ツール
- ビルドツール:
- setuptools/pyproject.tomlベース
- Poetryサポート
- テスト:
- pytestベースのテストスイート
- toxでのマルチ環境テスト
- CI/CD:
- GitHub Actionsで自動テスト
- リリース自動化
- ドキュメント:
- MkDocs + Materialテーマ
- 自動APIドキュメント生成
設計パターン・手法
- ファクトリーメソッド: モデル統合(from_ultralytics, from_transformers)
- ビルダーパターン: アノテーターの設定
- イテレータパターン: フレーム処理
- コンポジットパターン: 複数アノテーターの組み合わせ
- Strategyパターン: 異なるトラッカー実装
データフロー・処理フロー
-
モデル出力の取得:
- 各種モデル(YOLO, Transformers等)からの推論結果
-
Detectionsへの標準化:
- ファクトリーメソッドで統一フォーマットに変換
- バウンディングボックス、マスク、メタデータを格納
-
フィルタリングと処理:
- 信頼度、クラス、領域によるフィルタリング
- NMS (Non-Maximum Suppression)の適用
-
トラッキング(オプション):
- ByteTrackでIDを割り当て
- フレーム間でのオブジェクト追跡
-
分析と可視化:
- ゾーン分析、カウント
- アノテーターによる描画
- 結果の出力(画像/ビデオ)
API・インターフェース
公開API
Detections API
- 目的: 統一された検出結果の操作
- 使用例:
# モデルからの変換
detections = sv.Detections.from_ultralytics(results)
detections = sv.Detections.from_transformers(results)
# フィルタリング
filtered = detections[detections.confidence > 0.5]
filtered = detections[detections.class_id == 0]
# マージ
merged = sv.Detections.merge([detections1, detections2])
Annotator API
- 目的: モジュラーな可視化
- 使用例:
# アノテーターの設定
box_annotator = sv.BoxAnnotator(
color=sv.ColorPalette.default(),
thickness=2,
color_lookup=sv.ColorLookup.CLASS
)
# アノテーション
annotated_frame = box_annotator.annotate(
scene=frame,
detections=detections
)
設定・カスタマイズ
アノテーターのカスタマイズ
# カラーパレットのカスタマイズ
custom_colors = sv.ColorPalette.from_hex(["#ff0000", "#00ff00", "#0000ff"])
# カスタムアノテーターの作成
class CustomAnnotator(sv.BaseAnnotator):
def annotate(self, scene, detections, labels=None):
# カスタム描画ロジック
return scene
拡張・プラグイン開発
新しいモデルの統合:
@classmethod
def from_custom_model(cls, results):
# カスタムモデルからDetectionsへの変換
return cls(
xyxy=results.boxes,
confidence=results.scores,
class_id=results.labels
)
パフォーマンス・スケーラビリティ
パフォーマンス特性
- ベンチマーク結果:
- 1000オブジェクトのフィルタリング: <1ms
- アノテーション(1080p画像): ~10-20ms
- ByteTrack更新: ~5-10ms/フレーム
- 最適化手法:
- NumPyベクトル化操作
- OpenCVの高速描画関数
- 最小限のPythonループ
スケーラビリティ
- バッチ処理: Detectionsは複数フレームのバッチ処理をサポート
- メモリ効率: 大量の検出結果もNumPy配列で効率的に管理
- 並列処理: フレーム単位での並列処理が可能
制限事項
- 技術的な制限:
- GPUアクセラレーションはモデル側に依存
- リアルタイム性能はアノテーターの設定に依存
- 大量のマスクデータはメモリを消費
- 運用上の制限:
- モデル出力フォーマットの事前確認が必要
- カスタムモデルにはアダプター実装が必要
評価・所感
技術的評価
強み
- モデル非依存設計: あらゆるCVモデルと統合可能な柔軟性
- 完成度の高いツールセット: 検出から追跡、可視化まで一貫したソリューション
- 優れたAPI設計: 直感的でPythonらしいインターフェース
- 活発な開発とコミュニティ: Roboflowによる継続的な改善
- 実用的な機能: ゾーンカウント、トラッキングなど実際のニーズに対応
改善の余地
- GPUアクセラレーション: 描画処理のCUDA最適化
- リアルタイム性能: 一部の重いアノテーションの高速化
- 3Dサポート: 3Dバウンディングボックスへの対応
- モバイル最適化: 軽量版の提供
向いている用途
- CVプロトタイピング: 素早くPoCを構築
- 産業応用: 監視カメラ、製造ライン検査
- 研究開発: CVモデルの評価と比較
- 教育: CVの学習用ツール
- エッジデバイス: 軽量で効率的な処理
向いていない用途
- モデル訓練: 推論専用で訓練機能はなし
- 画像編集: 汎用画像処理ソフトではない
- モデル特化処理: 特定モデル専用の特殊機能
- 超低遅延要求: ミリ秒単位の処理が必要な場合
総評
Supervisionは、コンピュータビジョンの開発を大幅に加速する優れたライブラリです。特に、異なるモデルの出力を統一し、再利用可能なツールで簡単に可視化・分析できる点が魅力的です。
モデル非依存の設計により、YOLOからTransformers、SAMまで幅広いモデルとの統合が可能で、実際のプロジェクトで必要な機能(ゾーンカウント、トラッキング、データセット管理)が網羅されているのも大きな強みです。
Roboflowによる積極的なメンテナンスと、コミュニティからのフィードバックを受けた継続的な改善により、CVプロジェクトのデファクトスタンダードとしての地位を確立しつつあります。初心者から上級者まで、幅広いユーザーにとって価値のあるツールです。