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
このリポジトリには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
人検出・追跡の例とクルマ検出・追跡の例がある。
-> 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環境を壊さないようにするとよいようです。
解説記事