LoginSignup
3
2

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-01-25

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

前置き 動画によるDeepSortの紹介

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

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
などのキーワードを示している。


実装1

Deep-SORT-YOLOv4
https://github.com/LeonLok/Deep-SORT-YOLOv4
image.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,

解説記事

実装2

yolov4-deepsort
https://github.com/theAIGuysCode/yolov4-deepsort

image.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の動画

実装3

yolov5-head-deepsort-detector
https://github.com/RichardoMrMu/yolov5-head-deepsort-detector

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

実装4

jetson-yolo

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

解説記事


参考情報 YoloV5 でのDeepSort の記事

オブジェクトトラッキング(DeepSORT)をJetson Nanoで動かす

3
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2