获取本项目的模型文件和数据集,请扫描下方二维码,回复关键词『MOT』获取
qrcode_for_gh_a047d112702c_344.jpgimage.png

环境准备

基本开发环境

笔者使用的环境是 Ubuntu16.04 系统,Tesla K80 显卡,Python3.7 环境
image.png

  1. # git clone https://github.com/ifzhang/FairMOT.git
  2. git clone https://github.com/FLyingLSJ/FairMOT.git
  3. # 创建并激活虚拟环境
  4. conda create -n FairMOT
  5. conda activate FairMOT
  6. # 安装必要包
  7. conda install pytorch==1.2.0 torchvision==0.4.0 cudatoolkit=10.0 -c pytorch
  8. cd FairMOT
  9. pip install -r requirements.txt

若出现下图这个错误,运行

  1. pip install --upgrade cython
  2. pip install -r requirements.txt # 再次运行

image.png

  1. # 编译项目
  2. cd src/lib/models/networks/DCNv2
  3. sh make.sh

出现下图的结果,就代表编译好了。
image.png

附加环境

如果你想要将结果生成视频,那么就就必须安装 FFmpeg

FFmpeg 是一个免费的开源命令行工具,用于对多媒体文件进行代码转换。它包含一组共享的音频和视频库,例如 libavcodec,libavformat 和 libavutil。使用 FFmpeg,可以在各种视频和音频格式之间转换,设置采样率以及调整视频大小。

FairMOT/src/track.py 文件中使用到了该命令。

image.png

  1. apt update
  2. apt install ffmpeg
  3. # 输入 y
  4. # 安装验证
  5. ffmpeg -version

image.png

https://www.ffmpeg.org/
https://www.ffmpeg.org/ffmpeg.html
https://linuxize.com/post/how-to-install-ffmpeg-on-ubuntu-18-04/

准备数据集

(原始项目所用到的数据集包括 Caltech Pedestrian, CityPersons, CUHK-SYSU, PRW, ETHZ, MOT17, MOT16.)2DMOT15MOT20

但是,为了测试,我们只使用到 2DMOT15 和 ~~[MOT20~~](https://motchallenge.net/data/MOT20/)

https://motchallenge.net/data/2D_MOT_2015/
https://motchallenge.net/data/MOT20/

我准备了一个 shell 脚本 MOT15_dataset_down.sh 可以帮你自动下载 MOT15 数据集,并且构造成所需要的目录结构,直接运行 sh MOT15_dataset_down.sh 即可。

  1. # 下载并解压
  2. cd ..
  3. wget https://motchallenge.net/data/2DMOT2015.zip
  4. mkdir dataset
  5. cd dataset
  6. mkdir MOT15
  7. cd MOT15
  8. mkdir labels_with_ids
  9. mkdir labels_with_ids/train
  10. unzip ../../2DMOT2015.zip
  11. mv 2DMOT2015 images
  12. # 下面这个数据集可以根据情况选择下载
  13. wget https://motchallenge.net/data/MOT20.zip
  14. unzip MOT20.zip

将数据集构建成以下结构, train(empty) 代表是一个空的文件夹

  1. dataset
  2. |—————— MOT15
  3. | |——————images
  4. | | └——————train
  5. | | └——————test
  6. | └——————labels_with_ids
  7. | └——————train(empty)
  8. |—————— MOT20
  9. | |——————images
  10. | | └——————train
  11. | | └——————test
  12. | └——————labels_with_ids
  13. | └——————train(empty)

将 seqinfo 文件夹中的 *.ini 复制到 MOT15 对应的文件夹中,用以下脚本完成复制
seqinfo 信息可以在这里下载 [Google] [Baidu],提取码:8o0w.

运行下面这个脚本,改变一下对应的路径即可:

  1. import shutil
  2. import os
  3. seqinfo_dir = "./seqinfo" # seqinfo 所在的路径
  4. MOT15_dir = "./dataset/MOT15/images/train/" # 数据集所在的路径
  5. seqs = ['ADL-Rundle-6', 'ETH-Bahnhof', 'KITTI-13', 'PETS09-S2L1', 'TUD-Stadtmitte', 'ADL-Rundle-8', 'KITTI-17',
  6. 'ETH-Pedcross2', 'ETH-Sunnyday', 'TUD-Campus', 'Venice-2']
  7. for seq in seqs:
  8. src = os.path.join(seqinfo_dir, seq, "seqinfo.ini")
  9. dst = os.path.join(MOT15_dir, seq, "seqinfo.ini")
  10. shutil.copy(src, dst)

修改 src/python gen_labels_15.py 文件中数据集的路径

  1. seq_root = '/dli/dataset/MOT15/images/train'
  2. label_root = '/dli/dataset/MOT15/labels_with_ids/train'

然后运行下面程序

  1. cd src
  2. python gen_labels_15.py
  3. # 没有下载 MOT20 数据集的话就不需要运行下面这句
  4. python gen_labels_20.py

会生成一些 txt 文件

  1. # 在 MOT15/labels_with_ids/train 文件夹下生成一些 txt 文件
  2. └── train
  3. ├── ADL-Rundle-6
  4. └── img1
  5. ├── ADL-Rundle-8
  6. └── img1
  7. ├── ETH-Bahnhof
  8. └── img1
  9. ├── ETH-Pedcross2
  10. └── img1
  11. ├── ETH-Sunnyday
  12. └── img1
  13. ├── KITTI-13
  14. └── img1
  15. ├── KITTI-17
  16. └── img1
  17. ├── PETS09-S2L1
  18. └── img1
  19. ├── TUD-Campus
  20. └── img1
  21. ├── TUD-Stadtmitte
  22. └── img1
  23. └── Venice-2
  24. └── img1
  25. # 在 MOT20/labels_with_ids/train 文件夹下生成一些 txt 文件
  26. └── train
  27. ├── MOT20-01
  28. └── img1
  29. ├── MOT20-02
  30. └── img1
  31. ├── MOT20-03
  32. └── img1
  33. └── MOT20-05
  34. └── img1

生成的 txt 内容如下:

image.png

下载权重

权重所在的目录结构如下:

  1. FairMOT
  2. └——————models
  3. └——————ctdet_coco_dla_2x.pth
  4. └——————hrnetv2_w32_imagenet_pretrained.pth
  5. └——————hrnetv2_w18_imagenet_pretrained.pth

下面我使用的是直接用命令从谷歌网盘下载权重,如果你访问不了谷歌的话,那么下面的代码可能无法运行,我也将其做成了一个脚本文件 model_down_script.sh

  1. # 在 FairMOT 创建一个 models 目录,用于保存权重文件
  2. mkdir models
  3. cd models
  4. wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=1pl_-ael8wERdUREEnaIfqOV_VF2bEVRT' -O ctdet_coco_dla_2x.pth
  5. wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1udpOPum8fJdoEQm6n0jsIgMMViOMFinu' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1udpOPum8fJdoEQm6n0jsIgMMViOMFinu" \
  6. -O all_dla34.pth && rm -rf /tmp/cookies.txt

训练

修改部分文件的部分参数

  • 修改 src/lib/opts.py 文件中的 data_dir (数据集路径)和 data_dir (代表的意义就是你使用什么数据集进行训练,在 src/lib/cfg 文件夹下有 4 份 json 文件可供选择,其中 data.json 文件中包含的数据集更多)

image.png

image.png

  • 修改 src/lib/cfg/*.json 文件中的部分参数(*.json 代表你使用了那份数据进行训练,我们这里选择的是 mot15.json ,所以就要修改 mot15.json 这份文件)

修改前后对比如下,其实就是修改 root 参数,改成我们的数据所在的路径就可以了。
image.png

训练

如果你只有单 GPU 的话,那么你需要修改 experiments/all_dla34.sh 中 GPU个数的参数,单 GPU 就是 0,多GPU 的话是 0 1 2 … 等

image.png
然后在 FairMOT (也就是项目路径下)运行以下程序即可开始训练

  1. sh experiments/all_dla34.sh

image.png

训练的时候可能会出现以下信息
image.png

这个可以忽略,我在原始项目提了一个 issue https://github.com/ifzhang/FairMOT/issues/36 作者解答说,这是因为训练的时候,只加载了部分的模型。

测试demo

  1. cd src
  2. python demo.py mot --load_model ../models/all_dla34.pth --conf_thres 0.4

image.png

可以在 FairMOT/results/frame 文件夹下查看视频每一帧的运行结果。

跟踪检测测试

  1. python track.py mot --load_model ../models/all_dla34.pth --conf_thres 0.6

可以修改 src/track.py 代码后面的几个参数,可以将对视频的预测每一帧保存起来,或者最终保存成一个视频,这个需要 FFmpeg 的支持

image.png

image.png

运行起来以后,可以在数据集下面生成一系列结果

image.png

待完成的工作

笔者只是将项目运行起来,但是对于论文中的细节还没有细看,而且这也是笔者第一做多目标跟踪,所以对其中的原理、数据集的格式等问题还不是很理解。

TO DO LIST:

  • 多目标跟踪数据集的理解
  • 论文阅读