OpenCV4.5 に加わった深層学習ベースのtrackingを調査中

[OpenCV4.5 のリリースノート](https://github.com/opencv/opencv/wiki/ChangeLog)によれば、深層学習ベースのtracking が加わっている。
> Real-time Single Object Tracking using Deep Learning: [#17647]
(https://github.com/opencv/opencv/pull/17647)

にそのPRがある。

そのtrackingの利用した追跡結果の動画は、PRが述べるように下記のgoogle driveにある。
https://drive.google.com/drive/folders/1k7Z_SHaBWK_4aEQPxJJCGm3P7y2IFCjY?usp=sharing

この追跡動画のうち、カメラの視点が固定していて、対象物以外が動いていないものの方が追跡が成功しやすい。
追跡がさらに難しいのは、カメラ自体も動いている上で、対象物も動いているものだ。しかも、対象物の見え方がフレームとともに変わっていくものは難しい。他にも、追跡中に対象物が他の物体によって部分的に隠れてしまうものも、難しい種類の追跡だ。そういう難しい種類の追跡を行えている。






```
opencv/samples/dnn$ python siamrpnpp.py  -h
usage: siamrpnpp.py [-h] [--input_video INPUT_VIDEO] [--target_net TARGET_NET]
                    [--search_net SEARCH_NET] [--rpn_head RPN_HEAD]
                    [--backend {0,1,2,3}] [--target {0,1,2,3}]

Use this script to run SiamRPN++ Visual Tracker

optional arguments:
  -h, --help            show this help message and exit
  --input_video INPUT_VIDEO
                        Path to input video file. Skip this argument to
                        capture frames from a camera. (default: None)
  --target_net TARGET_NET
                        Path to part of SiamRPN++ ran on target frame.
                        (default: target_net.onnx)
  --search_net SEARCH_NET
                        Path to part of SiamRPN++ ran on search frame.
                        (default: search_net.onnx)
  --rpn_head RPN_HEAD   Path to RPN Head ONNX model. (default: rpn_head.onnx)
  --backend {0,1,2,3}   Select a computation backend: 0: automatically (by
                        default) 1: Halide2: Intel's Deep Learning Inference
                        Engine (https://software.intel.com/openvino-toolkit)3:
                        OpenCV Implementation (default: 0)
  --target {0,1,2,3}    Select a target device: 0: CPU target (by default)1:
                        OpenCL2: OpenCL FP163: Myriad (default: 0)
```


pdf [SiamRPN++: Evolution of Siamese Visual Tracking with Very Deep Networks](https://arxiv.org/pdf/1812.11703.pdf)

![Screenshot from 2020-10-25 22-19-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/12c0caa7-dba7-2eb0-f197-e8d47cf7904a.png) 上記論文から引用

上の図の横軸は追跡処理のfps、縦軸はEAO(Expected Average Overlap)であり、フレーム間の追跡の良さを表す指標らしい。よい追跡アルゴリズムほど、この図の右上に位置する。
 


![Screenshot from 2020-10-25 22-59-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/2a8b1f60-f874-fdf8-3c03-c0d9ceaa4bb9.png)

このアルゴリズムでは、target_net　と　search_net の2つのネットワークのモデルを指定する。
(ちなみに, Siamese neural network というのは双子のネットワーク構造をさしているそうだ。)

  --target_net TARGET_NET
  --search_net SEARCH_NET

この中で引数で指定するモデルファイルは、opencv のリポジトリの中には含まれていない。これらモデルファイルの入手元は、
siamrpnpp.py のスクリプトの中に記載されている。

```
Link to original paper : https://arxiv.org/abs/1812.11703
Link to original repo  : https://github.com/STVIR/pysot

You can download the pre-trained weights of the Tracker Model from https://drive.google.com/file/d/11bwgPFVkps9AH2NOD1zBDdpF_tQghAB-/view?usp=sharing
You can download the target net (target branch of SiamRPN++) from https://drive.google.com/file/d/1dw_Ne3UMcCnFsaD6xkZepwE4GEpqq7U_/view?usp=sharing
You can download the search net (search branch of SiamRPN++) from https://drive.google.com/file/d/1Lt4oE43ZSucJvze3Y-Z87CVDreO-Afwl/view?usp=sharing
You can download the head model (RPN Head) from https://drive.google.com/file/d/1zT1yu12mtj3JQEkkfKFJWiZ71fJ-dQTi/view?usp=sharing
```

用語集
RPN: Resion Proposal Network
VOT2018: https://www.votchallenge.net/vot2018/dataset.html

### 試行錯誤中

今のところ、次のようなエラーに出くわしていて、動作を検証できていない。


```
 python siamrpnpp.py --input_video 動画ファイル名 --target_net target_net.onnx --search_net search_net.onnx --rpn_head rpn_head.onnx
Traceback (most recent call last):
  File "siamrpnpp.py", line 397, in <module>
    main()
  File "siamrpnpp.py", line 370, in main
    rpn_head = cv.dnn.readNetFromONNX(args.rpn_head)
cv2.error: OpenCV(3.4.11) /tmp/pip-req-build-s_7n4j7p/opencv/modules/dnn/src/onnx/onnx_importer.cpp:261: error: (-204:Requested object was not found) Blob input_1 not found in const blobs in function 'getBlob'
```

## 付記
従来の追跡アルゴリズムでは、特定の対象物（例、人・顔、自動車）に限定した追跡アルゴリズムだったりすることがあった。また別の追跡アルゴリズムでは、与えた初期の枠指定に対して特徴の拾い出して、その特徴に近い領域を追跡するものある。
　特定の対象物に限定した追跡アルゴリズムでは、その対象物に固有の対象物らしさを元に次のフレームでの位置を求めるものが多い。かつては、追跡アルゴリズムという名で、探索領域を絞り込んだだけの検出アルゴリズムだったことが多い。
　初期の枠指定に対して特徴の拾い出すタイプの追跡アルゴリズムでは、テンプレートマッチングを使っているものが多かった。ただ、テンプレートマッチングを使っているものでは、追跡のフレームを経ていくごとに、元の特徴とは似ても似つかぬものになってしまいやすいという欠点があった。


----

以下のサイトにオリジナルの実装がある。

https://github.com/STVIR/pysot

他にもこの組織のgithub アカウントには興味深いものが公開されている。
ぜひ一読をすすめる。

https://github.com/STVIR