YOLOv10カメラ物体検出実験プログラム(インタラクティブなパラメータ調整機能付き)による実験・研究スキルの基礎
【概要】
Google Colabで動作するYOLOv10を使用したカメラ物体検出プログラムである。人物、車両、動物など80種類の物体を検出できる。画像をキャプチャ後、スライダーで信頼度閾値とIOU閾値を調整し、検出結果を確認する。誤検出と見逃しのトレードオフを理解し、実験・研究の基礎スキルを習得できる。
【目次】
【関連する外部ページ】
Colabのページ(ソースコードと説明): https://colab.research.google.com/drive/1d72VqaauEbMIIRTv45nnPF6FAtlX_HA0?usp=sharing
【サイト内の関連情報】
1. プログラムの使用法
1.1 このプログラムの利用シーン
画像内の物体を自動的に検出し、その位置とクラスを特定する用途に使用される。物体検出の閾値パラメータを調整しながら、その効果を確認できるため、研究開発、教育、プロトタイピングなど、物体検出技術の実験や検証を必要とする場面で活用できる。
1.2 主な機能
カメラによる連続物体検出
Google Colabのカメラアクセス機能を使用して、連続的に画像をキャプチャする。プログラムは各フレームに対して物体検出を実行し、画像内の物体を自動的に探し出す。
80クラスのCOCOデータセット物体の検出
このプログラムは80種類の物体を認識できる。これらの物体は、COCOデータセット(大規模な物体検出用の画像データベース)で定義されている。人物、車両、動物など、日常的に見かける物体が含まれている。
検出できる物体の例は次のとおりである。
- 人物:人
- 乗り物:自転車、車、バイク、飛行機、バス、電車、トラック、ボート
- 動物:鳥、猫、犬、馬、羊、牛、象、熊、シマウマ、キリン
- 屋外の物体:信号機、消火栓、停止標識、ベンチ
- 家具:椅子、ソファ、ベッド、ダイニングテーブル
- 食品:バナナ、リンゴ、サンドイッチ、オレンジ、ピザ
- 電子機器:テレビ、ノートPC、マウス、キーボード、携帯電話
- その他:本、時計、花瓶、はさみ
インタラクティブなパラメータ調整機能
スライダーを使って、信頼度閾値とIOU閾値を動的に調整できる。スライダーを動かすと、即座に検出が再実行され、結果が更新される。これにより、パラメータが検出結果に与える影響を確認できる。
検出結果の視覚化(バウンディングボックスとラベル)
プログラムは検出した物体を画像上に表示する。物体の周りに緑色の矩形の枠(バウンディングボックス)を描き、その上に物体の名前(ラベル)と信頼度を表示する。検出結果を連続的に表示するため、どこに何が検出されたかを確認できる。
検出物体の詳細情報表示(クラス名、信頼度、検出数)
プログラムは検出した物体について、以下の情報を表示する。
- クラス名:物体の種類の名前(例:「人」「車」「犬」)
- 信頼度:モデルがその物体であると判断した確信の度合いを0.0から1.0の数値で表したもの。1.0に近いほど確信度が高い。統計的な確率そのものではなく、モデル内部の指標である
- 検出数:画像内で検出された物体の総数
1.3 基本的な使い方
- Colabのページを開く
Colabのページ: https://colab.research.google.com/drive/1d72VqaauEbMIIRTv45nnPF6FAtlX_HA0?usp=sharing
- セルを実行する
- カメラへのアクセスを許可する(ブラウザの許可ダイアログが表示される)
- モデルの読み込みが完了すると、スライダーが表示される
- スライダーを動かして信頼度閾値とIOU閾値を調整し、検出結果の変化を確認する
1.4 便利な機能
- スライダーによる直感的なパラメータ調整(信頼度閾値:0.0から1.0、IOU閾値:0.0から1.0)
- スライダー操作による検出結果の即時更新により、パラメータの影響を確認可能
- 連続的な検出結果表示により、その場での確認が容易
- 検出された物体のリスト表示により、詳細情報を確認可能
- 軽量なnanoモデルの使用により、高速な処理を実現
1.5 パラメータの説明
信頼度(Confidence)とは
物体検出の信頼度とは、モデルがその物体を正しく認識していると判断した確信の度合いを0.0から1.0の数値で表したものである。1.0に近いほど確信度が高い。
IOU(Intersection over Union)とは
IoUは、2つの矩形領域(バウンディングボックス)の重なり具合を表す指標である。以下の式で計算される。
IoU = 重なり領域の面積 / 結合領域の面積
IoUの値は0から1の範囲を取り、0は全く重ならない状態、1は完全に一致する状態を表す。例えばIoUが0.7であれば、重なり領域が結合領域の70%を占めることを意味する。同じ物体に対する重複検出を除去する際に使用される。
信頼度閾値(Confidence Threshold)
検出結果をフィルタリングする基準となる値である。この値より高い信頼度を持つ検出のみが表示される。
- 値を上げる(0.5から0.7):誤検出が減少するが、見逃しが増える可能性がある
- 値を下げる(0.1から0.2):より多くの物体を検出するが、誤検出も増える
- Ultralyticsの既定値:0.25(バランスの取れた設定)
IOU閾値(Intersection over Union Threshold)
NMS(Non-Maximum Suppression、重複検出を除去する後処理)において、重複とみなす基準となる値である。同じ物体に対して複数の検出があった場合、IoU値がこの閾値を超える重複を除去する。NMSを使用する場合の挙動は次のとおりである。
- 値を上げる(0.6から0.8):重複検出が残りやすくなる
- 値を下げる(0.2から0.3):より積極的に重複を除去する
- Ultralyticsの既定値:0.7
ただし、このプログラムが使用するYOLOv10は、既定でNMSを使わないEnd-to-End推論(NMSフリー推論)で動作する。そのため、IOU閾値スライダーを動かしても検出結果は変化しない。これはプログラムの不具合ではなく、YOLOv10が一対一ヘッド(one-to-one head、1つの物体に対して1つの予測だけを出力する仕組み)によって重複検出を抑えているためである。UltralyticsでIOU閾値を有効にするには、推論の実行時に end2end=False を指定し、従来のNMSパイプラインに切り替える必要がある。この挙動そのものが、モデルの設計とパラメータの関係を理解する題材になる。
2. プログラムの説明
2.1 概要
このプログラムは、Google Colab環境でYOLOv10nモデルを使用した物体検出を実行する。カメラから連続的にキャプチャした画像に対して、スライダーで調整可能な閾値パラメータを用いて物体検出を行い、検出結果を視覚化して表示する機能を提供する。
2.2 主要技術
YOLOv10 (You Only Look Once version 10)
物体検出アルゴリズムである[1]。2024年5月に清華大学の研究者らが公開した。訓練時に用いる一対多ヘッド(one-to-many head)と、推論時に用いる一対一ヘッド(one-to-one head)を組み合わせることで、従来のYOLOシリーズで必要だったNMS後処理を不要としている。このプログラムでは、最も軽量なnano(n)モデルを使用し、高速な推論を実現している。
Ultralytics
YOLOモデルの実装と展開を支援するPythonパッケージである[2]。YOLOv3からYOLO26まで複数のYOLOバージョンをサポートし、訓練、検証、推論、エクスポートの機能を統合したフレームワークを提供する。
ipywidgets
Jupyter NotebookやGoogle Colabでインタラクティブなウィジェット(スライダー、ボタンなど)を提供するライブラリである。このプログラムでは、信頼度閾値とIOU閾値を動的に調整するためのスライダーUIを実装している。
2.3 技術的特徴
- インタラクティブなパラメータ調整
ipywidgetsの@interactデコレータを使用し、スライダーによるパラメータ調整機能を実装している。スライダーを動かすと即座に検出が再実行され、結果が更新される。これにより、パラメータの影響を直感的に理解できる。
- 明示的な閾値設定
信頼度閾値(conf)とIOU閾値(iou)の両方を明示的に指定している。0.0から1.0の範囲で自由に調整でき、極端な値での動作も確認できる。これにより、閾値パラメータの理解を深めることができる。
- 軽量モデルによる高速処理
YOLOv10n(nano)モデルを使用することで、CPUでも高速な推論を実現している。スライダー調整時の待ち時間を最小化し、快適な体験を提供する。
- 視覚的な結果表示
cv2_imshowを使用し、検出結果を連続的に表示している。検出された物体にはバウンディングボックスとラベル(クラス名、信頼度)を描画し、分かりやすい形で結果を提示する。
2.4 実装の特色
Google Colab環境に特化した実装として、以下の機能を備える。
- カメラキャプチャAPIによる連続的な画像入力
- ipywidgetsによる直感的なパラメータ調整UI
- cv2_imshowを使用した連続的な検出結果表示
- 検出数の表示
- 検出物体の詳細情報(クラス名、信頼度)のリスト出力
- 教育・研究用途に適した広範囲なパラメータ調整範囲
2.5 参考文献
[1] Wang, A., Chen, H., Liu, L., Chen, K., Lin, Z., Han, J., & Ding, G. (2024). YOLOv10: Real-Time End-to-End Object Detection. Advances in Neural Information Processing Systems (NeurIPS 2024). arXiv:2405.14458. https://arxiv.org/abs/2405.14458
[2] Jocher, G., & Qiu, J. (2024). Ultralytics YOLO11 (Version 11.0.0) [Computer software]. https://github.com/ultralytics/ultralytics
3. 実験・研究スキルの基礎
3.1 実験・研究のスキル構成要素
実験や研究を行うには、以下の5つの構成要素を理解する必要がある。
3.1.1 実験用データ
このプログラムではカメラからキャプチャした画像が実験用データである。
3.1.2 実験計画
何を明らかにするために実験を行うのかを定める。
計画例:
- 信頼度閾値が検出数に与える影響を確認する
- IOU閾値を変えても検出結果が変化しないことを確認し、その理由(YOLOv10のNMSフリー推論)を考察する
- 誤検出を最小化するためのパラメータ設定を見つける
- 見逃しを減らしながら誤検出を抑える方法を探る
- 特定の物体(人、車など)を確実に検出する設定を見つける
3.1.3 プログラム
実験を実施するためのツールである。このプログラムはUltralyticsのYOLOv10nモデルとipywidgetsのinteract関数を使用している。
- プログラムの機能を理解して活用することが基本である
- 基本となるプログラムを出発点として、将来、様々な機能を自分で追加することができる
3.1.4 プログラムの機能
このプログラムは2つのパラメータで物体検出を制御する。
入力パラメータ:
- 信頼度閾値:検出結果を表示する最低信頼度(0.0から1.0)
- IOU閾値:重複検出を除去する基準値(0.0から1.0)。YOLOv10のNMSフリー推論では検出結果に影響しない
出力情報:
- 検出結果画像の連続表示
- 現在のパラメータ値と検出数を含むテキスト表示
- 検出された物体のリスト(クラス名と信頼度)
スライダーの動作:
- スライダーを動かすと即座に検出が実行され、結果が更新される
3.1.5 検証(結果の確認と考察)
プログラムの実行結果を観察し、パラメータの影響を考察する。
基本認識:
- パラメータを変えると結果が変わる。その変化を観察することが実験である
- パラメータを変えても結果が変わらない場合、その理由を突き止めることも実験である
- 「良い結果」「悪い結果」は目的によって異なる
観察のポイント:
- 検出数はどう変化するか
- 誤検出(存在しない物体の検出)は発生しているか
- 見逃し(本来検出すべき物体の未検出)は発生しているか
- 重複検出(同じ物体への複数の矩形)は発生しているか
- 信頼度の値は妥当か
3.2 間違いの原因と対処方法
3.2.1 プログラムのミス(人為的エラー)
モデルのダウンロードに時間がかかる
- 原因:初回実行時にYOLOv10nモデルをダウンロードしている
- 対処方法:これは正常な動作である。ダウンロードが完了するまで待つ
3.2.2 期待と異なる結果が出る場合
信頼度閾値を変えても検出数が変化しない
- 原因:元々検出される物体が少ないシーン、またはパラメータの変化幅が小さすぎる
- 対処方法:信頼度閾値を0.1から0.7まで大きく変化させて観察する
IOU閾値を変えても結果が変化しない
- 原因:YOLOv10は既定でNMSフリー推論を行うため、IOU閾値が使われていない
- 対処方法:これは正常な動作である。YOLOv10の一対一ヘッドが重複検出を抑えていることを確認する機会である
明らかに存在する物体が検出されない
- 原因:信頼度閾値が高すぎる、または物体がCOCOデータセットの80クラスに含まれていない
- 対処方法:信頼度閾値を0.1程度まで下げて確認する。それでも検出されない場合は、その物体クラスが対応していない可能性がある
同じ物体に複数の矩形が表示される
- 原因:一対一ヘッドが重複を抑えきれていない。YOLOv10ではIOU閾値による除去は行われない
- 対処方法:信頼度閾値を上げて低信頼度の重複を減らす
誤検出が多すぎる
- 原因:信頼度閾値が低すぎる
- 対処方法:信頼度閾値を0.5以上に上げる。どの程度で誤検出が減るか記録する
3.3 実験レポートのサンプル
誤検出と見逃しのバランス調整
実験目的:
テスト画像内の人物を確実に検出しながら、誤検出を最小化するための最適な信頼度閾値を見つける。
実験計画:
IOU閾値は既定のままとし(YOLOv10のNMSフリー推論では検出結果に影響しない)、信頼度閾値を変化させて最適値を探す。
実験方法:
プログラムを実行し、スライダーを操作しながら以下の基準で評価する。
- 正検出数:正しく検出された人物の数
- 誤検出数:人物でないものが人物として検出された数
- 見逃し数:検出されなかった人物の数
実験結果:
| 信頼度閾値 | 検出総数 | 正検出数 | 誤検出数 | 見逃し数 | 総合評価 |
|---|---|---|---|---|---|
| 0.10 | x | x | x | x | x |
| 0.25 | x | x | x | x | x |
| 0.50 | x | x | x | x | x |
| 0.70 | x | x | x | x | x |
考察:
- (例文)信頼度閾値xxxでは検出総数が多いが、誤検出も多く含まれていた。背景の物体を人物と誤認識する傾向が見られた
- (例文)信頼度閾値xxxでは誤検出が減少し、ほとんどの人物を正しく検出できた。既定値として妥当な設定であると考えられる
- (例文)信頼度閾値xxx以上では誤検出はほぼなくなったが、画像の端や一部が隠れた人物の見逃しが増加した
- (例文)信頼度閾値を上げるほど誤検出は減るが、同時に見逃しも増えるというトレードオフの関係が確認できた
結論:
(例文)本実験の画像においては、信頼度閾値0.25が最もバランスの取れた設定であった。誤検出を完全に防ぐことよりも、重要な人物を見逃さないことを優先する場合は0.25、誤検出を極力避けたい場合は0.50が適切である。用途に応じて閾値を調整する必要性が確認できた。