Science Score: 49.0%
This score indicates how likely this project is to be science-related based on various indicators:
-
○CITATION.cff file
-
✓codemeta.json file
Found codemeta.json file -
✓.zenodo.json file
Found .zenodo.json file -
✓DOI references
Found 3 DOI reference(s) in README -
✓Academic publication links
Links to: arxiv.org, zenodo.org -
○Academic email domains
-
○Institutional organization owner
-
○JOSS paper metadata
-
○Scientific vocabulary similarity
Low similarity (10.3%) to scientific vocabulary
Repository
Boxmot 10.0.65
Basic Info
Statistics
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 2
- Releases: 0
Metadata Files
README.md
BoxMOT: pluggable SOTA tracking modules for segmentation, object detection and pose estimation models
Introduction
This repo contains a collections of pluggable state-of-the-art multi-object trackers for segmentation, object detection and pose estimation models. For the methods using appearance description, both heavy (CLIPReID) and lightweight state-of-the-art ReID models (LightMBN, OSNet and more) are available for automatic download. We provide examples on how to use this package together with popular object detection models such as: Yolov8, Yolo-NAS and YOLOX.
Tutorials
* [Yolov8 training (link to external repository)](https://docs.ultralytics.com/modes/train/) * [Deep appearance descriptor training (link to external repository)](https://kaiyangzhou.github.io/deep-person-reid/user_guide.html) * [ReID model export to ONNX, OpenVINO, TensorRT and TorchScript](https://github.com/mikel-brostrom/yolo_tracking/wiki/ReID-multi-framework-model-export) * [Evaluation on custom tracking dataset](https://github.com/mikel-brostrom/yolo_tracking/wiki/How-to-evaluate-on-custom-tracking-dataset) * [ReID inference acceleration with Nebullvm](https://colab.research.google.com/drive/1APUZ1ijCiQFBR9xD0gUvFUOC8yOJIvHm?usp=sharing)Experiments
In inverse chronological order: * [Evaluation of the params evolved for first half of MOT17 on the complete MOT17](https://github.com/mikel-brostrom/Yolov5_StrongSORT_OSNet/wiki/Evaluation-of-the-params-evolved-for-first-half-of-MOT17-on-the-complete-MOT17) * [Segmentation model vs object detetion model on MOT metrics](https://github.com/mikel-brostrom/Yolov5_StrongSORT_OSNet/wiki/Segmentation-model-vs-object-detetion-model-on-MOT-metrics) * [Effect of masking objects before feature extraction](https://github.com/mikel-brostrom/Yolov5_StrongSORT_OSNet/wiki/Masked-detection-crops-vs-regular-detection-crops-for-ReID-feature-extraction) * [conf-thres vs HOTA, MOTA and IDF1](https://github.com/mikel-brostrom/Yolov5_StrongSORT_OSNet/wiki/conf-thres-vs-MOT-metrics) * [Effect of KF updates ahead for tracks with no associations on MOT17](https://github.com/mikel-brostrom/Yolov5_StrongSORT_OSNet/wiki/Effect-of-KF-updates-ahead-for-tracks-with-no-associations,-on-MOT17) * [Effect of full images vs 1280 input to StrongSORT on MOT17](https://github.com/mikel-brostrom/Yolov5_StrongSORT_OSNet/wiki/Effect-of-passing-full-image-input-vs-1280-re-scaled-to-StrongSORT-on-MOT17) * [Effect of different OSNet architectures on MOT16](https://github.com/mikel-brostrom/Yolov5_StrongSORT_OSNet/wiki/OSNet-architecture-performances-on-MOT16) * [Yolov5 StrongSORT vs BoTSORT vs OCSORT](https://github.com/mikel-brostrom/Yolov5_StrongSORT_OSNet/wiki/StrongSORT-vs-BoTSORT-vs-OCSORT) * Yolov5 [BoTSORT](https://arxiv.org/abs/2206.14651) branch: https://github.com/mikel-brostrom/Yolov5_StrongSORT_OSNet/tree/botsort * [Yolov5 StrongSORT OSNet vs other trackers MOT17](https://github.com/mikel-brostrom/Yolov5_StrongSORT_OSNet/wiki/MOT-17-evaluation-(private-detector)) * [StrongSORT MOT16 ablation study](https://github.com/mikel-brostrom/Yolov5_StrongSORT_OSNet/wiki/Yolov5DeepSORTwithOSNet-vs-Yolov5StrongSORTwithOSNet-ablation-study-on-MOT16) * [Yolov5 StrongSORT OSNet vs other trackers MOT16 (deprecated)](https://github.com/mikel-brostrom/Yolov5_StrongSORT_OSNet/wiki/MOT-16-evaluation)Tracking
Yolo models
```bash $ python tracking/track.py --yolo-model yolov8n # bboxes only python tracking/track.py --yolo-model yolo_nas_s # bboxes only python tracking/track.py --yolo-model yolox_n # bboxes only yolov8n-seg # bboxes + segmentation masks yolov8n-pose # bboxes + pose estimation ```Tracking methods
```bash $ python tracking/track.py --tracking-method deepocsort strongsort ocsort bytetrack botsort ```Tracking sources
Tracking can be run on most video formats ```bash $ python tracking/track.py --source 0 # webcam img.jpg # image vid.mp4 # video path/ # directory path/*.jpg # glob 'https://youtu.be/Zgi9g1ksQHc' # YouTube 'rtsp://example.com/media.mp4' # RTSP, RTMP, HTTP stream ```Select ReID model
Some tracking methods combine appearance description and motion in the process of tracking. For those which use appearance, you can choose a ReID model based on your needs from this [ReID model zoo](https://kaiyangzhou.github.io/deep-person-reid/MODEL_ZOO). These model can be further optimized for you needs by the [reid_export.py](https://github.com/mikel-brostrom/yolo_tracking/blob/master/boxmot/deep/reid_export.py) script ```bash $ python tracking/track.py --source 0 --reid-model lmbn_n_cuhk03_d.pt # lightweight osnet_x0_25_market1501.pt mobilenetv2_x1_4_msmt17.engine resnet50_msmt17.onnx osnet_x1_0_msmt17.pt clip_market1501.pt # heavy clip_vehicleid.pt ... ```Filter tracked classes
By default the tracker tracks all MS COCO classes. If you want to track a subset of the classes that you model predicts, add their corresponding index after the classes flag, ```bash python tracking/track.py --source 0 --yolo-model yolov8s.pt --classes 16 17 # COCO yolov8 model. Track cats and dogs, only ``` [Here](https://tech.amikelive.com/node-718/what-object-categories-labels-are-in-coco-dataset/) is a list of all the possible objects that a Yolov8 model trained on MS COCO can detect. Notice that the indexing for the classes in this repo starts at zeroEvaluation
Evaluate a combination of detector, tracking method and ReID model on standard MOT dataset or you custom one by ```bash # saves dets and embs under ./runs/dets_n_embs separately for each selected yolo and reid model $ python tracking/generate_dets_n_embs.py --source ./assets/MOT17-mini/train --yolo-model yolov8n.pt yolov8s.pt --reid-model weights/osnet_x0_25_msmt17.pt # generate MOT challenge format results based on pregenerated detections and embeddings for a specific trackign method $ python tracking/generate_mot_metrics.py --dets yolov8n --embs osnet_x0_25_msmt17 --tracking-method botsort # uses TrackEval to generate MOT metrics for the tracking results under ./runs/mot/Evolution
We use a fast and elitist multiobjective genetic algorithm for tracker hyperparameter tuning. By default the objectives are: HOTA, MOTA, IDF1. Run it by ```bash # saves dets and embs under ./runs/dets_n_embs separately for each selected yolo and reid model $ python tracking/generate_dets_n_embs.py --source ./assets/MOT17-mini/train --yolo-model yolov8n.pt yolov8s.pt --reid-model weights/osnet_x0_25_msmt17.pt # evolve parameters for specified tracking method using the selected detections and embeddings generated in the previous step $ python tracking/evolve.py --benchmark MOT17-mini --dets yolov8n --embs osnet_x0_25_msmt17 --n-trials 9 --tracking-method botsort ``` The set of hyperparameters leading to the best HOTA result are written to the tracker's config file.Custom tracking examples
Detection
```python import cv2 import numpy as np from pathlib import Path from boxmot import DeepOCSORT tracker = DeepOCSORT( model_weights=Path('osnet_x0_25_msmt17.pt'), # which ReID model to use device='cuda:0', fp16=False, ) vid = cv2.VideoCapture(0) while True: ret, im = vid.read() # substitute by your object detector, output has to be N X (x, y, x, y, conf, cls) dets = np.array([[144, 212, 578, 480, 0.82, 0], [425, 281, 576, 472, 0.56, 65]]) tracker.update(dets, im) # --> M X (x, y, x, y, id, conf, cls, ind) tracker.plot_results(im, show_trajectories=True) # break on pressing q or space cv2.imshow('BoxMOT detection', im) key = cv2.waitKey(1) & 0xFF if key == ord(' ') or key == ord('q'): break vid.release() cv2.destroyAllWindows() ```Pose & segmentation
```python import cv2 import numpy as np from pathlib import Path from boxmot import DeepOCSORT tracker = DeepOCSORT( model_weights=Path('osnet_x0_25_msmt17.pt'), # which ReID model to use device='cuda:0', fp16=True, ) vid = cv2.VideoCapture(0) while True: ret, im = vid.read() keypoints = np.random.rand(2, 17, 3) mask = np.random.rand(2, 480, 640) # substitute by your object detector, input to tracker has to be N X (x, y, x, y, conf, cls) dets = np.array([[144, 212, 578, 480, 0.82, 0], [425, 281, 576, 472, 0.56, 65]]) tracks = tracker.update(dets, im) # --> M x (x, y, x, y, id, conf, cls, ind) # xyxys = tracks[:, 0:4].astype('int') # float64 to int # ids = tracks[:, 4].astype('int') # float64 to int # confs = tracks[:, 5] # clss = tracks[:, 6].astype('int') # float64 to int inds = tracks[:, 7].astype('int') # float64 to int # in case you have segmentations or poses alongside with your detections you can use # the ind variable in order to identify which track is associated to each seg or pose by: # masks = masks[inds] # keypoints = keypoints[inds] # such that you then can: zip(tracks, masks) or zip(tracks, keypoints) # break on pressing q or space cv2.imshow('BoxMOT segmentation | pose', im) key = cv2.waitKey(1) & 0xFF if key == ord(' ') or key == ord('q'): break vid.release() cv2.destroyAllWindows() ```Tiled inference
```py from sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction import cv2 import numpy as np from pathlib import Path from boxmot import DeepOCSORT tracker = DeepOCSORT( model_weights=Path('osnet_x0_25_msmt17.pt'), # which ReID model to use device='cpu', fp16=False, ) detection_model = AutoDetectionModel.from_pretrained( model_type='yolov8', model_path='yolov8n.pt', confidence_threshold=0.5, device="cpu", # or 'cuda:0' ) vid = cv2.VideoCapture(0) color = (0, 0, 255) # BGR thickness = 2 fontscale = 0.5 while True: ret, im = vid.read() # get sliced predictions result = get_sliced_prediction( im, detection_model, slice_height=256, slice_width=256, overlap_height_ratio=0.2, overlap_width_ratio=0.2 ) num_predictions = len(result.object_prediction_list) dets = np.zeros([num_predictions, 6], dtype=np.float32) for ind, object_prediction in enumerate(result.object_prediction_list): dets[ind, :4] = np.array(object_prediction.bbox.to_xyxy(), dtype=np.float32) dets[ind, 4] = object_prediction.score.value dets[ind, 5] = object_prediction.category.id tracks = tracker.update(dets, im) # --> (x, y, x, y, id, conf, cls, ind) tracker.plot_results(im, show_trajectories=True) # break on pressing q or space cv2.imshow('BoxMOT tiled inference', im) key = cv2.waitKey(1) & 0xFF if key == ord(' ') or key == ord('q'): break vid.release() cv2.destroyAllWindows() ```Contributors
Contact
For Yolo tracking bugs and feature requests please visit GitHub Issues. For business inquiries or professional support requests please send an email to: yolov5.deepsort.pytorch@gmail.com
Owner
- Login: shredder0812
- Kind: user
- Repositories: 1
- Profile: https://github.com/shredder0812
GitHub Events
Total
- Create event: 1
Last Year
- Create event: 1
Dependencies
- actions/checkout v4 composite
- actions/setup-python v5 composite
- actions/checkout v4 composite
- actions/setup-python v5 composite
- actions/checkout v4 composite
- actions/setup-python v5 composite
- actions/checkout v4 composite
- actions/create-release v1 composite
- actions/setup-python v5 composite
- pypa/gh-action-pypi-publish 2f6f737ca5f74c637829c0f5c3acd0e29ea5e8bf composite
- actions/checkout v4 composite
- actions/setup-python v5 composite
- actions/stale v9 composite
- actions/checkout v4 composite
- actions/setup-python v5 composite
- actions/checkout v4 composite
- actions/setup-python v5 composite
- nvcr.io/nvidia/pytorch 22.11-py3 build
- GitPython >=3.1.0
- PyYAML >=5.3.1
- filterpy >=1.4.5
- ftfy >=6.1.1
- gdown ==5.1.0
- lapx >=0.5.4
- loguru >=0.7.0
- numpy ==1.24.4
- opencv-python >=4.6.0
- pandas >=1.1.4
- pre-commit >=3.3.3
- regex >=2023.6.3
- scikit-learn >=1.3.0
- tensorboard >=2.13.0
- torch >=1.7.0
- torchvision >=0.8.1
- yacs >=0.1.8