概要
以下の画像のように,駐車場の出入口付近にROIを設け,ROI内に入った車両のバウンディングボックスの移動から入庫・出庫を判定する.
開発目的
駐車場出入口において,車両の入庫・出庫を自動で検知できるようにする.
従来の単純な座標比較では,以下のようなケースで誤判定が発生する可能性がある.
- 車両が蛇行しながら入庫する場合
- 大回りして入庫・出庫する場合
- 一時停止や切り返しによって,短時間だけ逆方向に移動する場合
- 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}
$$
考えられる開発時間
よしなに
備考
概要
以下の画像のように,駐車場の出入口付近にROIを設け,ROI内に入った車両のバウンディングボックスの移動から入庫・出庫を判定する.
開発目的
駐車場出入口において,車両の入庫・出庫を自動で検知できるようにする.
従来の単純な座標比較では,以下のようなケースで誤判定が発生する可能性がある.
そのため,単純な
x1 < x2 and y1 < y2の判定ではなく,ROI内における車両の「進行度」を用いて,入庫・出庫を判定する仕組みを実装する.考えられる開発内容
1. bboxの代表点を取得する
各フレームで検出されたbboxから,車両の代表点を取得する.
代表点は,bboxの中心ではなく,車両の地面接地点に近い bbox下辺中央 を用いる.
この代表点を用いて,ROI内での車両の移動を追跡する.
2. ROI内に入ったtrack IDのみを処理する
トラッキングによって得られた各車両IDについて,代表点がROI内に存在する場合のみ,入出庫判定の対象とする.
ROI外の車両については,誤検知を防ぐため判定対象外とする.
3. ROI内の進行度
sを計算する単純に
x座標とy座標の増減を見るのではなく,ROI内における進行度sを定義する.このとき,入庫方向に進むほど
sは大きくなり,出庫方向に進むほどsは小さくなる.これにより,蛇行や大回りによって一時的にx座標が逆方向へ動いた場合でも,全体として駐車場側へ進んでいれば入庫として扱うことができる.
4. 進行度
sによるバンドを定義するROI内を,進行度
sに応じて以下の3つの領域に分ける.各バンドの意味は以下の通り.
入口側バンド
道路側・出入口に近い領域.入庫車両が最初に通過し,出庫車両が最後に通過する領域.
中央バンド
ROIの中間領域.車両がROI内を移動中であることを表す領域.この領域だけでは入出庫を確定しない.
奥側バンド
駐車場の内側・奥側に近い領域.入庫車両が最後に到達し,出庫車両が最初に通過する領域.
概念図は以下の通り.
5. 状態管理を行う
track IDごとに状態を保持し,一度入庫・出庫としてカウントしたIDを重複してカウントしないようにする.
状態の例:
判定条件の例:
6. 一時的な逆方向移動を許容する
車両は必ずしも直線的に移動するとは限らないため,毎フレームで
sが単調増加・単調減少することは要求しない.その代わり,ROI内で十分な距離を移動したかを以下の値で判定する.
判定式の例:
例えば,
threshold = 0.5とした場合,以下のような履歴であれば入庫として判定できる.一方で,以下のように途中で引き返した場合は,奥側バンドに到達していないため入庫としてカウントしない.
必要に応じて,以下のような条件も追加する.
これにより,蛇行・一時停止・bboxの揺れに対してある程度ロバストな判定が可能になる.
7. 完了条件
評価指標
処理速度
カウントシステムの処理速度が何msなのかを別個で評価する
Count Error
最終的な台数誤差
実際の入場台数・退場台数と,システムのカウントがどれだけずれたか
複数動画で評価するなら,平均絶対誤差として,
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
S1 Efficiency: 処理効率を表す
S1 Effectiveness: カウント誤差
F1 score
各車両の入場・退場イベントを正しく検出できたかを評価する
として,
考えられる開発時間
よしなに
備考