shell android 多框架编译ffmpeg_多目标跟踪 | FairMOT项目代码实战,谦称青铜,实为王者!...

9e9f1a92c92a3d228c92b526e33ffa3c.gif

笔者前两天看到一个多目标跟踪的开源项目,感觉非常有趣,于是,花费了一些时间,研究了一下,把代码跑了出来,特此记录,帮助有兴趣的读者。

多目标跟踪 | FairMOT:统一检测、重识别的多目标跟踪框架,全新Baseline

  • 论文地址:https://arxiv.org/abs/2004.01888
  • 项目地址:https://github.com/ifzhang/FairMOT

论文:A Simple Baseline for Multi-Object Tracking  作者来自华中科技大学和微软亚洲研究院,作者很谦虚的称该算法只是个 baseline,而且是 simple baseline!但是,它的几乎打败之前所有 State-of-the-art 算法。

a552587597ca3dfe68436340c4703f95.png

一起看看作者口中的 baseline 的实际效果吧:

9f619daf2957d82623cd007386c2f29a.gif

f76beca0bfc82c95371369bf75a78adf.gif

环境准备

基本开发环境

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

766377eb92adfbb9a0ae70dfdc0328bf.png

你可以 Fork 原始项目的代码,当然不介意的话也可以 Fork 我的,因为我整理了几个脚本,方便处理

# Fork 原始项目
# git clone https://github.com/ifzhang/FairMOT.git 
git https://github.com/FLyingLSJ/FairMOT.git

# 创建并激活虚拟环境
conda create -n FairMOT
conda activate FairMOT
# 安装必要包
conda install pytorch==1.2.0 torchvision==0.4.0 cudatoolkit=10.0 -c pytorch
cd FairMOT
pip install -r requirements.txt

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

pip install --upgrade cython
pip install -r requirements.txt # 再次运行
9a57b4c3d2eba25c3f85eb8f214b575a.png
# 编译项目
cd src/lib/models/networks/DCNv2
sh make.sh

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

018f992b506addcdd8b32a5b973fc919.png
附加环境

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

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

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

e301d879071bed70af4a36dc84f2f370.png
apt update
apt install ffmpeg
# 输入 y

# 安装验证
ffmpeg -version 
f6657fa75bf1c19ee7ce0ef1952bc977.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.)2DMOT15 和 MOT20

但是,为了测试,我们只使用到 2DMOT15 和 MOT20

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

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

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

# 下载并解压
cd ..
wget https://motchallenge.net/data/2DMOT2015.zip
mkdir dataset
cd dataset
mkdir MOT15
cd MOT15
mkdir labels_with_ids
mkdir labels_with_ids/train
unzip ../../2DMOT2015.zip 
mv 2DMOT2015 images



# 下面这个数据集可以根据情况选择下载
wget https://motchallenge.net/data/MOT20.zip
unzip MOT20.zip

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

dataset  
|——————  MOT15
|            |——————images
|            |        └——————train
|            |        └——————test
|            └——————labels_with_ids
|                     └——————train(empty)
|——————  MOT20
|            |——————images
|            |        └——————train
|            |        └——————test
|            └——————labels_with_ids
|                     └——————train(empty)

将 seqinfo 文件夹中的 *.ini 复制到  MOT15 对应的文件夹中,用以下脚本完成复制 seqinfo 信息可以在这里下载(以下两种方式均可):

  • Google:https://drive.google.com/open?id=1kJYySZy7wyETH4fKMzgJrYUrTfxKlN1w
  • Baidu 提取码:8o0w :https://pan.baidu.com/s/1zb5tBW7-YTzWOXpd9IzS0g

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

import shutil
import os
seqinfo_dir = "./seqinfo" # seqinfo 所在的路径
MOT15_dir = "./dataset/MOT15/images/train/" # 数据集所在的路径
seqs = ['ADL-Rundle-6', 'ETH-Bahnhof', 'KITTI-13', 'PETS09-S2L1', 'TUD-Stadtmitte', 'ADL-Rundle-8', 'KITTI-17',
        'ETH-Pedcross2', 'ETH-Sunnyday', 'TUD-Campus', 'Venice-2']

for seq in seqs:
    src = os.path.join(seqinfo_dir, seq, "seqinfo.ini")
    dst = os.path.join(MOT15_dir, seq, "seqinfo.ini")
    shutil.copy(src, dst)

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

seq_root = '/dli/dataset/MOT15/images/train'
label_root = '/dli/dataset/MOT15/labels_with_ids/train'

然后运行下面程序

cd src
python gen_labels_15.py

# 没有下载 MOT20 数据集的话就不需要运行下面这句
python gen_labels_20.py  

会生成一些 txt 文件

# 在 MOT15/labels_with_ids/train 文件夹下生成一些 txt 文件
└── train
    ├── ADL-Rundle-6
    │   └── img1
    ├── ADL-Rundle-8
    │   └── img1
    ├── ETH-Bahnhof
    │   └── img1
    ├── ETH-Pedcross2
    │   └── img1
    ├── ETH-Sunnyday
    │   └── img1
    ├── KITTI-13
    │   └── img1
    ├── KITTI-17
    │   └── img1
    ├── PETS09-S2L1
    │   └── img1
    ├── TUD-Campus
    │   └── img1
    ├── TUD-Stadtmitte
    │   └── img1
    └── Venice-2
        └── img1


# 在 MOT20/labels_with_ids/train 文件夹下生成一些 txt 文件
└── train
    ├── MOT20-01
    │   └── img1
    ├── MOT20-02
    │   └── img1
    ├── MOT20-03
    │   └── img1
    └── MOT20-05
        └── img1

生成的 txt 内容如下:

a122e61d1976e33da779f9ebb31da9e4.png

下载权重

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

FairMOT
   └——————models
           └——————ctdet_coco_dla_2x.pth
           └——————hrnetv2_w32_imagenet_pretrained.pth
           └——————hrnetv2_w18_imagenet_pretrained.pth

下面我使用的是直接用命令从谷歌网盘下载权重,如果你访问不了谷歌的话,那么下面的代码可能无法运行,我也将其做成了一个脚本文件 model_down_script.sh 。(后续考虑会下载下来,方便读者,或者联系我,帮你解决!)

# 在 FairMOT 创建一个 models 目录,用于保存权重文件
mkdir models 
cd models
wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=1pl_-ael8wERdUREEnaIfqOV_VF2bEVRT' -O ctdet_coco_dla_2x.pth

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" \
-O all_dla34.pth && rm -rf /tmp/cookies.txt

训练

修改部分文件的部分参数
  • 修改 src/lib/opts.py 文件中的 data_dir (数据集路径)和 data_dir (代表的意义就是你使用什么数据集进行训练,在 src/lib/cfg 文件夹下有 4 份 json 文件可供选择,其中 data.json 文件中包含的数据集更多)
595429793e83b890396e5a7d0d534e82.png
e8a9eeadd215851035096692237bcd4f.png
  • 修改 src/lib/cfg/*.json 文件中的部分参数(*.json 代表你使用了那份数据进行训练,我们这里选择的是 mot15.json ,所以就要修改 mot15.json 这份文件)

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

e21ca1fae6e01db438550dd8948b5825.png
训练

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

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

sh experiments/all_dla34.sh
1885956e891c777ecae7f959e3c6418a.png

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

26a6e1957ca43039706725ecb9ec4b67.png

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

测试 demo

cd src
python demo.py mot --load_model ../models/all_dla34.pth --conf_thres 0.4
9158e92c97c6c600f013fb03d8b0e62a.png

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

跟踪检测测试

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

可以修改 src/track.py 代码后面的几个参数,可以将对视频的预测每一帧保存起来,或者最终保存成一个视频,这个需要 FFmpeg 的支持下图 “图片” 是 “视频 " 打错字了

1c34df02b614cc2b8b41eb1cd9475b9e.png
1abebc2bd360d0788dd60fb2e2e05020.png

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

8cf2bf1214268cfcfd21393f465da0a8.png这里有个小问题,就是笔者将最后的视频结果从服务器下载到本地的时候,发现播放不了,这时,笔者认为应该是视频播放器解码的问题,换了播放器,就可以了。推荐  PotPlayer 播放器。
https://daumpotplayer.com/

待完成的工作

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

73cdf8b7e273718675bea3ade175d897.png

多目标跟踪 | FairMOT:统一检测、重识别的多目标跟踪框架,全新Baseline

b633d87192a1650641e79bad440fd18d.png

85ffcc6e49a75fdf5bda01790941aac5.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值