optical flow について調査中

Optical flow は物体の動きを検出する、動いている物体の検出、追跡(tracking) に有効な手法だ。

OpenCV の解説記事　[オプティカルフロー(Optical Flow)]
(http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_video/py_lucas_kanade/py_lucas_kanade.html)


https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html

```
./samples/cpp/tutorial_code/video/optical_flow/optical_flow_dense.cpp
./samples/cpp/tutorial_code/video/optical_flow/optical_flow.cpp
./samples/python/tutorial_code/video/optical_flow/optical_flow_dense.py
./samples/python/tutorial_code/video/optical_flow/optical_flow.py
```



Optical flow には密なoptical flow と疎なoptical flow とがある。

[Object Tracking]
(https://docs.opencv.org/3.4/dc/d6b/group__video__track.html#ga5d10ebbd59fe09c5f650289ec0ece5af)

[OpenCV – The Gunnar-Farneback optical flow](https://www.geeksforgeeks.org/opencv-the-gunnar-farneback-optical-flow/)の説明は、
どのようにoptical flow (u, v) のベクトルを2枚の画像から算出するのかを示している。


## https://github.com/pathak22/pyflow


以下のコードで、otical flow の大きさと向きを元に色を与えているので、画像として見ることができる。
```
    mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])
    hsv[..., 0] = ang * 180 / np.pi / 2
    hsv[..., 2] = cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX)
```

![car1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/0c6f9de7-a8d4-fae1-f7b0-a08946b9893b.jpeg)
![car2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/7af79b56-e07d-dcb5-8d30-253c629c2e54.jpeg)
![outFlow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/8d383d5b-4292-7bbf-34bd-94f4add1b3dc.png)
- 特徴
- Cython を利用した実装
- 主だった実装の分はC++言語で書かれている。
- OpenMPを使ってマルチコアを活用するようには書かれていない。(#pragma omp の記載がない。)
- https://github.com/pathak22/pyflow/tree/master/src
- デモコードは、2枚の画像からその間のoptical flow を算出するだけのとても簡潔なものになっている。
- 動画を処理したいときは、自分で拡張すること。

https://github.com/twhui/LiteFlowNet


https://github.com/chuanenlin/optical-flow

- このサンプルdense-solution.py は依存ライブラリが opencv-python, numpy である。
- そのため、NVIDIA の使えないノートPCでもすぐに動作させることができる。

```
$ dense-solution.py
```

渋谷駅前の交差点の動画の例

![Screenshot from 2020-05-24 21-11-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/a20d9d14-f75d-b25e-42a5-744f46d084cf.png)
![Screenshot from 2020-05-24 21-11-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/4e9f84bd-32c5-a440-ece6-1abf8867f624.png)

```
$ sparse-solution.py
```

![Screenshot from 2020-05-24 21-15-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/8f138ac9-fa8d-c2c4-4a9f-1d402716946b.png)

---
## [OpenCVのOptical Flowを包括的に試すサンプル](https://qiita.com/daisukelab/items/5d71da81b0fc53be6594)


https://github.com/sampepose/flownet2-tf

qiita [OpenCVでとらえる画像の躍動、Optical Flow]
(https://qiita.com/icoxfog417/items/357e6e495b7a40da14d8)





Youtube [FlowNet 2.0: Evolution of Optical Flow Estimation with Deep Networks](https://www.youtube.com/watch?v=JSzUdVBmQP4)

https://github.com/NVIDIA/flownet2-pytorch


## MR flow
[MR-Flow (CVPR 2017)](https://www.youtube.com/watch?v=N7a3AZEi-c4)




### GPU
GPU [NVIDIA Optical Flow SDK ](https://developer.nvidia.com/opticalflow-sdk)

### FPGA
Optical flow の研究には、固定カメラの場合と移動カメラの場合とがある。さらに移動カメラの場合でも、視点の高さと水平方向の向きが保たれる場合と、視点の高さ水平方向の向きとも変化する場合がある。それぞれによってoptical flow の使い方が変わってくる。

監視カメラの場合には、圧倒的に多くが固定カメラである。上記の渋谷交差点の画像では、動き差分では、個々の人物を分離できない。
それがoptical flow を用いた場合には、人の流れの中で逆方向に動くしている人などを見つけやすい。

移動カメラのうち、視点の高さと水平方向の向きが一定しているのがある。そうだ、自動車の分野でのOptical flowの分野だ。走行中の車両のうち、自分に近づいてくるものを検知して、しかもその移動速度を評価することができる。

そういった目的のために、リアルタイムにOptical flow を得るために、FPGAの実装がある。

Xilinx FPGA [VivadoHLSを使用するLucas‐Kanadeオプティカルフローアルゴリズムの実装](https://japan.xilinx.com/support/documentation/application_notes/j_xapp1300-lucas-kanade-optical-flow.pdf)

Intel FPGA [Optical Flow Design Example](https://www.intel.co.jp/content/www/jp/ja/programmable/support/support-resources/design-examples/design-software/opencl/optical-flow.html)
- [Real-time moving obstacle detection using opticalflow models](https://hal.inria.fr/inria-00182027/document)

- [自律移動ロボットのためのＦＰＧＡを用いたオプティカルフローのリアルタイム計算](http://www.ric.titech.ac.jp/saneken/paper/RSJ14_Kagami.pdf)

- [29東芝レビューVol.５９No.９（２００４）ロボットのための高速視覚システム](
https://www.toshiba.co.jp/tech/review/2004/09/59_09pdf/a07.pdf)

- [三次元フローを用いた人込みにおけるロボットの障害物回避](
http://www.jsk.t.u-tokyo.ac.jp/~k-okada/paper/2000_rs_okada_3dflow.pdf)

- [移動するステレオカメラによるオプティカルフローを用いた移動物体検出](
http://www.mech.chuo-u.ac.jp/umedalab/publications/pdf/2016/201604_toda_Academy%20of%20Human%20Information.pdf)


- [An optical flow-based sensing system for reactive mobile robot navigation](https://www.researchgate.net/publication/228600303_An_optical_flow-based_sensing_system_for_reactive_mobile_robot_navigation)


scikit-image [Registration using optical flow](
https://scikit-image.org/docs/dev/auto_examples/registration/plot_opticalflow.html#sphx-glr-auto-examples-registration-plot-opticalflow-py)


### 昆虫
- [ショウジョウバエの動き検知メカニズムにおけるノイズ頑強性：実験と理論からのアプローチ](https://www.jstage.jst.go.jp/article/biophys/56/2/56_102/_pdf)
- [昆虫の視覚情報と運動制御を知りロボットの世界に迫る](https://www.kyoritsu-pub.co.jp/app/file/goods_contents/2719.pdf)

- [昆虫とナノテクノロジー（世界）](https://www.nedo.go.jp/content/100105161.pdf)

- [An FPGA Implementation of Insec  t- Inspire  d Motion Detec  torfor High-Spee  d Vision Systems](https://s3.amazonaws.com/academia.edu.documents/44848812/An_FPGA_Implementation_of_Insect-Inspire20160418-24115-sfmz2.pdf?response-content-disposition=inline%3B%20filename%3DAn_FPGA_implementation_of_insect-inspire.pdf&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIATUSBJ6BAIOXACJLE%2F20200528%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20200528T155247Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEH8aCXVzLWVhc3QtMSJHMEUCIGIBmFx5AHBA8mcoadngvcquPxgXWZz7Id4wNnXDCIzgAiEA6kQjkuThVvHKFgbJyNeL2qJlXXXOIWu0o4o8olQrJ%2FwqvQMI2P%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgwyNTAzMTg4MTEyMDAiDChEMq8zKNhaRet9UyqRA%2BJHMl8qahyft0sewEt1oYwZ1wul2XdiCKlnPeBlDdhflt0mBCDKy3Wx8DJM8E82MjPQSGPVuBhLWFcka8BI8nllGMZ4o5ITuUG1jzv1pg6WCntcu2zs0XpHLLpsz%2BuDSeCWcVBVZGObs0X36T5INeS9JFo1vG%2Bxa7Mb1ZyDTRPDEgWVhlenGJVILPlrIAUwcozAPNgu723RpDCZTf5h%2Bdhrxcrb706zEP2kivHKLb3KYWcTxfEgBHeZOunf9jEWeekFMobXbM%2BGiUjCSmoi2VdoSWfSVWTvmHnoosmdCMfVOUPZOWBYQ0f%2B9pngTtTid4hdOAIm5Isl6bQ4XWDBlQH5EYsWVD0MwWOPny7cCVkhaOaUTijtWT7u0ubdcD1clvipfje8YZJFLlD%2FdB4Zqi5Hk8iFcFDVHM0VVBiF7kqhFSbLClf6F8FRT2n1dLMtvP2Fi1WUQCYw7OzriFkcIbldSjvmC5%2FqsnkcQKVkijhDwQYwb3veSc7LTO6lNdovvB7ZLq9urNOGVryYe477LeQuMPKbv%2FYFOusBq0CK5Ht42UmkUBYRQzLSFZJyaX9m7HNufUOmqN9bYkK16VRMJp0mD9jJJ8XrJz8pWopUn1GrrLsWsV2Qs7rjJ4wW3HXbdyuvYofsm0qEJhnW%2BNf7rdtbv1kQUaCwgy6pHZxcmYUbDcCgw9YDpN2BmeX5E92M023ysWA9SsrNW3jAYBI8Cge6F1F%2FUcmfD7bVT%2FhhMlEMgY8iLgGcNolgZmHd8Ylg%2Fss7dJBbq3cLWrd5zd4CaDcpQgGMafMWXWbp2N6Jey9pV1ievYpsaLKv1GyO349AuMYfVOQi16yg0DnXwHo8jbQ%2FPAPvDg%3D%3D&X-Amz-Signature=9a2893d51101492c51da05e63f47ca417b232f768a60a13af33360e715e9de46)

- [Insect Inspired Robots](http://www.araa.asn.au/acra/acra2006/papers/paper_5_49.pdf?q=inspired)



### カエルの視覚
[Anatomy and Physiology of Vision in the Frog (Rana pipiens)](
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2195076/pdf/129.pdf)

### 私見
Optical flow とステレオカメラの視差とは共通性があると感じている。
２つの画像間で特徴点の対応をとって、その差異を示すことで共通点がある。
視差というのは、左カメラと右カメラの間を、視点が動くことによって生じるoptical flow と捉えることができる。

Optical flow を計算するには、時間差のある画像であることが必須だ。
それに対し、深度　depth (= 視差の逆数)は最近では、単眼の画像からCNNで推定できるようになってきている。
ということは、optical flow が推定可能な状況においては、optical flow と深度の両方を認識可能になっていることを意味している。optical flow 自体は視線の方向を示すものにすぎない。いいかえれば、optical flow 自体は、2次元上のベクトルに過ぎない。
そこに、深度情報から換算される3次元の点群と、optical flow とを組み合わせると、対象点の動きが、3次元の位置(x ,y, z)と3次元の移動量(dx, dy, dz) として換算可能になる。

いま、CNNの進展が可能にしつつあることは、そういうことなんだ。


視差の計算でもoptical flowの計算でも、いきなり解像度の高い領域で対応点をとろうとすると結果が暴れることが知られている。
そのため、今どきの計算では、解像度の粗い対応点マッチングのあとに解像度の高い対応点マッチングをするものなっている。

Optical flowと視差についての共通性については、「[NVIDIA Optical Flow SDK 2.0には視差計算やトラッキング機能が追加されたようです](https://qiita.com/dandelion1124/items/ebe51b683ed4f285a4b1#:~:text=NVIDIA%20Optical%20Flow%20SDK%202.0%E3%81%AB%E3%81%AF%E8%A6%96%E5%B7%AE%E8%A8%88%E7%AE%97%E3%82%84%E3%83%88%E3%83%A9%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E6%A9%9F%E8%83%BD%E3%81%8C%E8%BF%BD%E5%8A%A0%E3%81%95%E3%82%8C%E3%81%9F%E3%82%88%E3%81%86%E3%81%A7%E3%81%99)」という記事を見つけました。

https://docs.nvidia.com/video-technologies/optical-flow-sdk/nvofa-application-note/index.html
のドキュメントのなかにもNVIDIA Optical Flow AcceleratorがOptical Flow ModeとStereo Disparity Modeとがあることを見つけました。

CNNでのoptical flow の計算でも、粗い画像でのoptical flow の推定の層の後段で、一段高い解像度でのoptical flow の推定を実施している。 coarse-to-fine の考え方は共通している。


### optical flow とCNN
OpenCVにもCNNを用いたoptical flow の計算例が加わった。

https://github.com/opencv/opencv/pull/16575


Tak-Wai Hui, Xiaoou Tang, Chen Change Loy

https://arxiv.org/abs/1903.07414

https://arxiv.org/pdf/1903.07414.pdf

![Screenshot from 2020-07-23 23-04-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/aae5f2f5-735f-b629-4613-972fd3650a9c.png)


https://github.com/twhui/LiteFlowNet2
----
以下のOpenCVのチュートリアルも有用だ
https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html

---
Youtube [300 Hz real-time optical flow. City ]https://www.youtube.com/watch?v=_Rpi7WS-HTw

---
[OpenCVのcudaoptflowモジュールからNVIDIA Optical Flow SDKを使う](https://qiita.com/dandelion1124/items/ebe51b683ed4f285a4b1)

---
NVIDIA でのOptical flowの例
https://docs.nvidia.com/deeplearning/dali/user-guide/docs/examples/sequence_processing/optical_flow_example.html

Youtube 
<iframe width="560" height="315" src="https://www.youtube.com/embed/ckVQrwYIjAs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


----
追記 2023.5.21
## Optical flow ベースの障害物回避
Optical flow だけを用いて衝突時間を算出して自動ブレーキをかける記事が書いてあったので紹介する。


[Raspberry Piで自動運転やってみる 2.自動ブレーキ](https://qiita.com/stnk20/items/0def24cd4e2ebe78bbbf)

このコードは衝突時間（time to collision） を計算することで、ブレーキをかけるものになっている。
Raspberry Pi で動作するコードになっているので、計算量が少ないロジックになっている。
高精度のOptical flowの計算をしないものになっている。


[Optical-Flow-based-Obstacle-Avoidance](https://github.com/zainmehdi/Optical-Flow-based-Obstacle-Avoidance/tree/master)


<iframe width="560" height="315" src="https://www.youtube.com/embed/YjuMZKcSccA?si=ycgNVVjVC3HGcDIk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>


- [ナチュラルインテリジェンス・ナビゲーションシステム開発キット](https://www.argocorp.com/system/Opteran/Opteran.html)
開発元　[Opteran社](https://opteran.com/#close)


## SEE ALSO
https://jp.mathworks.com/discovery/optical-flow.html