Python/OpenCVで固定UI上に追加される画像グループを高精度に認識・追跡する方法
解決したいこと
PythonとOpenCVを使って、Windowsアプリの画面をリアルタイムで画像認識するプログラムを作っています。
画面内のほぼ決まった位置に、3〜4個程度の小さい画像で構成された「グループ」が追加されるUIがあります。
このUIには以下の特徴があります。
- 表示される位置はほぼ固定
- 最大4グループ程度まで増える
- 一度追加されると、画面が切り替わるまで長時間その場所に残る
- 1グループは3個または4個程度の小画像で構成される
- 一部が横向きになったり、重なったりする場合がある
- 一時的な画面演出で数秒隠れる場合がある
- 各小画像が何の種類なのかも識別したい
処理速度よりも、まずは誤検出をできるだけ0に近づけることを重視しています。
現在の方法
現在は以下を組み合わせています。
- 固定ROIの監視
- before / afterのフレーム差分
- OpenCVによる輪郭・component検出
- テンプレートマッチング
- 複数フレームでの多数決
- 前回認識した状態の保持
- 一度確定した状態を簡単に削除しない状態管理
また、一瞬だけ表示される情報よりも、長時間残る画像グループそのものを主な情報として使う方向へ変更しています。
現在困っていること
主に以下の問題があります。
- 背景や別の画面変化を、新しく追加されたグループとして誤認することがある
- 3個構成と4個構成のグループが、表示角度や重なりによって似た形になる場合がある
- 一時的な演出で対象が隠れた際に、状態を消失したと誤判断することがある
- 新しく追加されたグループだけを安定して抽出したい
- 小さい画像それぞれの種類判定精度を上げたい
- 1フレームだけで判断せず、長時間残るという特徴をもっと有効活用したい
質問
このような、
「固定UIの決まった場所に追加され、一度出現すると長時間残り続ける小さい画像グループ」
をリアルタイムで高精度に追跡する場合、どのような設計が適しているでしょうか?
現在考えている候補は、
- スロット単位のステートマシン
- OpenCVのフレーム差分+テンプレートマッチング
- 特徴量ベースの認識
- YOLO等の物体検出
- セグメンテーション
- 複数フレームを使った時系列追跡
などです。
特に知りたいのは、
1. この条件ならOpenCVのルールベースを詰めるべきか、物体検出モデルへ移行した方がよいか
2. 「一度表示されたら長時間残る」という性質を利用する場合、どのような状態管理・追跡方法が一般的か
3. 3個構成と4個構成が似ている場合、単純な輪郭数以外にどのような特徴を見ると安定するか
4. 一時的な遮蔽が発生しても、既に確定した状態を安全に維持するにはどのような設計がよいか
です。
Python / OpenCVで実装しています。
画像処理・Computer Visionに詳しい方がいましたら、現在の方式より適した設計や、改善できそうな点をご教示いただけると助かります。