多目标pso python_github


本文将简要描述实时多目标跟踪文章“Towards Real-Time Multi-Object Tracking”的内容,并谈谈笔者的思考。

多目标pso python_github_02



  1. Why

以往我们做跟踪的思路一般是:一个视频进来,每一帧做检测,检测的结果(也就是每个目标的包围盒)输入给跟踪模块,跟踪模块再调用一个模型,对每个目标的小图提取特征,将前一帧的所有目标的特征跟当前帧的做比对,找到前后两帧目标的对应关系(也即所谓的association过程)。

可以看出,通过这种方式,检测需要一个模型,目的是输入大图,输出目标小图,跟踪也需要一个模型,目的是输入目标小图,输出小图特征,再将前后两帧的小图特征做匹配。这一整套的耗时就是两个模型的推理耗时之和。

乍看,这样的作法似乎有冗余的地方?我们能不能有一个模型,输入大图,输出直接是目标包围盒和目标特征呢?

本篇文章提出的Joint Detection and Embedding (JDE)的模块就实现了这种方法,将两个模型融合成了一个:


多目标pso python_权重_03

上图中,(a)和(b)表示以往跟踪任务的做法,先是检测,然后把目标小图或目标feature map输出给跟踪模块,(c)表示文章提出的JDE模块的做法:直接输出目标和目标特征。

2. How

那么,这一功能是如何实现的呢?如下图:


多目标pso python_jde多目标_04


先看(a),主干网络采用了特征金字塔( Feature Pyramid Network 即 FPN)的结构,将多尺度的特征输出给prediction head;

图(b)就是prediction head的结构,feature map先是经历一些卷积操作,最后输出一个尺度为(6A+D)*H*W的dense prediction map(这是文章给它起的名字,实际上就是一堆feature map),其中,H和W为map的高宽,(6A+D)是map的channel数,A指anchor数,D指特征维数,这(6A+D)个map,2A用来做目标包围盒的分类loss(上图蓝色),4A用来做包围盒的回归loss(上图黄色),D用来输出特征(上图红色)loss,最后的总loss是将各loss加权求和。

这里要说明的是:

(1)包围盒的分类和回归做法实际上就是传统的检测模块,分类loss采用交叉熵,回归loss采用smooth L1,权重也跟检测一样;

(2)用来输出特征的那个loss用的是识别问题中常用的triplet loss(实际上文章的二作就是行人ReID的大牛~);

(3)最终各loss的权重采用的是各可学习的值,也就是网络自己决定用什么样的权重。

3. Summary & Discussion

文章标题是多目标跟踪,笔者的感觉更像是考虑到整个生产线,将检测、识别、跟踪融合到了一起,前段时间看新闻说,“2019年AI技术将开始全面落地”,通过这篇文章,是否可以看出,学术界已经开始慢慢关注工业界的实际生产,不再仅仅专注于刷榜,而是开始思考整个工业流程,将多个模块做融合了呢?

最后再结合实际生产,谈几点笔者认为的可投入使用的改动方案以及跟朋友交流得到的思考:

(1)triplet loss往往训练特别耗时,如果数据量重组,可以简单粗暴地改成普通交叉熵loss;

(2)文中多目标跟踪,只跟踪一个目标人别,就是行人,所以包围盒的分类只用了2A,也就是两类:行人和背景,如果想做人、车、等等,可以考虑多分类的方案;

(3)标注工作一定是非常费劲的,要区分每张图的每个目标,这里得考虑算法辅助标注;

(4)一个模型同时输出检测和识别的结果,也许训练会比较困难?

(5)自动学习loss的权重,可能实际并不好操作,网络可能最终会偏向到某一个loss上面去了。