Skip to content

[experiment] ROI (Region Of Interest)のbbox変動分析 #89

Description

@ucn-yushin

概要

以下の画像のように,駐車場の出入口付近にROIを設け,ROI内に入った車両のバウンディングボックスの移動から入庫・出庫を判定する.

Image

開発目的

駐車場出入口において,車両の入庫・出庫を自動で検知できるようにする.

従来の単純な座標比較では,以下のようなケースで誤判定が発生する可能性がある.

  • 車両が蛇行しながら入庫する場合
  • 大回りして入庫・出庫する場合
  • 一時停止や切り返しによって,短時間だけ逆方向に移動する場合
  • bboxの検出位置がフレームごとに揺れる場合

そのため,単純な x1 < x2 and y1 < y2 の判定ではなく,ROI内における車両の「進行度」を用いて,入庫・出庫を判定する仕組みを実装する.

考えられる開発内容

1. bboxの代表点を取得する

各フレームで検出されたbboxから,車両の代表点を取得する.

代表点は,bboxの中心ではなく,車両の地面接地点に近い bbox下辺中央 を用いる.

cx = (x_min + x_max) / 2
cy = y_max
point = (cx, cy)

この代表点を用いて,ROI内での車両の移動を追跡する.

2. ROI内に入ったtrack IDのみを処理する

トラッキングによって得られた各車両IDについて,代表点がROI内に存在する場合のみ,入出庫判定の対象とする.

ROI外の車両については,誤検知を防ぐため判定対象外とする.

3. ROI内の進行度 s を計算する

単純に x座標y座標 の増減を見るのではなく,ROI内における進行度 s を定義する.

s = 0.0 : 道路側・入口側
s = 1.0 : 駐車場側・奥側

このとき,入庫方向に進むほど s は大きくなり,出庫方向に進むほど s は小さくなる.

入庫 : s が小さい値から大きい値へ変化
出庫 : s が大きい値から小さい値へ変化

これにより,蛇行や大回りによって一時的にx座標が逆方向へ動いた場合でも,全体として駐車場側へ進んでいれば入庫として扱うことができる.

4. 進行度 s によるバンドを定義する

ROI内を,進行度 s に応じて以下の3つの領域に分ける.

入口側バンド : s < 0.25
中央バンド   : 0.25 <= s <= 0.75
奥側バンド   : s > 0.75

各バンドの意味は以下の通り.

  • 入口側バンド
    道路側・出入口に近い領域.入庫車両が最初に通過し,出庫車両が最後に通過する領域.

  • 中央バンド
    ROIの中間領域.車両がROI内を移動中であることを表す領域.この領域だけでは入出庫を確定しない.

  • 奥側バンド
    駐車場の内側・奥側に近い領域.入庫車両が最後に到達し,出庫車両が最初に通過する領域.

概念図は以下の通り.

                 駐車場側・奥側
                      s = 1.0
            ┌────────────────────┐
           /      奥側バンド       \
          /        s > 0.75        \
         /────────────────────────\
        /                          \
       /        中央バンド          \
      /      0.25 <= s <= 0.75      \
     /                              \
    /────────────────────────────────\
   /        入口側バンド              \
  /           s < 0.25                \
 └────────────────────────────────────┘
        道路側・入口側
             s = 0.0

        入庫方向 : s が増加する
        出庫方向 : s が減少する

5. 状態管理を行う

track IDごとに状態を保持し,一度入庫・出庫としてカウントしたIDを重複してカウントしないようにする.

状態の例:

UNKNOWN        : 判定前
IN_CANDIDATE  : 入庫候補
OUT_CANDIDATE : 出庫候補
COUNTED        : カウント済み

判定条件の例:

入庫:
入口側バンドから開始し,奥側バンドへ到達した場合

出庫:
奥側バンドから開始し,入口側バンドへ到達した場合

6. 一時的な逆方向移動を許容する

車両は必ずしも直線的に移動するとは限らないため,毎フレームで s が単調増加・単調減少することは要求しない.

その代わり,ROI内で十分な距離を移動したかを以下の値で判定する.

s_start:
  対象IDの車両がROI内で判定対象になった時点の進行度.
  例:入口側バンド,または奥側バンドに入った最初の値.

s_end:
  対象IDの車両がROI内を移動した後の進行度.
  例:反対側のバンドに到達した時点の値.

threshold:
  入庫・出庫として判定するために必要な最小移動量.
  bboxの揺れや短時間の移動による誤判定を防ぐために設定する.

判定式の例:

入庫:
s_end - s_start > threshold

出庫:
s_start - s_end > threshold

例えば,threshold = 0.5 とした場合,以下のような履歴であれば入庫として判定できる.

s_history = [0.12, 0.28, 0.45, 0.61, 0.82]

s_end - s_start = 0.82 - 0.12 = 0.70

一方で,以下のように途中で引き返した場合は,奥側バンドに到達していないため入庫としてカウントしない.

s_history = [0.10, 0.25, 0.38, 0.30, 0.18]

必要に応じて,以下のような条件も追加する.

正方向に進んだフレーム数 > 逆方向に戻ったフレーム数

これにより,蛇行・一時停止・bboxの揺れに対してある程度ロバストな判定が可能になる.

7. 完了条件

  • ROI内に入った車両IDごとに移動履歴を保持できる
  • bboxの代表点を用いて,ROI内での進行度を計算できる
  • 入庫・出庫をそれぞれ判定できる
  • 一度カウントしたtrack IDを重複してカウントしない
  • 蛇行・大回り・一時的な逆方向移動でも極端に誤判定しない
  • 検知結果をログなどで確認できる

評価指標

処理速度

カウントシステムの処理速度が何msなのかを別個で評価する

Count Error

最終的な台数誤差

実際の入場台数・退場台数と,システムのカウントがどれだけずれたか

$$ \text{Count Error}=∣N'_{in}−N_{in}∣+∣N'_{out}−N_{out}∣ $$

複数動画で評価するなら,平均絶対誤差として,

$$ MAE=\frac{1}{M}∑^M_{i=1}∣N'_i−N_i∣ $$

S1 score

NVIDIA AI City Challengeと呼ばれる,おそらくコンペ形式のチャレンジが行われていたが,良さそうに見えたので,これを参考にする.

参考文献

https://openaccess.thecvf.com/content_CVPRW_2020/papers/w35/Folenta_Determining_Vehicle_Turn_Counts_at_Multiple_Intersections_by_Separated_Vehicle_CVPRW_2020_paper.pdf

$$ \text{S1} =0.3 \times \text{S1 Efficiency} + 0.7 \times \text{S1 Effectiveness} $$

S1 Efficiency: 処理効率を表す

S1 Effectiveness: カウント誤差

F1 score

各車両の入場・退場イベントを正しく検出できたかを評価する

TP正しく検出したイベント
FP存在しないのに検出したイベント
FN存在したのに見逃したイベント

として,

$$ \text{Precision}=\frac{TP}{TP+FP} $$

$$ \text{Recall}=\frac{TP}{TP+FN} $$

$$ \text{F1} = \frac{2 \times Precision \times Recall}{Precision + Recall} $$

考えられる開発時間

よしなに

備考

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions