Skip to content

Commit c3d0c2f

Browse files
committed
support the newest ultralytics
1 parent 8b01276 commit c3d0c2f

18 files changed

+109
-152
lines changed

README.md

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,15 @@ git checkout v2 # change to v2 branch !!
2121

2222
## 🗺️ Latest News
2323

24-
- ***2024.11.29*** Fix bugs of C-BIoU Track (the state prediction and updating bugs)
25-
- ***2024.10.24*** Add Hybrid SORT and fix some errors and bugs of OC-SORT.
24+
- ***2025.4.3*** Support the newest ultralytics version (YOLO v3 ~ v12) and fix some bugs of hybrid sort.
2625

2726
## ❤️ Introduction
2827

2928
This repo is a toolbox that implements the **tracking-by-detection paradigm multi-object tracker**. The detector supports:
3029

3130
- YOLOX
3231
- YOLO v7
33-
- YOLO v8,
32+
- YOLO v3 ~ v12 by [ultralytics](https://docs.ultralytics.com/),
3433

3534
and the tracker supports:
3635

@@ -61,7 +60,7 @@ The highlights are:
6160
## 🔨 Installation
6261

6362
The basic env is:
64-
- Ubuntu 18.04
63+
- Ubuntu 20.04
6564
- Python:3.9, Pytorch: 1.12
6665

6766
Run following commond to install other packages:
@@ -86,12 +85,14 @@ python3 setup.py develop
8685

8786
There is no need to execute addtional steps as the repo itself is based on YOLOv7.
8887

89-
3. YOLO v8:
88+
3. YOLO series by ultralytics:
9089

9190
Please run:
9291

9392
```bash
94-
pip3 install ultralytics==8.0.94
93+
pip3 install ultralytics
94+
or
95+
pip3 install --upgrade ultralytics
9596
```
9697

9798
### 📑 Data preparation
@@ -148,7 +149,11 @@ Some references may help you:
148149
python train_aux.py --dataset visdrone --workers 8 --device <$GPU_id$> --batch-size 16 --data data/visdrone_all.yaml --img 1280 1280 --cfg cfg/training/yolov7-w6.yaml --weights <$YOLO v7 pretrained model path$> --name yolov7-w6-custom --hyp data/hyp.scratch.custom.yaml
149150
```
150151

151-
- YOLO v8: `tracker/yolov8_utils/train_yolov8.py`
152+
- YOLO series (YOLO v3 ~ v12) by ultralytics:: `tracker/yolo_ultralytics_utils/train_yolo_ultralytics.py`
153+
154+
```shell
155+
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
156+
```
152157

153158

154159

@@ -157,42 +162,47 @@ python train_aux.py --dataset visdrone --workers 8 --device <$GPU_id$> --batch-s
157162
If you only want to run a demo:
158163

159164
```bash
160-
python tracker/track_demo.py --obj ${video path or images folder path} --detector ${yolox, yolov8 or yolov7} --tracker ${tracker name} --kalman_format ${kalman format, sort, byte, ...} --detector_model_path ${detector weight path} --save_images
165+
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
161166
```
162167

168+
> ❗❗Important Notes
169+
>
170+
> If you want to use the detector trained by **ultralytics**, the `--detector` argument **must include** the substring `ultra`, such as
171+
> `--detector yolo_ultra`, `--detector yolo_ultra_v8`, `--detector yolov11_ultra`, `--detector yolo12_ultralytics`, etc.
172+
163173
For example:
164174

165175
```bash
166-
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
176+
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
167177
```
168178

169179
If you want to run trackers on dataset:
170180

171181
```bash
172-
python tracker/track.py --dataset ${dataset name, related with the yaml file} --detector ${yolox, yolov8 or yolov7} --tracker ${tracker name} --kalman_format ${kalman format, sort, byte, ...} --detector_model_path ${detector weight path}
182+
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}
173183
```
174184

175185
For example:
176186

177-
- SORT: `python tracker/track.py --dataset uavdt --detector yolov8 --tracker sort --kalman_format sort --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt `
187+
- 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 `
178188

179-
- DeepSORT: `python tracker/track.py --dataset uavdt --detector yolov7 --tracker deepsort --kalman_format byte --detector_model_path weights/yolov7_UAVDT_35epochs_20230507.pt`
189+
- DeepSORT: `python tracker/track.py --dataset visdrone_part --detector yolov7 --tracker deepsort --kalman_format byte --detector_model_path weights/yolov8l_VisDroneDet_35epochs_20230605.pt`
180190

181-
- ByteTrack: `python tracker/track.py --dataset uavdt --detector yolov8 --tracker bytetrack --kalman_format byte --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt`
191+
- 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`
182192

183193
- OCSort: `python tracker/track.py --dataset mot17 --detector yolox --tracker ocsort --kalman_format ocsort --detector_model_path weights/bytetrack_m_mot17.pth.tar`
184194

185-
- C-BIoU Track: `python tracker/track.py --dataset uavdt --detector yolov8 --tracker c_bioutrack --kalman_format bot --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt`
195+
- 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`
186196

187197
- 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`
188198

189-
- Strong SORT: `python tracker/track.py --dataset uavdt --detector yolov8 --tracker strongsort --kalman_format strongsort --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt`
199+
- Strong SORT: `python tracker/track.py --dataset visdrone_part --detector yolo_ultra_v8 --tracker strongsort --kalman_format strongsort --detector_model_path weights/yolov8l_VisDrone_35epochs_20230509.pt`
190200

191-
- Sparse Track: `python tracker/track.py --dataset uavdt --detector yolov8 --tracker sparsetrack --kalman_format bot --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt`
201+
- 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`
192202

193203
- UCMC Track: `python tracker/track.py --dataset mot17 --detector yolox --tracker ucmctrack --kalman_format ucmc --detector_model_path weights/bytetrack_m_mot17.pth.tar --camera_parameter_folder ./tracker/cam_param_files`
194204

195-
- Hybrid SORT: `python tracker/track.py --dataset mot17 --detector yolox --tracker hybridsort --kalman_format hybridsort --detector_model_path weights/bytetrack_m_mot17.pth.tar --save_images`
205+
- Hybrid SORT: `python tracker/track.py --dataset visdrone_part --detector yolo_ultra --tracker hybridsort --kalman_format hybridsort --detector_model_path weights/yolov8l_VisDrone_35epochs_20230509.pt --save_images`
196206

197207
> **Important notes for UCMC Track:**
198208
>

README_CN.md

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

1616
## 🗺️ 最近更新
1717

18-
- ***2024.11.29*** 修复了C-BIoU Tracker中轨迹状态的更新和预测的错误
19-
- ***2024.10.24*** 增加了 Hybrid SORT 并且修复了OC-SORT的一些bug和错误。
18+
- ***2025.4.3*** 增加了ultralytics库最新版本的支持,修复了hybrid sort中的一些bug.
2019

2120

2221
## ❤️ 介绍
@@ -25,7 +24,7 @@ git checkout v2 # change to v2 branch !!
2524

2625
- YOLOX
2726
- YOLO v7
28-
- YOLO v8,
27+
- YOLO v3 ~ v12 by [ultralytics](https://docs.ultralytics.com/),
2928

3029
跟踪器支持:
3130

@@ -60,7 +59,7 @@ REID模型支持:
6059
## 🔨 安装
6160

6261
基本环境是:
63-
- Ubuntu 18.04
62+
- Ubuntu 20.04
6463
- Python:3.9, Pytorch: 1.12
6564

6665
运行以下命令安装其他包:
@@ -85,12 +84,14 @@ python3 setup.py develop
8584

8685
由于仓库本身就是基于YOLOv7的,因此无需执行额外的步骤。
8786

88-
3. YOLO v8:
87+
3. Ultralytics的YOLO系列模型:
8988

9089
请运行:
9190

9291
```bash
93-
pip3 install ultralytics==8.0.94
92+
pip3 install ultralytics
93+
or
94+
pip3 install --upgrade ultralytics
9495
```
9596

9697
### 📑 数据准备
@@ -147,7 +148,11 @@ CATEGORY_DICT:
147148
python train_aux.py --dataset visdrone --workers 8 --device <$GPU_id$> --batch-size 16 --data data/visdrone_all.yaml --img 1280 1280 --cfg cfg/training/yolov7-w6.yaml --weights <$YOLO v7 pretrained model path$> --name yolov7-w6-custom --hyp data/hyp.scratch.custom.yaml
148149
```
149150

150-
- YOLO v8: `tracker/yolov8_utils/train_yolov8.py`
151+
- Ultralytics的YOLO系列模型 (YOLO v3 ~ v12): `tracker/yolo_ultralytics_utils/train_yolo_ultralytics.py`
152+
153+
```shell
154+
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
155+
```
151156

152157

153158

@@ -156,9 +161,14 @@ python train_aux.py --dataset visdrone --workers 8 --device <$GPU_id$> --batch-s
156161
如果你只是想运行一个demo:
157162

158163
```bash
159-
python tracker/track_demo.py --obj ${video path or images folder path} --detector ${yolox, yolov8 or yolov7} --tracker ${tracker name} --kalman_format ${kalman format, sort, byte, ...} --detector_model_path ${detector weight path} --save_images
164+
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
160165
```
161166

167+
> ❗❗重要提示
168+
>
169+
> 如果你是通过 **ultralytics** 库训练检测模型, 命令里的`--detector`参数 **必须包含**`ultra`字段, 例如
170+
> `--detector yolo_ultra`, `--detector yolo_ultra_v8`, `--detector yolov11_ultra`, `--detector yolo12_ultralytics`, 等等.
171+
162172
例如:
163173

164174
```bash
@@ -168,26 +178,30 @@ python tracker/track_demo.py --obj M0203.mp4 --detector yolov8 --tracker deepsor
168178
如果你想在数据集上测试:
169179

170180
```bash
171-
python tracker/track.py --dataset ${dataset name, related with the yaml file} --detector ${yolox, yolov8 or yolov7} --tracker ${tracker name} --kalman_format ${kalman format, sort, byte, ...} --detector_model_path ${detector weight path}
181+
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}
172182
```
173183

174184
例如:
175185

176-
- SORT: `python tracker/track.py --dataset uavdt --detector yolov8 --tracker sort --kalman_format sort --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt `
186+
- 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 `
177187

178-
- DeepSORT: `python tracker/track.py --dataset uavdt --detector yolov7 --tracker deepsort --kalman_format byte --detector_model_path weights/yolov7_UAVDT_35epochs_20230507.pt`
188+
- DeepSORT: `python tracker/track.py --dataset visdrone_part --detector yolov7 --tracker deepsort --kalman_format byte --detector_model_path weights/yolov8l_VisDroneDet_35epochs_20230605.pt`
179189

180-
- ByteTrack: `python tracker/track.py --dataset uavdt --detector yolov8 --tracker bytetrack --kalman_format byte --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt`
190+
- 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`
181191

182-
- OCSort: `python tracker/track.py --dataset uavdt --detector yolov8 --tracker ocsort --kalman_format ocsort --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt`
192+
- OCSort: `python tracker/track.py --dataset mot17 --detector yolox --tracker ocsort --kalman_format ocsort --detector_model_path weights/bytetrack_m_mot17.pth.tar`
183193

184-
- C-BIoU Track: `python tracker/track.py --dataset uavdt --detector yolov8 --tracker c_bioutrack --kalman_format bot --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt`
194+
- 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`
185195

186196
- 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`
187197

198+
- 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`
199+
200+
- 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`
201+
188202
- UCMC Track: `python tracker/track.py --dataset mot17 --detector yolox --tracker ucmctrack --kalman_format ucmc --detector_model_path weights/bytetrack_m_mot17.pth.tar --camera_parameter_folder ./tracker/cam_param_files`
189203

190-
- Hybrid SORT: `python tracker/track.py --dataset mot17 --detector yolox --tracker hybridsort --kalman_format hybridsort --detector_model_path weights/bytetrack_m_mot17.pth.tar --save_images`
204+
- Hybrid SORT: `python tracker/track.py --dataset visdrone_part --detector yolo_ultra --tracker hybridsort --kalman_format hybridsort --detector_model_path weights/yolov8l_VisDrone_35epochs_20230509.pt --save_images`
191205

192206
>**UCMC Track的重要提示:**
193207
>

tracker/config_files/visdrone_part.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Config file of VisDrone dataset
22

33
DATASET_ROOT: '/data/wujiapeng/datasets/VisDrone2019/VisDrone2019'
4-
SPLIT: test
4+
SPLIT: val
55
CATEGORY_NAMES:
66
- 'pedestrain'
77
- 'car'

tracker/track.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,14 @@
5454
logger.warning('Load yolov7 fail. If you want to use yolov7, please check the installation.')
5555
pass
5656

57-
# YOLOv8 modules
57+
# Ultralytics YOLO modules (support YOLOv3 ~ YOLOv12)
5858
try:
5959
from ultralytics import YOLO
60-
from yolov8_utils.postprocess import postprocess as postprocess_yolov8
60+
from yolo_ultralytics_utils.postprocess import postprocess as postprocess_ultralytics
6161

6262
except Exception as e:
6363
logger.warning(e)
64-
logger.warning('Load yolov8 fail. If you want to use yolov8, please check the installation.')
64+
logger.warning('Load ultralytics fail. If you want to use ultralytics, please check the installation.')
6565
pass
6666

6767
TRACKER_DICT = {
@@ -83,7 +83,7 @@ def get_args():
8383

8484
"""general"""
8585
parser.add_argument('--dataset', type=str, default='visdrone_part', help='visdrone, mot17, etc.')
86-
parser.add_argument('--detector', type=str, default='yolov8', help='yolov7, yolox, etc.')
86+
parser.add_argument('--detector', type=str, default='yolo_ultralytics_v8', help='yolov7, yolox, etc.')
8787
parser.add_argument('--tracker', type=str, default='sort', help='sort, deepsort, etc')
8888
parser.add_argument('--reid_model', type=str, default='osnet_x0_25', help='osnet or deppsort')
8989

@@ -170,7 +170,7 @@ def main(args, dataset_cfgs):
170170

171171
logger.info(f'Now detector is on device {next(model.parameters()).device}')
172172

173-
elif args.detector == 'yolov8':
173+
elif 'ultra' in args.detector:
174174

175175
logger.info(f"loading detector {args.detector} checkpoint {args.detector_model_path}")
176176
model = YOLO(args.detector_model_path)
@@ -182,6 +182,9 @@ def main(args, dataset_cfgs):
182182

183183
else:
184184
logger.error(f"detector {args.detector} is not supprted")
185+
logger.error("If you want to use the yolo v8 by ultralytics, please specify the `--detector` \
186+
as the string including the substring `ultra`, \
187+
such as `yolo_ultra_v8` or `yolo11_ultralytics`")
185188
exit(0)
186189

187190
"""3. load sequences"""
@@ -226,7 +229,7 @@ def main(args, dataset_cfgs):
226229
# start timing this frame
227230
timer.tic()
228231

229-
if args.detector == 'yolov8':
232+
if 'ultra' in args.detector:
230233
img = img.squeeze(0).cpu().numpy()
231234

232235
else:
@@ -237,8 +240,8 @@ def main(args, dataset_cfgs):
237240

238241
# get detector output
239242
with torch.no_grad():
240-
if args.detector == 'yolov8':
241-
output = model.predict(img, conf=args.conf_thresh, iou=args.nms_thresh)
243+
if 'ultra' in args.detector:
244+
output = model.predict(img, conf=args.conf_thresh, iou=args.nms_thresh, verbose=False)
242245
else:
243246
output = model(img)
244247

@@ -250,8 +253,8 @@ def main(args, dataset_cfgs):
250253
elif args.detector == 'yolov7':
251254
output = postprocess_yolov7(output, args.conf_thresh, args.nms_thresh, img.shape[2:], ori_img.shape)
252255

253-
elif args.detector == 'yolov8':
254-
output = postprocess_yolov8(output)
256+
elif 'ultra' in args.detector:
257+
output = postprocess_ultralytics(output)
255258

256259
else: raise NotImplementedError
257260

tracker/track_demo.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@
5353
logger.warning('Load yolov7 fail. If you want to use yolov7, please check the installation.')
5454
pass
5555

56-
# YOLOv8 modules
56+
# Ultralytics YOLO modules (support YOLOv3 ~ YOLOv12)
5757
try:
5858
from ultralytics import YOLO
59-
from yolov8_utils.postprocess import postprocess as postprocess_yolov8
59+
from yolo_ultralytics_utils.postprocess import postprocess as postprocess_ultralytics
6060

6161
except Exception as e:
6262
logger.warning(e)
@@ -83,7 +83,7 @@ def get_args():
8383
"""general"""
8484
parser.add_argument('--obj', type=str, required=True, default='demo.mp4', help='video or images folder PATH')
8585

86-
parser.add_argument('--detector', type=str, default='yolov8', help='yolov7, yolox, etc.')
86+
parser.add_argument('--detector', type=str, default='yolo_ultralytics_v8', help='yolov7, yolox, etc.')
8787
parser.add_argument('--tracker', type=str, default='sort', help='sort, deepsort, etc')
8888
parser.add_argument('--reid_model', type=str, default='osnet_x0_25', help='osnet or deppsort')
8989

@@ -168,7 +168,7 @@ def main(args):
168168

169169
logger.info(f'Now detector is on device {next(model.parameters()).device}')
170170

171-
elif args.detector == 'yolov8':
171+
elif 'ultra' in args.detector:
172172

173173
logger.info(f"loading detector {args.detector} checkpoint {args.detector_model_path}")
174174
model = YOLO(args.detector_model_path)
@@ -180,6 +180,9 @@ def main(args):
180180

181181
else:
182182
logger.error(f"detector {args.detector} is not supprted")
183+
logger.error("If you want to use the yolo v8 by ultralytics, please specify the `--detector` \
184+
as the string including the substring `ultra`, \
185+
such as `yolo_ultra_v8` or `yolo11_ultralytics`")
183186
exit(0)
184187

185188
"""3. load sequences"""
@@ -200,7 +203,7 @@ def main(args):
200203
"""4. Tracking"""
201204

202205
for frame_idx, (ori_img, img) in process_bar:
203-
if args.detector == 'yolov8':
206+
if 'ultra' in args.detector:
204207
img = img.squeeze(0).cpu().numpy()
205208

206209
else:
@@ -211,7 +214,7 @@ def main(args):
211214

212215
# get detector output
213216
with torch.no_grad():
214-
if args.detector == 'yolov8':
217+
if 'ultra' in args.detector:
215218
output = model.predict(img, conf=args.conf_thresh, iou=args.nms_thresh)
216219
else:
217220
output = model(img)
@@ -224,8 +227,8 @@ def main(args):
224227
elif args.detector == 'yolov7':
225228
output = postprocess_yolov7(output, args.conf_thresh, args.nms_thresh, img.shape[2:], ori_img.shape)
226229

227-
elif args.detector == 'yolov8':
228-
output = postprocess_yolov8(output)
230+
elif 'ultra' in args.detector:
231+
output = postprocess_ultralytics(output)
229232

230233
else: raise NotImplementedError
231234

0 commit comments

Comments
 (0)