1 创建环境
conda create -n ocsort python=3.8
conda activate ocsort
#根据cuda版本安装torch
pip install torch==1.10.1+cu111 torchvision==0.11.2+cu111 torchaudio==0.10.1 -f https://download.pytorch.org/whl/cu111/torch_stable.html
然后把代码手动下载解压好,源码地址:
2 依赖项
cd ocsort
pip3 install -r requirements.txt
python3 setup.py develop
pip3 install cython
#pip3 install 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
#这个命令会报错,故直接用pip安装
pip install pycocotools
pip3 install cython_bbox pandas xmltodict
3 准备数据集
[MOT17](https://motchallenge.net/),
[MOT20](https://motchallenge.net/),
[CrowdHuman](https://www.crowdhuman.org/),
[Cityperson](https://github.com/Zhongdao/Towards-Realtime-MOT/blob/master/DATASET_ZOO.md),
[ETHZ](https://github.com/Zhongdao/Towards-Realtime-MOT/blob/master/DATASET_ZOO.md),
[DanceTrack](https://github.com/DanceTrack/DanceTrack)
在ocsort主目录下新建文件夹datasets,数据集格式:
mot就是MOT17,
dancetrack数据集我没有准备,故后文dancetrack相关代码我没有实际运行过,指令是作者的readme里写的
3.2 预训练模型
OC_SORT/docs/MODEL_ZOO.md at master · noahcao/OC_SORT · GitHub
4 数据集处理
4.1 转换成coco格式
python3 tools/convert_crowdhuman_to_coco.py
python3 tools/convert_mot17_to_coco.py
python3 tools/convert_mot20_to_coco.py
python3 tools/convert_cityperson_to_coco.py
python3 tools/convert_ethz_to_coco.py
python3 tools/convert_dance_to_coco.py
DEBUG:
coco转换将33行Human的H改成小写
cityperson和ethz提示找不到datasets/data_path/citypersons.train'文件
ByteTrack/datasets/data_path at main · ifzhang/ByteTrack (github.com)
将这个文件夹保存到dataset下面,再转换即可
4.2 混合数据集(如果不自己训练yolox则可跳过此步)
4.1.1 混合消融
cd datasets
mkdir -p mix_mot_ch/annotations
cp mot/annotations/val_half.json mix_mot_ch/annotations/val_half.json
cp mot/annotations/test.json mix_mot_ch/annotations/test.json
cd mix_mot_ch
ln -s ../mot/train mot_train
ln -s ../crowdhuman/Crowdhuman_train crowdhuman_train
ln -s ../crowdhuman/Crowdhuman_val crowdhuman_val
cd ..
cd ..
python3 tools/mix_data_ablation.py
运行结果:
4.2 混合mot17训练
cd datasets
mkdir -p mix_det/annotations
cp mot/annotations/val_half.json mix_det/annotations/val_half.json
cp mot/annotations/test.json mix_det/annotations/test.json
cd mix_det
ln -s ../mot/train mot_train
ln -s ../crowdhuman/Crowdhuman_train crowdhuman_train
ln -s ../crowdhuman/Crowdhuman_val crowdhuman_val
ln -s ../Cityscapes cp_train
ln -s ../ETHZ ethz_train
cd ..
python3 tools/mix_data_test_mot17.py
运行结果:
4.3 混合mot20训练
cd datasets
mkdir -p mix_mot20_ch/annotations
cp MOT20/annotations/val_half.json mix_mot20_ch/annotations/val_half.json
cp MOT20/annotations/test.json mix_mot20_ch/annotations/test.json
cd mix_mot20_ch
ln -s ../MOT20/train mot20_train
ln -s ../crowdhuman/Crowdhuman_train crowdhuman_train
ln -s ../crowdhuman/Crowdhuman_val crowdhuman_val
cd ..
cd ..
python3 tools/mix_data_test_mot20.py
运行结果:
TODO:5 训练(如果不自己训练yolox则可跳过此步)
coco预训练模型:https://github.com/Megvii-BaseDetection/YOLOX/tree/0.1.0
在ocsort下新建目录pretrained,训练模型都可以放在这里
5.1 训练消融模型(mot17前一半+crowdhuman)
python3 tools/train.py -f exps/example/mot/yolox_x_ablation.py -d 8 -b 48 --fp16 -o -c pretrained/yolox_x.pth
5.2 训练mot17模型(mot17+crowdhuman+ethz+cityperson)
python3 tools/train.py -f exps/example/mot/yolox_x_mix_det.py -d 8 -b 48 --fp16 -o -c pretrained/yolox_x.pth
5.3 训练mot20模型(mot20+crowdhuman)
TODO:取消部分注释框然后再训练?
python3 tools/train.py -f exps/example/mot/yolox_x_mix_mot20_ch.py -d 8 -b 48 --fp16 -o -c pretrained/yolox_x.pth
5.4 训练dance模型(未运行)
python3 tools/train.py -f exps/example/dancetrack/yolox_x.py -d 8 -b 48 --fp16 -o -c pretrained/yolox_x.pth
5.5 训练自己的数据集(未运行)
1)准备自己的数据集
2)转换成coco格式,参考4.1的文件
3)编写数据集的exp文件,参考5.1-5.3,不要忘记修改Exp文件中的get_data_loader()和get_eval_loader。
4)以下指令进行训练
python3 tools/train.py -f exps/example/mot/your_exp_file.py -d 8 -b 48 --fp16 -o -c pretrained/yolox_x.pth
6 测试
测试代码是tools/run_ocsort.py (dancetrack是tools/run_ocsort_dance.py)
命令行参数在utils/args.py,可以查询各个参数的用法
--expn是保存的文件名,可自行更改,
--output_dir是保存路径,可自行更高,默认evaldata/trackers/mot_challenge
其他参数按需添加
6.1 Dancetrack val(未运行)
python tools/run_ocsort_dance.py -f exps/example/mot/yolox_dancetrack_val.py -c pretrained/bytetrack_dance_model.pth.tar -b 1 -d 1 --fp16 --fuse --expn $exp_name
6.2 Dancetrack test(未运行)
python tools/run_ocsort_dance.py -f exps/example/mot/yolox_dancetrack_test.py -c pretrained/bytetrack_dance_model.pth.tar -b 1 -d 1 --fp16 --fuse --test --expn $exp_name
6.3 MOT17 test
# MOT17
python3 tools/run_ocsort.py -f exps/example/mot/yolox_x_mix_det.py -c pretrained/ocsort_x_mot17.pth.tar -b 1 -d 1 --fp16 --fuse --expn oc_yolox_
mot17_test
结果:没有gt文件,需要将结果上传至motchallenge
文件保存在:
6.4 MOT20 test
注意mot20这个参数,否则就是测试mot17
# MOT20
python3 tools/run_ocsort.py -f exps/example/mot/yolox_x_mix_mot20_ch.py -c pretrained/ocsort_x_mot20.pth.tar -b 1 -d 1 --fp16 --fuse --track_thresh 0.4 --mot20 --expn oc_yolox_mot20_test
运行结果:同样需要上传到motchallenge
保存在:
6.5 MOT17 后half(消融)
python3 tools/run_ocsort.py -f exps/example/mot/yolox_x_ablation.py -c pretrained/ocsort_mot17_ablation.pth.tar -b 1 -d 1 --fp16 --fuse --expn oc_yolox_ablation
运行结果:
结果保存在:
TODO:如何测HOTA和FPS?
6.6 DEBUG
6.6.1 module 'numpy' has no attribute 'float'
参考运行python代码时遇到module ‘numpy‘ has no attribute ‘float‘解决方法_wongHome的博客-CSDN博客
pip uninstall numpy
pip install -U numpy==1.23.5
6.7 kitti test 和headtrack21 (未运行)
7 对现有结果离线插值
7.1 线性插值
result path 填之前保存的路径,这里以消融实验结果为例,save path填想要保存的新路径
#离线后处理插值
python3 tools/interpolation.py $result_path $save_path
#举个栗子
python3 tools/interpolation.py evaldata/trackers/mot_challenge/MOT17-val/oc_yolox_ablation_results/data evaldata/trackers/mot_challenge/MOT17-val/oc_yolox_ablation_results/interpolation
DEBUG:维度不对
在这一行报错,意思是seq的第二维是10,tra的第二维是7
检查之后发现72行for循环的最后一次迭代将tra的第二维变成了7,在这之前都是10的
暂时的解决办法:
去掉max_id的+1
TODO:(问题出在最后一次迭代,但我暂时没弄清为何id要加1,先这么改吧)
运行结果:
结果保存在save path下:
TODO:7.2 在插值基础上高斯回归
# 在现有插值的基础上使用线性回归
python3 tools/gp_interpolation.py $raw_results_path $linear_interp_path $save_path
#举个栗子,注意,是在已有插值的基础上使用
python3 tools/gp_interpolation.py evaldata/trackers/mot_challenge/MOT17-val/oc_yolox_ablation_results/data evaldata/trackers/mot_challenge/MOT17-val/oc_yolox_ablation_results/interpolation evaldata/trackers/mot_challenge/MOT17-val/oc_yolox_ablation_results/gp_interpolation
DEBUG:
1)no module named sklearn
pip install scikit-learn
2)Expected 2D array, got 1D array instead:array=[-0.47850949].
未解决
8 跟踪本地视频
python3 tools/demo_track.py -c pretrained/ocsort_x_mot17.pth.tar -b 1 -d 2 --fp16 --fuse --expn neu1 --demo_type video --path /home/extend/zhy/dataset/NEU/1.mp4 --save_result -f exps/example/mot/yolox_x_mix_det.py
结果保存在YOLOX_outputs下,但只有txt,没有视频