Skip to content

Commit 96bc575

Browse files
committed
update readme and optimize the save_dir
1 parent 3658198 commit 96bc575

File tree

5 files changed

+80
-26
lines changed

5 files changed

+80
-26
lines changed

README.md

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ git checkout v2 # change to v2 branch !!
2121

2222
## 🗺️ Latest News
2323

24+
- ***2025.4.7*** Add more Re-ID modules (ShuffleNet, VehicleNet, MobileNet), fix some bugs (such as abandon bbox aspect ratio updating if the tracklet is not activated), and add some functions (customized low filter threshold, fuse detection score, etc.)
2425
- ***2025.4.3*** Support the newest ultralytics version (YOLO v3 ~ v12) and fix some bugs of hybrid sort.
2526

2627
## ❤️ Introduction
@@ -35,9 +36,10 @@ and the tracker supports:
3536

3637
- SORT
3738
- DeepSORT
38-
- ByteTrack ([ECCV2022](https://arxiv.org/pdf/2110.06864))
39-
- Bot-SORT ([arxiv2206](https://arxiv.org/pdf/2206.14651.pdf))
39+
- ByteTrack ([ECCV2022](https://arxiv.org/pdf/2110.06864)) and ByetTrack-ReID
40+
- Bot-SORT ([arxiv2206](https://arxiv.org/pdf/2206.14651.pdf)) and Bot-SORT-ReID
4041
- OCSORT ([CVPR2023](https://openaccess.thecvf.com/content/CVPR2023/papers/Cao_Observation-Centric_SORT_Rethinking_SORT_for_Robust_Multi-Object_Tracking_CVPR_2023_paper.pdf))
42+
- DeepOCSORT ([ICIP2023](https://arxiv.org/abs/2302.11813))
4143
- C_BIoU Track ([arxiv2211](https://arxiv.org/pdf/2211.14317v2.pdf))
4244
- Strong SORT ([IEEE TMM 2023](https://arxiv.org/pdf/2202.13514))
4345
- Sparse Track ([arxiv 2306](https://arxiv.org/pdf/2306.05238))
@@ -46,8 +48,17 @@ and the tracker supports:
4648

4749
and the reid model supports:
4850

51+
Pedestrain Re-ID:
4952
- OSNet
5053
- Extractor from DeepSort
54+
- ShuffleNet
55+
- MobileNet
56+
57+
Vehicle Re-ID:
58+
- VehicleNet ([AICIty-reID-2020](https://github.com/layumi/AICIty-reID-2020))
59+
60+
> **checkpoitns of some Re-ID models**: [Baidu Disk](https://pan.baidu.com/s/1QbVoBz4mPpf4Qsqq1PYXkQ) Code: c655
61+
5162

5263
The highlights are:
5364
- Supporting more trackers than MMTracking
@@ -155,11 +166,11 @@ python train_aux.py --dataset visdrone --workers 8 --device <$GPU_id$> --batch-s
155166
python tracker/yolo_ultralytics_utils/train_yolo_ultralytics.py --model_weight weights/yolo11m.pt --data_cfg tracker/yolo_ultralytics_utils/data_cfgs/visdrone_det.yaml --epochs 30 --batch_size 8 --img_sz 1280 --device 0
156167
```
157168

158-
169+
> The training of Re-ID model please refer to its original paper or github repo. The pedestrain Re-ID model such as ShuffleNet, OSNet please refer to [torchreid](https://github.com/KaiyangZhou/deep-person-reid), the vehicle Re-ID model please refer to [AICIty-reID-2020](https://github.com/layumi/AICIty-reID-2020).
159170
160171
### 😊 Tracking !
161172

162-
If you only want to run a demo:
173+
**If you only want to run a demo**:
163174

164175
```bash
165176
python tracker/track_demo.py --obj ${video path or images folder path} --detector ${yolox, yolov7 or yolo_ultra} --tracker ${tracker name} --kalman_format ${kalman format, sort, byte, ...} --detector_model_path ${detector weight path} --save_images
@@ -176,13 +187,27 @@ For example:
176187
python tracker/track_demo.py --obj M0203.mp4 --detector yolo_ultra_v8 --tracker deepsort --kalman_format byte --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt --save_images
177188
```
178189

179-
If you want to run trackers on dataset:
190+
**If you want to run trackers on dataset**:
180191

181192
```bash
182193
python tracker/track.py --dataset ${dataset name, related with the yaml file} --detector ${yolox, yolo_ultra_v8 or yolov7} --tracker ${tracker name} --kalman_format ${kalman format, sort, byte, ...} --detector_model_path ${detector weight path}
183194
```
184195

185-
For example:
196+
In addition, you can also specify
197+
198+
`--reid`: Enable the reid model (currently useful for ByteTrack, BoT-SORT, OCSORT)
199+
200+
`--reid_model`: Which model to use: Refer to `REID_MODEL_DICT` in `tracker/trackers/reid_models/engine.py` to select
201+
202+
`--reid_model_path`: Loaded re-identification model weight path
203+
204+
`--conf_thresh_low`: For two-stage association models (ByteTrack, BoT-SORT, etc.), the minimum confidence threshold (default 0.1)
205+
206+
`--fuse_detection_score`: If added, the IoU value and the detection confidence value are fused, for example, the source code of BoT-SORT does this
207+
208+
`--save_images`: Save the result image
209+
210+
***Examples of tracking algorithms***:
186211

187212
- SORT: `python tracker/track.py --dataset uavdt --detector yolo_ultra_v8 --tracker sort --kalman_format sort --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt `
188213

README_CN.md

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ git checkout v2 # change to v2 branch !!
1515

1616
## 🗺️ 最近更新
1717

18+
- ***2025.4.7*** 增加更多Re-ID模型 (ShuffleNet, VehicleNet, MobileNet), 修复一些bug (例如在轨迹为非活动状态时停止更新边界框长宽), 增加一些小功能 (例如可以修改两阶段关联策略的最低阈值,原来是固定的0.1; 增加将IoU和检测置信度融合的选项)
1819
- ***2025.4.3*** 增加了ultralytics库最新版本的支持,修复了hybrid sort中的一些bug.
1920

2021

@@ -30,9 +31,10 @@ git checkout v2 # change to v2 branch !!
3031

3132
- SORT
3233
- DeepSORT
33-
- ByteTrack ([ECCV2022](https://arxiv.org/pdf/2110.06864))
34-
- Bot-SORT ([arxiv2206](https://arxiv.org/pdf/2206.14651.pdf))
34+
- ByteTrack ([ECCV2022](https://arxiv.org/pdf/2110.06864)) 以及 ByetTrack-ReID
35+
- Bot-SORT ([arxiv2206](https://arxiv.org/pdf/2206.14651.pdf)) 以及 Bot-SORT-ReID
3536
- OCSORT ([CVPR2023](https://openaccess.thecvf.com/content/CVPR2023/papers/Cao_Observation-Centric_SORT_Rethinking_SORT_for_Robust_Multi-Object_Tracking_CVPR_2023_paper.pdf))
37+
- DeepOCSORT ([ICIP2023](https://arxiv.org/abs/2302.11813))
3638
- C_BIoU Track ([arxiv2211](https://arxiv.org/pdf/2211.14317v2.pdf))
3739
- Strong SORT ([IEEE TMM 2023](https://arxiv.org/pdf/2202.13514))
3840
- Sparse Track ([arxiv 2306](https://arxiv.org/pdf/2306.05238))
@@ -41,8 +43,17 @@ git checkout v2 # change to v2 branch !!
4143

4244
REID模型支持:
4345

46+
行人重识别模型:
4447
- OSNet
45-
- DeepSORT中的
48+
- Extractor from DeepSort
49+
- ShuffleNet
50+
- MobileNet
51+
52+
车辆重识别模型:
53+
54+
- VehicleNet ([AICIty-reID-2020](https://github.com/layumi/AICIty-reID-2020))
55+
56+
> **部分重识别模型的权重**: [百度网盘](https://pan.baidu.com/s/1QbVoBz4mPpf4Qsqq1PYXkQ) 提取码: c655
4657
4758
亮点包括:
4859
- 支持的跟踪器比MMTracking多
@@ -51,10 +62,6 @@ REID模型支持:
5162

5263
![gif](figure/demo.gif)
5364

54-
## 🗺️ 路线图
55-
56-
- [ x ] Add UCMC Track
57-
- [] Add more ReID modules.
5865

5966
## 🔨 安装
6067

@@ -154,11 +161,11 @@ python train_aux.py --dataset visdrone --workers 8 --device <$GPU_id$> --batch-s
154161
python tracker/yolo_ultralytics_utils/train_yolo_ultralytics.py --model_weight weights/yolo11m.pt --data_cfg tracker/yolo_ultralytics_utils/data_cfgs/visdrone_det.yaml --epochs 30 --batch_size 8 --img_sz 1280 --device 0
155162
```
156163

157-
164+
> 关于重识别模型的训练, 请先参照对应模型的原论文或代码. 行人重识别模型例如 ShuffleNet, OSNet 参考 [torchreid](https://github.com/KaiyangZhou/deep-person-reid), 车辆重识别模型参考 [AICIty-reID-2020](https://github.com/layumi/AICIty-reID-2020).
158165
159166
### 😊 跟踪!
160167

161-
如果你只是想运行一个demo:
168+
**如果你只是想运行一个demo**:
162169

163170
```bash
164171
python tracker/track_demo.py --obj ${video path or images folder path} --detector ${yolox, yolov7 or yolo_ultra} --tracker ${tracker name} --kalman_format ${kalman format, sort, byte, ...} --detector_model_path ${detector weight path} --save_images
@@ -175,26 +182,46 @@ python tracker/track_demo.py --obj ${video path or images folder path} --detecto
175182
python tracker/track_demo.py --obj M0203.mp4 --detector yolov8 --tracker deepsort --kalman_format byte --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt --save_images
176183
```
177184

178-
如果你想在数据集上测试:
185+
**如果你想在数据集上测试**:
179186

180187
```bash
181188
python tracker/track.py --dataset ${dataset name, related with the yaml file} --detector ${yolox, yolo_ultra_v8 or yolov7} --tracker ${tracker name} --kalman_format ${kalman format, sort, byte, ...} --detector_model_path ${detector weight path}
182189
```
183190

184-
例如:
191+
此外, 还可以指定
192+
193+
`--reid`: 启用reid模型(目前对ByteTrack, BoT-SORT, OCSORT有用)
194+
195+
`--reid_model`: 采用那种模型: 参照`tracker/trackers/reid_models/engine.py`中的`REID_MODEL_DICT`选取
196+
197+
`--reid_model_path`: 加载的重识别模型权重路径
198+
199+
`--conf_thresh_low`: 对于两阶段关联模型(ByteTrack, BoT-SORT等), 最低置信度阈值(默认0.1)
200+
201+
`--fuse_detection_score`: 如果加上, 就融合IoU的值和检测置信度的值, 例如BoT-SORT的源码是这样做的
202+
203+
`--save_images`: 保存结果图片
204+
205+
***各种跟踪算法运行示例***:
185206

186207
- SORT: `python tracker/track.py --dataset uavdt --detector yolo_ultra_v8 --tracker sort --kalman_format sort --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt `
187208

188209
- DeepSORT: `python tracker/track.py --dataset visdrone_part --detector yolov7 --tracker deepsort --kalman_format byte --detector_model_path weights/yolov8l_VisDroneDet_35epochs_20230605.pt`
189210

190211
- ByteTrack: `python tracker/track.py --dataset uavdt --detector yolo_ultra_v8 --tracker bytetrack --kalman_format byte --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt`
191212

213+
- ByteTrack-ReID: `python tracker/track.py --dataset uavdt --detector yolo_ultra_v8 --tracker bytetrack --kalman_format byte --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt --reid --reid_model osnet_x0_25 --reid_model_path weights/osnet_x0_25.pth`
214+
192215
- OCSort: `python tracker/track.py --dataset mot17 --detector yolox --tracker ocsort --kalman_format ocsort --detector_model_path weights/bytetrack_m_mot17.pth.tar`
193216

217+
- DeepOCSORT: `python tracker/track.py --dataset mot17 --detector yolox --tracker ocsort --kalman_format ocsort --detector_model_path weights/bytetrack_m_mot17.pth.tar --reid --reid_model shufflenet_v2_x1_0 --reid_model_path shufflenetv2_x1-5666bf0f80.pth`
218+
194219
- C-BIoU Track: `python tracker/track.py --dataset uavdt --detector yolo_ultra_v8 --tracker c_bioutrack --kalman_format bot --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt`
195220

196221
- BoT-SORT: `python tracker/track.py --dataset uavdt --detector yolox --tracker botsort --kalman_format bot --detector_model_path weights/yolox_m_uavdt_50epochs.pth.tar`
197222

223+
- BoT-SORT-ReID: `python tracker/track.py --dataset uavdt --detector yolox --tracker botsort --kalman_format bot --detector_model_path weights/yolox_m_uavdt_50epochs.pth.tar --reid --reid_model vehiclenet --reid_model_path vehicle_net_resnet50.pth`
224+
198225
- Strong SORT: `python tracker/track.py --dataset visdrone_part --detector yolo_ultra_v8 --tracker strongsort --kalman_format strongsort --detector_model_path weights/yolov8l_VisDroneDet_35epochs_20230605.pt`
199226

200227
- Sparse Track: `python tracker/track.py --dataset uavdt --detector yolo_ultra_v11 --tracker sparsetrack --kalman_format bot --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt`

tracker/track.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ def get_args():
115115
parser.add_argument('--gamma', type=float, default=0.1, help='param to control fusing motion and apperance dist')
116116
parser.add_argument('--min_area', type=float, default=150, help='use to filter small bboxs')
117117

118-
parser.add_argument('--save_dir', type=str, default='track_results/{dataset_name}/{split}')
118+
parser.add_argument('--save_dir', type=str, default='track_results/{tracker_name}/{dataset_name}/{split}')
119119
parser.add_argument('--save_images', action='store_true', help='save tracking results (image)')
120120
parser.add_argument('--save_videos', action='store_true', help='save tracking results (video)')
121121

@@ -200,7 +200,9 @@ def main(args, dataset_cfgs):
200200

201201
logger.info(f'Total {len(seqs)} seqs will be tracked: {seqs}')
202202

203-
save_dir = args.save_dir.format(dataset_name=args.dataset, split=SPLIT)
203+
save_dir = args.save_dir.format(tracker_name=args.tracker, dataset_name=args.dataset, split=SPLIT)
204+
if not os.path.exists(save_dir):
205+
os.makedirs(save_dir)
204206

205207

206208
"""4. Tracking"""
@@ -292,7 +294,7 @@ def main(args, dataset_cfgs):
292294
plot_img(img=ori_img, frame_id=frame_idx, results=[cur_tlwh, cur_id, cur_cls],
293295
save_dir=os.path.join(save_dir, 'vis_results'))
294296

295-
save_results(folder_name=os.path.join(args.dataset, SPLIT),
297+
save_results(save_dir=save_dir,
296298
seq_name=seq,
297299
results=results)
298300

tracker/track_demo.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ def get_args():
9292
parser.add_argument('--img_size', type=int, default=1280, help='image size, [h, w]')
9393

9494
parser.add_argument('--conf_thresh', type=float, default=0.2, help='filter tracks')
95+
parser.add_argument('--conf_thresh_low', type=float, default=0.1, help='filter low conf detections, used in two-stage association')
9596
parser.add_argument('--nms_thresh', type=float, default=0.7, help='thresh for NMS')
9697
parser.add_argument('--iou_thresh', type=float, default=0.5, help='IOU thresh to filter tracks')
9798

tracker/tracking_utils/tools.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import cv2
33
import os
44

5-
def save_results(folder_name, seq_name, results, data_type='default'):
5+
def save_results(save_dir, seq_name, results, data_type='default'):
66
"""
77
write results to txt file
88
@@ -12,15 +12,14 @@ def save_results(folder_name, seq_name, results, data_type='default'):
1212
"""
1313
assert len(results)
1414

15-
if not os.path.exists(f'./track_results/{folder_name}'):
15+
if not os.path.exists(save_dir):
16+
os.makedirs(save_dir)
1617

17-
os.makedirs(f'./track_results/{folder_name}')
18-
19-
with open(os.path.join('./track_results', folder_name, seq_name + '.txt'), 'w') as f:
18+
with open(os.path.join(save_dir, seq_name + '.txt'), 'w') as f:
2019
for frame_id, target_ids, tlwhs, clses, scores in results:
2120
for id, tlwh, score in zip(target_ids, tlwhs, scores):
2221
f.write(f'{frame_id},{id},{tlwh[0]:.2f},{tlwh[1]:.2f},{tlwh[2]:.2f},{tlwh[3]:.2f},{score:.2f},-1,-1,-1\n')
2322

2423
f.close()
2524

26-
return folder_name
25+
return save_dir

0 commit comments

Comments
 (0)