DeepSort とYolov4の組み合わせの実装を調査中

DeepSortは最近着目されている追跡アルゴリズムである。

## 前置き　動画によるDeepSortの紹介
https://www.youtube.com/watch?v=LbyqsoLJu5Q
<iframe width="560" height="315" src="https://www.youtube.com/embed/LbyqsoLJu5Q" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

この動画では、なぜ追跡アルゴリズムが重要なのかを示している。

occlusionを生じてしまったときにどうなるのか？

mean shift
optical flow
Lucas Kanade
Kalman filter

Kalman filterでは、occlusionを生じたときにも
ある程度のconfidenceをもって状態を推定できる。


Detection -> Kalman Filter -> target association
-> target ID life cycle

measurement-to-track association
 などのキーワードを示している。

---

## 実装１
Deep-SORT-YOLOv4
https://github.com/LeonLok/Deep-SORT-YOLOv4
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/790a4b51-883b-ba92-3532-61bb098e1cfc.png)

このリポジトリにはtensorflow1.14　と tensorflow2.0 用との実装が両方ある。
darknetのyolov4.weightsファイルを 取得し、
それを convert.py で変換して用いる。
（注意：ここにあるconvert.pyはyolov4.weightsの変換だけを想定しており、yolov4-tiny.weightsの変換には対応していない。)

-> tensortflow-gpu での推論

deepSortのtrackerを使っている部分のコード(grep で抜き出し)

```
from deep_sort.tracker import Tracker
    tracker = Tracker(metric)
    tracking = True
        if tracking:
        if tracking:
            # Call the tracker
            tracker.predict()
            tracker.update(detections)
            for track in tracker.tracks:
                if not track.is_confirmed() or track.time_since_update > 1:
                bbox = track.to_tlbr()
                cv2.putText(frame, "ID: " + str(track.track_id), (int(bbox[0]), int(bbox[1])), 0,
```



### 解説記事
https://qiita.com/daiki0321/items/ff412c52a25d9b093222

## 実装２
yolov4-deepsort
https://github.com/theAIGuysCode/yolov4-deepsort

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/b8269a3d-5048-e13f-cad8-bf3e822e5c07.png)

人検出・追跡の例とクルマ検出・追跡の例がある。
-> tensorflow
-> tensorflow-gpu
gpuを必要としない環境設定も可能なようだ。

yolov4-tiny についても実行できる。

```
$ python save_model.py --weights ./data/yolov4-tiny.weights --output ./checkpoints/yolov4-tiny-416 --model yolov4 --tiny
$ python object_tracker.py --weights ./checkpoints/yolov4-tiny-416 --model yolov4 --video ./data/video/test.mp4 --output ./outputs/tiny.avi --tiny

```

### deepSortのtrackerを使っている部分のコード(grep で抜き出し)
```
$ grep track object_tracker.py
from deep_sort.tracker import Tracker
flags.DEFINE_boolean('info', False, 'show detailed info of tracked objects')
flags.DEFINE_boolean('count', False, 'count objects being tracked on screen')
    # initialize tracker
    tracker = Tracker(metric)
        # custom allowed classes (uncomment line below to customize tracker for only people)
            cv2.putText(frame, "Objects being tracked: {}".format(count), (5, 35), cv2.FONT_HERSHEY_COMPLEX_SMALL, 2, (0, 255, 0), 2)
            print("Objects being tracked: {}".format(count))
        # encode yolo detections and feed to tracker
        # Call the tracker
        tracker.predict()
        tracker.update(detections)
        # update tracks
        for track in tracker.tracks:
            if not track.is_confirmed() or track.time_since_update > 1:
            bbox = track.to_tlbr()
            class_name = track.get_class()
            color = colors[int(track.track_id) % len(colors)]
            cv2.rectangle(frame, (int(bbox[0]), int(bbox[1]-30)), (int(bbox[0])+(len(class_name)+len(str(track.track_id)))*17, int(bbox[1])), color, -1)
            cv2.putText(frame, class_name + "-" + str(track.track_id),(int(bbox[0]), int(bbox[1]-10)),0, 0.75, (255,255,255),2)
        # if enable info flag then print details about each track
                print("Tracker ID: {}, Class: {},  BBox Coords (xmin, ymin, xmax, ymax): {}".format(str(track.track_id), class_name, (int(bbox[0]), int(bbox[1]), int(bbox[2]), int(bbox[3]))))
```

Q: カスタムモデルの場合の手続きは？ 
残念なことに、ネットワークへの入力がwidth, heightの値が等しいことを前提としている。

https://github.com/theAIGuysCode/yolov4-deepsort
のソースを利用しているYoutubeの動画
<iframe width="560" height="315" src="https://www.youtube.com/embed/FuvQ8Melz1o" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## 実装３
yolov5-head-deepsort-detector
https://github.com/RichardoMrMu/yolov5-head-deepsort-detector

![](https://github.com/RichardoMrMu/yolov5-head-deepsort-detector/raw/main/assets/yolosort.gif)

図に示すように、頭部検出の実装。
-> tensorRT
での推論をする実装。

## 実装４
jetson-yolo

解説記事に書いてあるように
docker 環境を利用する実装です。
解説記事の手順をふんで、既存のdocker環境を壊さないようにするとよいようです。

https://github.com/kyasby/jetson-yolo

### 解説記事
https://qiita.com/ryryry/items/694f1635dfa511ca0432

----
## 参考情報 YoloV5 でのDeepSort　の記事
[オブジェクトトラッキング(DeepSORT)をJetson Nanoで動かす](https://qiita.com/ShimoyamaAi/items/e4f90d58da7fea3cd43e)