@minahiro39

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Python/OpenCVで固定UI上に追加される画像グループを高精度に認識・追跡する方法

解決したいこと

PythonとOpenCVを使って、Windowsアプリの画面をリアルタイムで画像認識するプログラムを作っています。

画面内のほぼ決まった位置に、3〜4個程度の小さい画像で構成された「グループ」が追加されるUIがあります。

このUIには以下の特徴があります。

  • 表示される位置はほぼ固定
  • 最大4グループ程度まで増える
  • 一度追加されると、画面が切り替わるまで長時間その場所に残る
  • 1グループは3個または4個程度の小画像で構成される
  • 一部が横向きになったり、重なったりする場合がある
  • 一時的な画面演出で数秒隠れる場合がある
  • 各小画像が何の種類なのかも識別したい

処理速度よりも、まずは誤検出をできるだけ0に近づけることを重視しています。

現在の方法

現在は以下を組み合わせています。

  • 固定ROIの監視
  • before / afterのフレーム差分
  • OpenCVによる輪郭・component検出
  • テンプレートマッチング
  • 複数フレームでの多数決
  • 前回認識した状態の保持
  • 一度確定した状態を簡単に削除しない状態管理

また、一瞬だけ表示される情報よりも、長時間残る画像グループそのものを主な情報として使う方向へ変更しています。

現在困っていること

主に以下の問題があります。

  1. 背景や別の画面変化を、新しく追加されたグループとして誤認することがある
  2. 3個構成と4個構成のグループが、表示角度や重なりによって似た形になる場合がある
  3. 一時的な演出で対象が隠れた際に、状態を消失したと誤判断することがある
  4. 新しく追加されたグループだけを安定して抽出したい
  5. 小さい画像それぞれの種類判定精度を上げたい
  6. 1フレームだけで判断せず、長時間残るという特徴をもっと有効活用したい

質問

このような、

「固定UIの決まった場所に追加され、一度出現すると長時間残り続ける小さい画像グループ」

をリアルタイムで高精度に追跡する場合、どのような設計が適しているでしょうか?

現在考えている候補は、

  • スロット単位のステートマシン
  • OpenCVのフレーム差分+テンプレートマッチング
  • 特徴量ベースの認識
  • YOLO等の物体検出
  • セグメンテーション
  • 複数フレームを使った時系列追跡

などです。

特に知りたいのは、

1. この条件ならOpenCVのルールベースを詰めるべきか、物体検出モデルへ移行した方がよいか

2. 「一度表示されたら長時間残る」という性質を利用する場合、どのような状態管理・追跡方法が一般的か

3. 3個構成と4個構成が似ている場合、単純な輪郭数以外にどのような特徴を見ると安定するか

4. 一時的な遮蔽が発生しても、既に確定した状態を安全に維持するにはどのような設計がよいか

です。

Python / OpenCVで実装しています。

画像処理・Computer Visionに詳しい方がいましたら、現在の方式より適した設計や、改善できそうな点をご教示いただけると助かります。

0 likes

1Answer

文章だと正直なところどういう画像や対象かがよくわからないのですが。
OBSや動画からFF14のユーザーキャラクターの名前を消すことを目標に、

  1. Python+OPENCVテンプレートマッチング
  2. Python+Ultralytics yolov8
  3. VC++ + yolo26 + bytetrack

と試行錯誤してきたので、その経験を書きます。
上記の通り、私は検出の安定感を求めて物体検出にしました。

当初は名前の前にあるアイコンでテンプレートマッチングすることで解決しようとしましたが、アイコンが少しでも隠れると検出できないことや、分割したテンプレートでマッチングしたらどうか?など試したりしましたが、結局100%の検出ができなかったので、テンプレートマッチングを諦めました。
物体検出は、当初はDETRというもので進めていましたが、その後Ultralytics yolov8にしています。
物体検出は精度がとても高く満足できました。ただ学習データづくりが大変です。学習データが少ないとチラチラと検出漏れが起こりやすくなるので、ずっと学習データ作りをしている感じになります。
前後フレームを利用して、ということも試したこともありましたが、負荷が高くなるものの思っているより検出状況は改善しませんでした。Ultralyticsのdiscordに検出のちらつきと前後フレームの利用を相談したこともありましたが、それは学習データが少ないからだ、という回答でした。物体検出は全て学習データに依るところが大きいです。

"追跡"というのは、対象が隠れることがあるから、なんでしょうか。
隠れたとしても見えた時に検出できればいいのであれば、必要ないのかもしれません。
私は最近bytetrackを導入しました。目的は、OCRをしているのですが処理負荷が高いので、物体追跡をすることでOCRの実行頻度を下げて、その間も最新のOCR結果が物体検出結果に紐づけるために使っています。

OPENCVを突き詰めて、求める精度が得られればいいと思いますが、感覚的に意外と天井が低く伸び代はない印象です。
物体検出は、精度はかなり高いですが、学習データ作りが大変です。苦行です。
どのような検出対象なのかがよくわからないので、私の経験を書かせていただきました。

0Like

Your answer might help someone💌