之前的YOLOv7-Tracker迎来重磅更新!现在的代码更清晰、效果更好、泛化性更强!如果对您有用欢迎star: https://github.com/JackWoo0831/Yolov7-tracker,谢谢!
以下是仓库的介绍和使用方法:
YOLO检测器与SOTA多目标跟踪工具箱
❗❗重要提示
与之前的版本相比,这是一个全新的版本(分支v2)!!!
请直接使用这个版本,因为我几乎重写了所有代码,以确保更好的可读性和改进的结果,并修正了以往代码中的一些错误。
git clone https://github.com/JackWoo0831/Yolov7-tracker.git
git checkout v2 # change to v2 branch !!
🙌 如果您有任何关于添加跟踪器的建议,请在Issues部分留言并附上论文标题或链接!欢迎大家一起来让这个repo变得更好
❤️ 介绍
这个仓库是一个实现了检测后跟踪范式多目标跟踪器的工具箱。检测器支持:
- YOLOX
- YOLO v7
- YOLO v3 ~ v12 by ultralytics,
跟踪器支持:
- SORT
- DeepSORT
- ByteTrack (ECCV2022) 以及 ByetTrack-ReID
- Bot-SORT (arxiv2206) 以及 Bot-SORT-ReID
- OCSORT (CVPR2023)
- DeepOCSORT (ICIP2023)
- C_BIoU Track (arxiv2211)
- Strong SORT (IEEE TMM 2023)
- Sparse Track (arxiv 2306)
- UCMC Track (AAAI 2024)
- Hybrid SORT(AAAI 2024)
REID模型支持:
行人重识别模型:
- OSNet
- Extractor from DeepSort
- ShuffleNet
- MobileNet
车辆重识别模型:
- VehicleNet (AICIty-reID-2020)
部分重识别模型的权重: 百度网盘 提取码: c655
亮点包括:
- 支持的跟踪器比MMTracking多
- 用统一的代码风格重写了多个跟踪器,无需为每个跟踪器配置多个环境
- 模块化设计,将检测器、跟踪器、外观提取模块和卡尔曼滤波器解耦,便于进行实验
🔨 安装
基本环境是:
- Ubuntu 20.04
- Python:3.9, Pytorch: 1.12
运行以下命令安装其他包:
pip3 install -r requirements.txt
🔍 检测器安装
- YOLOX:
YOLOX的版本是0.1.0(与ByteTrack相同)。要安装它,你可以在某处克隆ByteTrack仓库,然后运行:
https://github.com/ifzhang/ByteTrack.git
python3 setup.py develop
- YOLO v7:
由于仓库本身就是基于YOLOv7的,因此无需执行额外的步骤。
- Ultralytics的YOLO系列模型:
请运行:
pip3 install ultralytics
or
pip3 install --upgrade ultralytics
📑 数据准备
如果你不想在特定数据集上测试,而只想运行演示,请跳过这一部分。
无论你想测试哪个数据集,请按以下方式(YOLO风格)组织:
dataset_name
|---images
|---train
|---sequence_name1
|---000001.jpg
|---000002.jpg ...
|---val ...
|---test ...
|
你可以参考./tools
中的代码来了解如何组织数据集。
然后,你需要准备一个yaml文件来指明路径,以便代码能够找到图像
一些示例在tracker/config_files中。重要的键包括:
DATASET_ROOT: '/data/xxxx/datasets/MOT17' # your dataset root
SPLIT: test # train, test or val
CATEGORY_NAMES: # same in YOLO training
- 'pedestrian'
CATEGORY_DICT:
0: 'pedestrian'
🚗 实践
🏃 训练
跟踪器通常不需要训练参数。请参考不同检测器的训练方法来训练YOLOs。
以下参考资料可能对你有帮助:
-
YOLOX:
tracker/yolox_utils/train_yolox.py
-
YOLO v7:
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
- Ultralytics的YOLO系列模型 (YOLO v3 ~ v12):
tracker/yolo_ultralytics_utils/train_yolo_ultralytics.py
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
关于重识别模型的训练, 请先参照对应模型的原论文或代码. 行人重识别模型例如 ShuffleNet, OSNet 参考 torchreid, 车辆重识别模型参考 AICIty-reID-2020.
😊 跟踪!
如果你只是想运行一个demo:
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
❗❗重要提示
如果你是通过 ultralytics 库训练检测模型, 命令里的
--detector
参数 必须包含ultra
字段, 例如
--detector yolo_ultra
,--detector yolo_ultra_v8
,--detector yolov11_ultra
,--detector yolo12_ultralytics
, 等等.
例如:
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
如果你想在数据集上测试:
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}
此外, 还可以指定
--reid
: 启用reid模型(目前对ByteTrack, BoT-SORT, OCSORT有用)
--reid_model
: 采用那种模型: 参照tracker/trackers/reid_models/engine.py
中的REID_MODEL_DICT
选取
--reid_model_path
: 加载的重识别模型权重路径
--conf_thresh_low
: 对于两阶段关联模型(ByteTrack, BoT-SORT等), 最低置信度阈值(默认0.1)
--fuse_detection_score
: 如果加上, 就融合IoU的值和检测置信度的值, 例如BoT-SORT的源码是这样做的
--save_images
: 保存结果图片
各种跟踪算法运行示例:
-
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
-
DeepSORT:
python tracker/track.py --dataset visdrone_part --detector yolov7 --tracker deepsort --kalman_format byte --detector_model_path weights/yolov8l_VisDroneDet_35epochs_20230605.pt
-
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
-
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
-
OCSort:
python tracker/track.py --dataset mot17 --detector yolox --tracker ocsort --kalman_format ocsort --detector_model_path weights/bytetrack_m_mot17.pth.tar
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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
UCMC Track的重要提示:
相机参数. UCMC Track需要相机的内参和外参. 请按照
tracker/cam_ram_files/uavdt/M0101.txt
的格式组织. 一个视频序列对应一个txt文件. 如果您没有标记的参数, 可以参考原始仓库中的估算工具箱(https://github.com/corfyi/UCMCTrack).该代码不包含每两帧之间的相机运动补偿部分, 请参阅https://github.com/corfyi/UCMCTrack/issues/12. 在我看来, 既然算法叫"统一相机运动补偿", 因此不需要每两帧之间再更新补偿.
✅ 评估
马上推出!作为备选项,你可以使用这个repo: Easier to use TrackEval repo.