## MOSSEによる重畳車の
## 高速距離推定
計数工学科システムコース4年 王 允卓
---
## 1. 概要
* 複数の自動車をMOSSEで追跡
* 距離・速度推定
* 高速ステレオカメラ(500fps)
* 処理速度...平均0.35ms/(Frame・台)
* 様々な実装上の工夫を行うことで、
車同士が重畳した場合にも対応
---
## 0. 目次
1. 概要
2. 導入
3. 提案手法
4. 結果
5. 考察と結論
---
## 2. 導入
---
* 前方車までの距離・速度を推定したい
* 500fpsのステレオカメラ
* 車同士がかぶることもある

* それでも分離して距離・速度推定をしたい
---
### 先行研究1: Inverse Projection Method(IPM)
* 左右それぞれの画像を「地面」の平面に投影し、差分を検出
* 高速
* 弱点:
1. ノイズに弱く、現実の環境で使えない
2. 車同士が重畳すると、一つとして検出される
----
### 先方研究2: IPM + YOLO + MOSSE
* 重畳したときにYOLOで車を検出・分離
* YOLOは遅い (CPU上で150ms程度)
* その間をMOSSEを用いて追跡し補間
* 問題点:
1. Bounding Boxの位置で距離推定
YOLOのBBが不安定→推定距離がガクガク
2. MOSSEが間に合っていなかった(4ms程度)
---
### 本実験
* [MOSSE*のみ*を使って安定&高速な距離推定を実現](https://drive.google.com/file/d/1U8MmwkkpqP3gdY6ux87OT_2vIeUmjach/view?usp=sharing)
1. MOSSEの実装の安定化、高速化
3. 部分的に重畳している場合に対応
5. 両眼の視差を用いた精度の良い距離推定
6. 距離の情報を用いてBBの大きさを追従
7. カルマンフィルタを用いた速度推定
----
### 他の手法の検討
* KCF等...MOSSEより遅く、精度はMOSSEで十分
* 特徴点抽出(AKAZEやORB)...遅く(2ms程度)、
安定して検出し続けられる点が少なかった
* ステレオマッチング(SGMやBM)...MOSSEと
比べて遅く、境界や背景が安定しなかった
* オプティカルフロー...重畳車を区別するには
不十分な気がした
* 車と外界のエッジ検出は安定しなかった
---
## 3. 提案手法
---
### MOSSE(Minimum Output Sum of Squared Error)
* 畳み込みを用いた追跡アルゴリズム
* 画像を$f_i(\vec r)$としたとき、
$$ \arg\min_{h(\vec r)}\sum_i\int \left|(h * f_i)(\vec r) - g(\vec r)\right|^2 d\vec r$$
となるフィルタ$h(\vec r)$を学習させる。
* ただし、$g(\vec r)$は細いガウシアンを与える。
----
* フーリエ変換して考えると、
$$ \arg\min_{H(\vec r)}\sum_i\int \left|H(\boldsymbol k)F_i(\boldsymbol k) - G(\boldsymbol k)\right|^2 d\vec r$$
* これは簡単に解けて、
$$ H(\boldsymbol k) = \frac{\sum_i F_i^*(\boldsymbol k)G(\boldsymbol k)}{\sum_i F_i^*(\boldsymbol k)F_i(\boldsymbol k)}$$
(※ 実際にはフーリエ変換時に窓関数を掛ける)
----
### MOSSEの大枠
* 追跡したい範囲の画像$f_0(\vec r)\leftrightarrow F_0(\boldsymbol k)$
* $H_0(\boldsymbol k) = \frac{F_0^*(\boldsymbol k)G(\boldsymbol k)}{F_0^*(\boldsymbol k)F_0(\boldsymbol k) + \epsilon}$
* 同範囲の次のコマ$f_{i+1}(\vec r)\leftrightarrow F_{i+1}(\boldsymbol k)$が来たら、
* $H_i(\boldsymbol k)F_{i+1}(\boldsymbol k)\leftrightarrow (h_i * f_{i+1})(\vec r)$を計算
* $\Delta \vec r = \displaystyle \arg\max_{\vec r} (h_i * f_{i+1})(\vec r)$だけ範囲移動
* *移動先の画像を使って*、$H_i\to H_{i+1}$に更新
----
### $H_i\to H_{i+1}$の更新
* 分子と分母でそれぞれ指数移動平均を取る
* $A_{i+1}(\boldsymbol k) = (1-\eta)A_i(\boldsymbol k) + \eta F'^*_{i+1}(\boldsymbol k)G(\boldsymbol k)$
* $F'^*_{i+1}(\boldsymbol k)$は*移動先の画像の*フーリエ変換
* $B_{i+1}(\boldsymbol k) = (1-\eta)B_i(\boldsymbol k) + \eta F'^*_{i+1}(\boldsymbol k)F'_{i+1}(\boldsymbol k)$
* $H_{i+1}(\boldsymbol k) = A_{i+1}(\boldsymbol k) / (B_{i+1}(\boldsymbol k) + \epsilon)$
---
### 今回使ったMOSSEの追加の工夫(1)
* 初期BBは既知と仮定
* BB内をある固定のサイズ(64x64)にリサイズ
* <font color="yellow">移動量は小さいので、</font>$\Delta \vec r$を周囲±3px内で探索
(部分occlusionに強くなる)
* <font color="yellow">画像の変化が小さいので、</font>フィルタの学習率$\eta$を
かなり小さめに設定(ドリフトしにくくなる)
* $\Delta\vec r$の計算時に周囲9pxを見て二次近似し、subpixel精度を出す(距離推定が荒くなくなる)
---
### 今回使ったMOSSEの追加の工夫(2)
* 左右の視差から距離を推定(後述)し、BBのサイズも調整する(距離の変化が大きい時にもロバスト)
* 後ろの車の追跡時に前の車のBBを灰色で
塗りつぶす(前の車につられない)
* 前の車の視差の情報が残らないように、左右ともBB内で同じ位置を塗る
* <font color="yellow">移動量が小さいので、</font>$F'_i(\boldsymbol k) \approx F_i(\boldsymbol k)$として
計算量を削減
---
### 仮距離推定
* 左右の視差を得るために、同じフィルタを使って左右交互にMOSSEを掛ける
* BBは独立に「時間発展」させる
* キャリブレーションしたステレオモデルを使って、
左右のBBの横位置の差から距離を仮推定
---
### 距離・速度推定
* 仮推定した距離から速度とより精度の良い距離を推定したい
* カルマンフィルタを使う
* 速度の変化をWiener過程と仮定
* 仮推定を「距離の観測」とみなし、速度とより高精度な距離を推定
* 推定した距離を使ってBBのサイズを調整(先述)
---
## [4.結果](https://drive.google.com/file/d/1U8MmwkkpqP3gdY6ux87OT_2vIeUmjach/view?usp=sharing)
---
推定距離

---
推定相対速度

---
計算時間

---
## 5.考察と結論
---
* MOSSEに工夫を凝らすことで、車が重畳する場合においても安定かつ高速に追従できた
* 両眼の視差から、カルマンフィルタを用いて距離・速度を推定できた
* 計算時間はカメラ(500fps, 1000fps)に十分間に合う
---
### 課題
* 初期BBの自動設定(Detection)
* YOLO, ...
* 先行研究よりずっと時間をかけて良さそう
* 完全に重畳してしまった場合の復帰
* 塗りつぶす色は灰色でいいのか?
* 周りの色の平均を取る、etc.
{"metaMigratedAt":"2023-06-14T22:44:49.981Z","metaMigratedFrom":"YAML","title":"MOSSEによる重畳車の高速距離推定","breaks":true,"slideOptions":"{\"transition\":\"zoom\"}","contributors":"[{\"id\":\"20cec21f-d1df-4f4f-8a28-4607bd622a8b\",\"add\":5545,\"del\":1514}]"}