Skip to content

OCR表示安定化をフレームバッファ方式から追跡方式へ置き換える #643

Description

@Freeesia

概要

OcrBufferFilterによる過去フレーム検索方式を、画面上のテキスト領域を継続管理する追跡方式へ置き換える。

OCR結果のフレーム間変動を吸収し、翻訳オーバーレイの位置、サイズ、内容を安定させる。

現状の問題

現在は過去数フレームのTextRectを平坦化し、各OCR結果について最初に類似した結果を採用している。

この方式では以下が発生する。

  • 候補の列挙順によって対応先が変わる
  • 同じ過去結果が複数の現在結果に使用される可能性がある
  • 文字列、位置、サイズの微小変動によって対応先が切り替わる
  • 一時的な誤認識や未認識によって表示が揺れる
  • OCR矩形の一時的な分割・統合に対応しにくい

処理位置

追跡処理はIOcrModule.RecognizeAsyncの実行直後に配置する。

キャプチャ
→ IOcrModule
→ 追跡処理
→ 色取得
→ PreTranslateフィルター
→ 翻訳処理
→ PostTranslateフィルター
→ オーバーレイ表示

追跡処理の入力には、OCRモジュールが最終的に返した統合済みTextRectの集合を使用する。

追跡処理は、安定化済みのTextRectを後続処理へ出力する。

基本方針

各テキスト領域を論理トラックとして継続管理する。

各トラックでは少なくとも以下を管理する。

  • 最新のOCR観測
  • 安定化済みの位置とサイズ
  • 確定済み文字列
  • 文字列の変更候補
  • 最終認識時刻または認識回数
  • 一時未認識状態
  • 分割・統合の保留状態

更新処理

1回のOCR処理ごとに以下を順番に実行する。

  1. 現在のOCR結果を取得する
  2. 既存トラックとの1対1候補を評価する
  3. 信頼度の高い1対1対応を確定する
  4. 未対応項目について分割候補を評価する
  5. 未対応項目について統合候補を評価する
  6. 確定した対応に基づいてトラックを更新する
  7. 未対応のOCR結果から新規トラックを作成する
  8. 未対応の既存トラックを一時未認識状態へ移行する
  9. 保持条件を超えたトラックを削除する
  10. 安定化済みのTextRectを出力する

初期実装は直列処理とする。

通常の対応付け

通常は、一つのOCR結果を一つの論理トラックへ対応付ける。

候補評価には主に以下を使用する。

  • 矩形の重なり率
  • 中心点距離
  • 幅と高さの比率
  • アスペクト比
  • 文字列類似度
  • 前回位置からの移動量
  • 最終認識からの経過時間

空間的に離れた候補を先に除外し、残った候補について詳細なスコアを計算する。

複数候補が競合する場合は、列挙順ではなく、全体として整合する対応を選択する。

具体的なスコア式、重み、割当てアルゴリズムは実装時に決定する。

OCR結果が分割された場合

前回は一つだったトラックに対し、現在フレームで複数のOCR結果が対応する場合を分割候補として扱う。

前回: [New Game]
今回: [New] [Game]

未対応のOCR結果について以下を評価する。

  • 空間的に隣接している
  • 同じ行または読み方向に並んでいる
  • 高さ、角度、フォントサイズが近い
  • 結合矩形が過去のトラック矩形に近い
  • 読み順に連結した文字列が過去の文字列に近い

対応が確定した場合は既存のトラックIDを維持し、一つの論理トラックとして出力する。

OCR結果が統合された場合

前回は複数だったトラックに対し、現在フレームで一つのOCR結果が対応する場合を統合候補として扱う。

前回: [New] [Game]
今回: [New Game]

一つのOCR結果について、隣接する未対応トラックを組み合わせた以下の情報を評価する。

  • 複数トラックの結合矩形
  • 読み順に連結した確定文字列
  • 行位置と間隔
  • 高さ、角度、フォントサイズ
  • 過去フレームでの分割・統合履歴

統合状態が一時的な場合は既存トラックの安定表示を維持し、同じ状態が継続した場合に一つの論理トラックへ移行する。

位置とサイズの安定化

各トラックで最新のOCR値と後続処理へ渡す安定値を分離する。

安定化対象は以下。

  • X
  • Y
  • Width
  • Height
  • FontSize
  • Angle
  • MultiLine

微小な変化はOCRノイズとして吸収し、継続的または十分に大きい変化は実際の移動・レイアウト変更として反映する。

文字列の安定化

各トラックで以下を区別する。

  • 最新のOCR文字列
  • 変更候補文字列
  • 確定済み文字列

新規トラックでは初回のOCR文字列を即時に確定する。

既存トラックでは、一時的な文字列変動を確定済み文字列へ即時反映せず、同じ候補が継続した場合や実際の内容変更と判断できる場合に更新する。

一時未認識

現在のOCR結果と対応しなかったトラックは、一時未認識状態へ移行する。

保持期間中は安定化済みのTextRectを出力し、再認識された場合は同じトラックとして更新を再開する。

保持条件を超えた場合はトラックを削除する。

OcrBufferFilterの置き換え

以下の責務を新しい追跡処理へ移す。

  • 過去結果との対応付け
  • 位置とサイズの安定化
  • フォントサイズの安定化
  • 文字列の安定化
  • 一時未認識時の表示維持
  • 過去状態の保持と削除

移行後、OcrBufferFilterを削除する。

One-shot機能の削除

以下を削除する。

  • One-shot設定
  • One-shot用UI
  • 初回キャプチャ状態
  • 初回のみOCRを実行する条件分岐
  • オーバーレイ再表示時のOne-shot再実行処理
  • OcrBufferFilter内のOne-shot分岐

性能方針

初期実装は直列処理とする。

以下によって処理量を抑える。

  • 空間条件による候補の早期除外
  • 文字列類似度を計算する候補の限定
  • 分割・統合候補を隣接項目に限定
  • 組み合わせるOCR結果またはトラック数の制限
  • 一時未認識トラックの適切な削除
  • 不要な長期履歴を保持しない

受け入れ条件

  • 静止したテキストの位置、サイズ、内容がOCRの微小変動によって継続的に揺れない
  • OCR結果が一時的に欠落しても保持期間内は表示を維持する
  • 新しいテキスト領域は初回認識時点から表示・翻訳対象になる
  • 実際の文字列変更は安定化後に後続処理へ反映される
  • 実際の位置移動には適切に追従する
  • 通常のOCR結果が既存トラックへ一貫して対応付けられる
  • OCR結果が一時的に複数へ分割されても同じ論理トラックとして表示を維持する
  • 複数のOCR結果が一時的に統合されても重複表示や即時の構造変更が発生しない
  • 同じ文字列が複数箇所に存在しても誤ったトラックへ対応付けられない
  • 追跡処理がOCR直後に実行される
  • OCRと翻訳の非同期処理が維持される
  • One-shot機能に関連する処理が削除されている
  • 旧フレームバッファ方式が追跡方式へ置き換えられている
  • 追跡処理が通常のOCR処理時間に対して支配的な負荷にならない

実装時に決定する事項

  • 追跡処理のクラス構成
  • 追跡状態の内部データ構造
  • 対応スコアの計算式と重み
  • 通常対応の割当てアルゴリズム
  • 分割・統合候補の生成方法
  • 分割・統合の確定条件
  • 代表トラックの選択方法
  • 位置とサイズの安定化方式
  • 文字列変更の確定条件
  • 一時未認識の保持条件
  • 設定項目の名称と既定値
  • ログおよびテストの具体的な実装

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions