上一篇文章大概给大家介绍了一下多目标跟踪MOT的一些基础知识。初次了解还是从经典的算法开始,SORT和DeepSORT是多目标跟踪中两个知名度比较高的算法。DeepSORT是原团队对SORT的改进版本。这个算法也是开源的,github上有一个DeepSORT+Yolov3的项目,初入多目标坑的小伙伴应该在搜代码的时候都看到过。

本文将带大家解析一下SORT和DeepSORT的基本思路,废话不多说,开始正题。

1. SORT

首先要说明一点,现在多目标跟踪算法的效果,与目标检测的结果息息相关,因为主流的多目标跟踪算法都是TBD(Tracking-by-Detecton)策略,这里不再赘述,有不懂的小伙伴可以去看本系列的第一篇领域综述。

在SORT论文的一开始,作者也强调了这一点。作者原话是说通过更换检测器可以将跟踪效果提高18.9个百分点。说这点是为了给做工程的朋友们一个启示,用再花哨的跟踪算法,有时也不如用针对性训练的检测器来的效果好。在实际工程中,为了提高多目标跟踪的效果,可以从检测器处多做文章(比如多收集一些对应任务的数据来训练检测器),跟踪的效果也会水涨船高。

抛开检测不谈,我们来看SORT的跟踪思路。SORT采用的是在线跟踪的方式,不使用未来帧的信息。在保持100fps以上的帧率的同时,也获得了较高的MOTA(在当时16年的结果中)。

SORT与当时State-of-the-art跟踪器效果对比

SORT的贡献主要有三:

  • 利用强大的CNN检测器的检测结果来进行多目标跟踪

  • 使用基于卡尔曼滤波(Kalman filter)与匈牙利算法(Hungarian algorithm)的方法来进行跟踪

  • 开源了代码,为MOT领域提供一个新的baseline

现在看可能不觉得有什么,思路并不新奇也并不复杂,但在当时还是作出很大的贡献的,有力推动了MOT的发展。

其中卡尔曼滤波(Kalman filter)与匈牙利算法(Hungarian algorithm)对于大家来说可能是两个新名词。先简单解释一下,匈牙利算法是一种寻找二分图的最大匹配的算法,在多目标跟踪问题中可以简单理解为寻找前后两帧的若干目标的匹配最优解的一种算法。而卡尔曼滤波可以看作是一种运动模型,用来对目标的轨迹进行预测,并且使用确信度较高的跟踪结果进行预测结果的修正,是控制领域常用的一种算法。有熟悉无人机飞控算法的小伙伴应该会对这个感到很亲切。

可能初次接触的小伙伴还不是非常理解,不用担心,我们存疑,后文还会更详细地讲到。


至于具体的跟踪过程,SORT在以往二阶段匹配算法的基础上进行了创新。

以往二阶段匹配算法是先使用匈牙利算法对相邻帧之间的目标进行匹配生成很多tracklets,之后使用这些tracklets进行二次匹配,以解决遮挡等问题引起的轨迹中断。但这种二阶段匹配方式弊端也很明显,因为这种方式先天地要求必须以Offline的方法进行跟踪,而无法做到Online。

SORT将这种二阶段匹配算法改进为了一阶段方法,并且可以在线跟踪。

具体而言,SORT引入了线性速度模型与卡尔曼滤波来进行位置预测,先进行位置预测然后再进行匹配。在无合适匹配检测框的情况下,运动模型的结果可以用来预测物体的位置。

在数据关联的阶段,SORT使用的依旧是匈牙利算法逐帧关联,不过作者还引入了IOU(Interp-Over-Union)距离。不过SORT用的是带权重的匈牙利算法,其实就是KM算法,用IOU距离作为权重(也叫cost矩阵)。作者代码里是直接用sklearn的linear_assignment实现,有兴趣的话也可以去看看这个函数的实现细节,我下一篇文章会稍微讲讲匈牙利算法和KM算法的原理,这里不懂可以先存疑。并且当IOU小于一定数值时,不认为是同一个目标,理论基础是视频中两帧之间物体移动不会过多。作者在代码中选取的阈值是0.3,

不过我个人在实验中对这一点不是完全认同,虽然两帧之间物体的运动量可能不大,但由于检测器自身检测结果不准,目标框偏移可能较大,还是会造成IOU过小,这时再用论文中这种方法,会导致误判引起的轨迹中断。具体案例在MOT的DPM检测结果中很容易找到。说起DPM,真可谓是MOT研究者的梦魇了……衷心希望MOT19能抛弃DPM。

2. DeepSORT

一年之后,原团队发布了SORT的续作DeepSORT,到现在都有很多人在用这个跟踪器。

MOT数据集中的典型遮挡情形

整体框架没有大改,还是延续了卡尔曼滤波加匈牙利算法的思路,在这个基础上增加了Deep Association Metric。Deep Association Metric其实就是在大型行人重识别网络上学习的一个行人鉴别网络。目的是区分出不同的行人。个人感觉很类似于典型的行人重识别网络。输出行人图片,输出一组向量,通过比对两个向量之间的距离,来判断两副输入图片是否是同一个行人。

此外还加入了外观信息(Appearance Information)以实现较长时间遮挡的目标跟踪。

跟踪流程延续上作,在卡尔曼滤波的预测结果的基础上,继续使用了匈牙利算法进行目标分配,但在这个过程中加入了运动信息和外观信息。这个说起来简单,实现起来比较复杂,感兴趣的读者可以细看论文和代码。在这里就不赘述了。

其他方面没有太多变化,还是使用了标准的卡尔曼滤波和固定速度模型等来进行预测。

最终实现了较好的跟踪效果(MOTA61.4@MOT16),并且能够实时运行(40FPS)。


代码和论文可以在以下链接获得。感谢SpyderXu的整理。

DeepSort : Wojke, Nicolai and Bewley, Alex and Paulus, Dietrich "Simple Online and Realtime Tracking with a Deep Association Metric" [paper] [code] In ICIP 2017
Sort : Bewley, Alex and Ge, Zongyuan and Ott, Lionel and Ramos, Fabio and Upcroft, Ben "Simple Online and Realtime Tracking"[paper] [code] In ICIP 2016.
github.com/SpyderXu/mul

这一篇和大家一起过了一遍SORT这个经典的算法,虽然思路并不复杂,但还是值得细细品味的。当然其中还有几点概念没有说清,下一篇将带大家继续深入。

下一篇将着重讲解MOT中常用的一些算法,比如匈牙利算法和KM算法等。打下一个良好的基础,才能走的更远,朋友们下篇见!

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑
获取本站知识星球优惠券,复制链接直接打开:
https://t.zsxq.com/qFiUFMV
本站qq群704220115。加入微信群请扫码:

【CV】带你入门多目标跟踪(二)SORTDeepSORT相关推荐

  1. 带你入门多目标跟踪(一)领域概述

    现在从目标检测和单目标跟踪方向转来做多目标跟踪的小伙伴应该有不少,但由于多目标跟踪任务本身的复杂性,导致其入门会比目标检测与单目标跟踪困难不少.再加上论文分布在各个会议,开源代码较少,都造成了多目标跟 ...

  2. 【CV】带你入门多目标跟踪(一)领域概述

    现在从目标检测和单目标跟踪方向转来做多目标跟踪的小伙伴应该有不少,但由于多目标跟踪任务本身的复杂性,导致其入门会比目标检测与单目标跟踪困难不少.再加上论文分布在各个会议,开源代码较少,都造成了多目标跟 ...

  3. 轨迹跟踪主要方法_带你入门多目标跟踪(一)领域概述

    现在从目标检测和单目标跟踪方向转来做多目标跟踪的小伙伴应该有不少,但由于多目标跟踪任务本身的复杂性,导致其入门会比目标检测与单目标跟踪困难不少.再加上论文分布在各个会议,开源代码较少,都造成了多目标跟 ...

  4. 带你入门多目标跟踪(二)SORTDeepSORT

    上一篇文章大概给大家介绍了一下多目标跟踪MOT的一些基础知识.初次了解还是从经典的算法开始,SORT和DeepSORT是多目标跟踪中两个知名度比较高的算法.DeepSORT是原团队对SORT的改进版本 ...

  5. 带你入门多目标跟踪(三)匈牙利算法KM算法

    匈牙利算法(Hungarian Algorithm)与KM算法(Kuhn-Munkres Algorithm)是做多目标跟踪的小伙伴很容易在论文中见到的两种算法.他们都是用来解决多目标跟踪中的数据关联 ...

  6. 带你入门多目标跟踪(四)外观模型 Appearance Model

    行人跟踪作为MOT中的一个典型的问题,十分具有研究价值,本系列文章以行人跟踪为例来介绍MOT. 在讲解外观模型问题前,首先需要对MOT的各个部件有一个大概的了解.在设计一种MOT算法时,有两点问题需要 ...

  7. OpenVino入门(二)

    OpenVino入门(二) 一.OpenVino简介 1.1OpenVino是什么 1.2 OpenVino的网络加速原理 1.2.1Linear Operations Fusing 1.2.2 数据 ...

  8. 15分钟带你入门sklearn与机器学习——分类算法篇

    作者 | 何从庆 本文转载自AI算法之心(ID:AIHeartForYou) [导读]众所周知,Scikit-learn(以前称为scikits.learn)是一个用于Python编程语言的免费软件机 ...

  9. 运动控制器编程_快速入门 | 篇二十一:运动控制器ZHMI组态编程简介一

    点击上方"正运动小助手",随时关注新动态! 运动控制器ZHMI组态编程简介一  今天我们来学习一下,运动控制器的ZHMI组态编程简介.本文主要从产品概述.控制器连接触摸屏使用.HM ...

最新文章

  1. Context.getExternalFilesDir()和Context.getExternalCacheDir()
  2. 使用PHPExcel将数据导出至Excel
  3. 无盘服务器pnp,深入解读无盘PNP方法,无盘系统PNP并不神秘
  4. linux命令ifconfig
  5. 几处早莺争暖树下一句是什么,几处早莺争暖树后一句
  6. SpringBoot中通过重写WebMvcConfigurer的方法配置静态资源映射实现图片上传后返回网络Url
  7. cs专业学生对于家乡的思考
  8. 对Visual Studio 示例:Fitch and Mather 7.0的研究初步
  9. Qt 中事件与处理
  10. MybatisPlus学习(四)条件构造器Wrapper方法详解
  11. 配置oracle网络连接命令,配置oracle网络环境
  12. PHP为什么empty可以访问不存在的索引
  13. 云原生数据仓库TPC-H第一背后的Laser引擎大揭秘
  14. 硬干货!一张图弄清楚在ESXi下如何进行网络抓包
  15. Vissim 中动态交通路径选择
  16. 机器学习笔记(五)回归模型
  17. eclipse,myeclipse,Tomcat进行JSP开发配置
  18. 如何用计算机装手机系统,如何使用手机给电脑安装Windows10系统?
  19. C++ string类常用方法
  20. 【Java】根据生日计算年龄

热门文章

  1. 【转载】c语言中的可变参数编程
  2. GridView绑定数据源 绑定DataReader /DataSet /DataTable
  3. LINQ字符拼接的AND和OR操作
  4. Discuz!NT 模板机制分析(转)
  5. nodejs安装和卸载
  6. MySQL之事务管理
  7. 【secureCRT】如何在secureCRT上设置常用的快捷输出按钮栏
  8. struts2总体介绍
  9. Javascript——说说js的调试
  10. 【Python 2 到 3 系列】 print 是函数