Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

A really more real-time adaptation of deep sort

License

NotificationsYou must be signed in to change notification settings

levan92/deep_sort_realtime

Repository files navigation

Introduction

A more realtime adaptation of Deep SORT.

Adapted from theofficial repo ofSimple Online and Realtime Tracking with a Deep Association Metric (Deep SORT)

See theirpaper for more technical information.

Dependencies

requirements.txt gives the default packages required (it installs torch/torchvision to use the default mobilenet embedder), modify accordingly.

Main dependencies are:

  • Python3
  • NumPy,pip install numpy
  • SciPy,pip install scipy
  • cv2,pip install opencv-python
  • (optional)Embedder requires Pytorch & Torchvision (for the default MobiletnetV2 embedder) or Tensorflow 2+
    • pip install torch torchvision
    • pip install tensorflow
  • (optional) Additionally, to useTorchreid embedder,torchreid Python package needs to be installed withpip install torchreid gdown tensorboard.
  • (optional) To useCLIP embedder,pip install git+https://github.com/openai/CLIP.git

Install

  • fromPyPI viapip3 install deep-sort-realtime orpython3 -m pip install deep-sort-realtime
  • or, clone this repo & install deep-sort-realtime as a python package usingpip or as an editable package if you like (-e flag)
cd deep_sort_realtime&& pip3 install.
  • or, download.whl file in this repo'sreleases

Run

Example usage:

fromdeep_sort_realtime.deepsort_trackerimportDeepSorttracker=DeepSort(max_age=5)bbs=object_detector.detect(frame)tracks=tracker.update_tracks(bbs,frame=frame)# bbs expected to be a list of detections, each in tuples of ( [left,top,w,h], confidence, detection_class )fortrackintracks:ifnottrack.is_confirmed():continuetrack_id=track.track_idltrb=track.to_ltrb()
  • To add project-specific logic into theTrack class, you can make a subclass (ofTrack) and pass it in (override_track_class argument) when instantiatingDeepSort.

  • Example with your own embedder/ReID model:

fromdeep_sort_realtime.deepsort_trackerimportDeepSorttracker=DeepSort(max_age=5)bbs=object_detector.detect(frame)# your own object detectionobject_chips=chipper(frame,bbs)# your own logic to crop frame based on bbox valuesembeds=embedder(object_chips)# your own embedder to take in the cropped object chips, and output feature vectorstracks=tracker.update_tracks(bbs,embeds=embeds)# bbs expected to be a list of detections, each in tuples of ( [left,top,w,h], confidence, detection_class ), also, no need to give frame as your chips has already been embeddedfortrackintracks:ifnottrack.is_confirmed():continuetrack_id=track.track_idltrb=track.to_ltrb()

Getting bounding box of original detection

The originalTrack.to_* methods for retrieving bounding box values returns only the Kalman predicted values. However, in some applications, it is better to return the bb values of the original detections the track was associated to at the current round.

Here we added anorig argument to all theTrack.to_* methods. Iforig is flagged asTrue and this track is associated to a detection this update round, then the bounding box values returned by the method will be that associated to the original detection. Otherwise, it will still return the Kalman predicted values.

orig_strict argument in all theTrack.to_* methods is only active whenorig isTrue. Flaggingorig_strict=True will mean it will outputNone when there's no original detection associated to this track at current frame, otherwise normally it will return Kalman predicted values.

Storing supplementary info of original detection

Supplementary info can be pass into the track from the detection.Detection class now has anothers argument to store this and pass it to the associate track during update. Can be retrieved throughTrack.get_det_supplementary method. Can be passed in throughothers argument ofDeepSort.update_tracks, expects to be a list with same length asraw_detections. Examples of when you will this includes passing in corresponding instance segmentation masks, to be consumed when iterating through the tracks output.

Polygon support

Other than horizontal bounding boxes, detections can now be given as polygons. We do not track polygon points per se, but merely convert the polygon to its bounding rectangle for tracking. That said, if embedding is enabled, the embedder works on the crop around the bounding rectangle, with area not covered by the polygon masked away.

When instantiating aDeepSort object (as indeepsort_tracker.py),polygon argument should be flagged toTrue. SeeDeepSort.update_tracks docstring for details on the polygon format. In polygon mode, the original polygon coordinates are passed to the associated track through thesupplementary info.

Differences from original repo

  • Remove "academic style" offline processing style and implemented it to take in real-time detections and output accordingly.

  • Provides both options of using an in-built appearance feature embedder or to provide embeddings during update

  • Added pytorch mobilenetv2 as appearance embedder (tensorflow embedder is also available now too).

  • AddedCLIP network from OpenAI as embedder (pytorch).

  • Skip nms completely in preprocessing detections ifnms_max_overlap == 1.0 (which is the default), in the original repo, nms will still be done even if threshold is set to 1.0 (probably because it was not optimised for speed).

  • Now able to override theTrack class with a custom Track class (that inherits fromTrack class) for custom track logic

  • Takes in today's date now, which provides date for track naming and facilities track id reset every day, preventing overflow and overly large track ids when system runs for a long time.

    fromdatetimeimportdatetimetoday=datetime.now().date()
  • Now supports polygon detections. We do not track polygon points per se, but merely convert the polygon to its bounding rectangle for tracking. That said, if embedding is enabled, the embedder works on the crop around the bounding rectangle, with area not covered by the polygon masked away.Read more here.

  • The originalTrack.to_* methods for retrieving bounding box values returns only the Kalman predicted values. In some applications, it is better to return the bb values of the original detections the track was associated to at the current round. Added aorig argument which can be flaggedTrue to get that.Read more here.

  • Addedget_det_supplementary method toTrack class, in order to pass detection related info through the track.Read more here.

  • [As of2fad967] Supports background masking by giving instance mask toDeepSort.update_tracks.Read more here.

  • Other minor adjustments/optimisation of code.

Highlevel overview of source files indeep_sort (from original repo)

In packagedeep_sort is the main tracking code:

  • detection.py: Detection base class.
  • kalman_filter.py: A Kalman filter implementation and concreteparametrization for image space filtering.
  • linear_assignment.py: This module contains code for min cost matching andthe matching cascade.
  • iou_matching.py: This module contains the IOU matching metric.
  • nn_matching.py: A module for a nearest neighbor matching metric.
  • track.py: The track class contains single-target track data such as Kalmanstate, number of hits, misses, hit streak, associated feature vectors, etc.
  • tracker.py: This is the multi-target tracker class.

Test

python3 -m unittest

Appearance Embedding Network

Pytorch Embedder (default)

Default embedder is a pytorch MobilenetV2 (trained on Imagenet).

For convenience (I know it's not exactly best practice) & since the weights file is quite small, it is pushed in this github repo and will be installed to your Python environment when you install deep_sort_realtime.

TorchReID

Torchreid is a person re-identification library, and is supported here especially useful for extracting features of humans.Torchreid will need to be installed withpip install torchreid gdown tensorboard. It provides a zoo ofmodels. Select model type to use, note the model name and provide as arguments. Download the corresponding model weights file on the model zoo site and point to the downloaded file. Model 'osnet_ain_x1_0' with domain generalized training on (MS+D+C) is provide by default, together with the corresponding weights. Ifembedder='torchreid' when initalizingDeepSort object without specifyingembedder_model_name orembedder_wts, it will default to that.

fromdeep_sort_realtime.deepsort_trackerimportDeepSorttracker=DeepSort(max_age=5,embedder='torchreid')bbs=object_detector.detect(frame)tracks=tracker.update_tracks(bbs,frame=frame)# bbs expected to be a list of detections, each in tuples of ( [left,top,w,h], confidence, detection_class )fortrackintracks:ifnottrack.is_confirmed():continuetrack_id=track.track_idltrb=track.to_ltrb()

CLIP

CLIP is added as another option of embedder due to its proven flexibility and generalisability. Download the CLIP model weights you want atdeep_sort_realtime/embedder/weights/download_clip_wts.sh and store the weights at that directory as well, or you can provide your own CLIP weights throughembedder_wts argument of theDeepSort object.

Tensorflow Embedder

Available now atdeep_sort_realtime/embedder/embedder_tf.py, as alternative to (the default) pytorch embedder. Tested on Tensorflow 2.3.1. You need to make your own code change to use it.

The tf MobilenetV2 weights (pretrained on imagenet) are not available in this github repo (unlike the torch one). Downloadmobilenet_v2_weights_tf_dim_ordering_tf_kernels_1.0_224.h5 fromhttps://github.com/JonathanCMitchell/mobilenet_v2_keras/releases/tag/v1.1. You may drop it intodeep_sort_realtime/embedder/weights/ before pip installing.

Background Masking

If instance mask is given duringDeepSort.update_tracks with no external appearance embeddings given, the mask will be used to mask out the background of the corresponding detection crop so that only foreground information goes into the embedder. This reduces background bias.

Example

Example cosine distances between images in./test/ ("diff": rock vs smallapple, "close": smallapple vs smallapple slightly augmented)

.Testing pytorch embedderclose: 0.012196660041809082 vs diff: 0.4409685730934143.Testing Torchreid embedderModel: osnet_ain_x1_0- params: 2,193,616- flops: 978,878,352Successfully loaded pretrained weights from "/Users/levan/Workspace/deep_sort_realtime/deep_sort_realtime/embedder/weights/osnet_ain_ms_d_c_wtsonly.pth"close: 0.012312591075897217 vs diff: 0.4590487480163574

About

A really more real-time adaptation of deep sort

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

[8]ページ先頭

©2009-2025 Movatter.jp