GSDT使用图神经网络进行联合目标检测和多目标跟踪
论文下载
原作展示
MOT排名
开源地址
介绍
对象检测和数据关联是多对象跟踪 (MOT) 系统中的关键组件。尽管这两个组件相互依赖,但先前的工作通常单独设计检测和数据关联模块,这些模块以不同的目标进行训练。因此,我们无法反向传播梯度并优化整个 MOT 系统,从而导致次优性能。为了解决这个问题,最近的工作在联合 MOT 框架下同时优化检测和数据关联模块,这在两个模块中都显示出改进的性能。在这项工作中,我们提出了一种基于图神经网络 (GNN) 的联合 MOT 方法的新实例。关键思想是 GNN 可以在空间和时间域中对可变大小对象之间的关系进行建模,这对于学习用于检测和数据关联的判别特征至关重要。通过对 MOT15/16/17/20 数据集的大量实验,我们证明了我们基于 GNN 的联合 MOT 方法的有效性,并展示了检测和 MOT 任务的最新性能。
电脑一台
显卡(我用的是1060Ti)
首先去把项目源文件下载下来
在完成第二步基础环境的搭建后,开始搭建它独有环境。
虚拟环境
创建一个新的anaconda虚拟环境
conda create -n (自定义环境名) python=3.6
激活进入虚拟环境:
source activate(自定义环境名)
安装依赖包
在项目源文件中整合了几个依赖包文件requirements.txt、 install_pyg.sh,我们只需要进入对应文件夹下指令安装就可以了
# 一些基本的库
pip install requirements.txt
# PyTorch Geometric包,用于搭建图神经网络架构
bash install_pyg.sh <CUDA_version>
##是指CUDA=$1读取的参数
##比如cuda安装的是10.1版本那就把改成cu101
#安装DCNv2网络架构
cd ./src/lib/models/networks/DCNv2
bash make.sh
#要自动将输出跟踪生成为视频,请安装 ffmpeg
conda install ffmpeg=4.2.2
#当你出现下面的错误1时,请安装cudatoolkit10.0,非必须
conda install cudatoolkit=10.0
数据准备
准备2DMOT15和MOT20数据,可以直接从MOT Challenge网站下载(进不去的话可能需要梯子 ),每个目录格式如下:
MOT15
|——————images(新建文件夹)
| └——————train(移入)
| └——————test(移入)
└——————labels_with_ids(新建文件夹)
└——————train(新建文件夹)
MOT20
|——————images(新建文件夹)
| └——————train(移入)
| └——————test(移入)
└——————labels_with_ids(新建文件夹)
└——————train(新建文件夹)
还要去相应地更改 src/gen_labels_15.py 和 src/gen_labels_20.py 中的 seq_root 和 label_root,并运行:
cd src
python gen_labels_15.py
python gen_labels_20.py
按照以下链接下载并保存每个数据集的预训练权重(进不去的话可能需要梯子 ):
数据集 | 模型 |
---|---|
2DMOT15 | 地址 |
MOT17 | 地址 |
MOT20 | 地址 |
ImportError: libcudart.so.10.0: cannot open shared object file: No such file or directory
解决:
问题产生原因:
运行环境
cuda 10.1
cuda 与某些包版本不对应
方案:
在确定你的cuda安装正确,环境与动态链接库都没问题的情况下,可以尝试进行以下操作。 cudatoolkit是一个动态库,主要包含的是支持已经编译好的 CUDA 程序运行的相关的动态链接库。
(由于我是在anaconda虚拟环境中建立工程,因此只需要)
conda install cudatoolkit=10.0
PermissionError: [Errno 13] Permission denied: ‘/data’
解决:
问题产生原因:
osp.join拼接的文件路径不对,MOT文件放置的地方不对。文件路径问题比较常见举此一例,其他的也是如此处理。
方案:
检查代码可得,代码要求MOT文件放在src/data/下,另外src/lib/cfg/mot15.json文件的"root":“/data"应该改为"root”:“./data”。之后就可以成功下载dla34-ba72cf86.pth预训练文件了
#运行以下命令之一来重现我们论文在 MOT 挑战赛上的跟踪性能。
cd ./experiments
track_gnn_mot_AGNNConv_RoIAlign_mot15.sh <path/to/model_mot15>
track_gnn_mot_AGNNConv_RoIAlign_mot17.sh <path/to/model_mot17>
track_gnn_mot_AGNNConv_RoIAlign_mot20.sh <path/to/model_mot20>
根据作者github最后一段的命令,开始我们的复现:
cd ./experiments
track_gnn_mot_AGNNConv_RoIAlign_mot15.sh <path/to/model_mot15>
track_gnn_mot_AGNNConv_RoIAlign_mot17.sh <path/to/model_mot17>
track_gnn_mot_AGNNConv_RoIAlign_mot20.sh <path/to/model_mot20>
根据.sh命令打开track_gnn.py,直奔if __name__ == '__main__'
。
如果.sh命令后面接的是model_mot15模型地址的话,那么将会执行这段:
if opt.test_mot15:
# 三引号是指多行字符输入可直接回车,不需要转行字符\n
seqs_str = '''ADL-Rundle-1
ADL-Rundle-3
AVG-TownCentre
ETH-Crossing
ETH-Jelmoli
ETH-Linthescher
KITTI-16
KITTI-19
PETS09-S2L2
TUD-Crossing
Venice-1'''
config_path = './lib/cfg/mot15.json'
# json.load()是用来读取文件的,即,将文件打开然后就可以直接读取
data_config = json.load(open(config_path))
seq2conf = data_config['test_confs']
data_root = f"{data_config['root']}/MOT15/images/test"
det_root = f"{data_config['root']}/MOT15/images/test"
读取并修改了.json文件,然后继续执行:
if not opt.eval_from_file_only:
main(opt, seq2conf,
data_root=data_root,
det_root=det_root,
seqs=seqs,
exp_name=opt.exp_name,
show_image=False,
save_images=opt.save_images,
save_videos=opt.save_videos)
带着它的参数们进入main()
1、首先输出一下代码信息
2、拼接路径