主要转载自:https://www.cnblogs.com/liuboblog/p/12105473.html

分模块的代码参考:https://zhuanlan.zhihu.com/p/90835266?ivk_sa=1024320u

补充

  • 这个系列有两个算法,sort和deep sort,这里先介绍sort。sort的思路很简单,首先通过检测器例如faster rcnn把每一帧的物体检测出来,之后通过卡尔曼滤波器预测物体在下一帧的位置,将预测的位置与下一帧实际检测到的位置做IOU的计算,得到相邻两帧物体的相似度,最后利用匈牙利匹配得到相邻帧的对应id。由于这里只是计算框的重叠面积,因此如果两个物体发生遮挡,会出现id交换的情况,所以作者为了降低id交换,提出了deep sort算法。deep sort之所以可以把id交换降低45%,是因为它将面积匹配修改为了特征匹配。在匹配之前作者利用resnet50先将特征里取出来,由于一般情况下很少会遇到外观特征完全相同的两个物体,因此这种改进是有效的。deep dort由于很简单,因此没有在顶会上发表成功(发表在ICIP 2017),但是由于其可以保证在高速度的情况下的高准确度,所以广泛应用在了工程实践的过程中。
  • Deepsort是对于sort的思想,进行的改进算法。SORT算法使用简单的卡尔曼滤波处理逐帧数据的关联性以及使用匈牙利算法进行关联度量,这种简单的算法在高帧速率下获得了良好的性能。但由于SORT忽略了被检测物体的表面特征,因此只有在物体状态估计不确定性较低是才会准确,在Deep SORT中,使用了更加可靠的度量来代替关联度量,并使用CNN网络在大规模行人数据集进行训练,并提取特征,已增加网络对遗失和障碍的鲁棒性。

以下是转载内容:

目录

1、匈牙利算法

2、卡尔曼滤波

3、DeepSort工作流程


标跟踪任务的难度和复杂度要比分类和目标检测高不少,具有更大的挑战性。

目前主流的目标跟踪算法都是基于Tracking-by-Detection(检测加跟踪,使效果更稳定)策略,即基于目标检测的结果来进行目标跟踪。DeepSORT运用的就是这个策略,上面的视频是DeepSORT对人群进行跟踪的结果,每个bbox左上角的数字是用来标识某个人的唯一ID号。

这里就有个问题,视频中不同时刻的同一个人,位置发生了变化,那么是如何关联上的呢?答案就是匈牙利算法和卡尔曼滤波。匈牙利算法可以告诉我们当前帧的某个目标,是否与前一帧的某个目标相同。卡尔曼滤波可以基于目标前一时刻的位置,来预测当前时刻的位置,并且可以比传感器(在目标跟踪中即目标检测器,比如Yolo等)更准确的估计目标的位置。

1、匈牙利算法

首先,先介绍一下什么是分配问题(Assignment Problem):假设有N个人和N个任务,每个任务可以任意分配给不同的人,已知每个人完成每个任务要花费的代价不尽相同,那么如何分配可以使得总的代价最小。
举个例子,假设现在有3个任务,要分别分配给3个人,每个人完成各个任务所需代价矩阵(cost matrix)如下所示(这个代价可以是金钱、时间等等):

怎样才能找到一个最优分配,使得完成所有任务花费的代价最小呢?
匈牙利算法(又叫KM算法)就是用来解决分配问题的一种方法,它基于定理:

如果代价矩阵的某一行或某一列同时加上或减去某个数,则这个新的代价矩阵的最优分配仍然是原代价矩阵的最优分配。

算法步骤(假设矩阵为NxN方阵):
(1)对于矩阵的每一行,减去其中最小的元素
(2)对于矩阵的每一列,减去其中最小的元素
(3)用最少的水平线或垂直线覆盖矩阵中所有的(4)如果线的数量等于N,则找到了最优分配,算法结束,否则进入步骤5
(5)找到没有被任何线覆盖的最小元素,每个没被线覆盖的行减去这个元素,每个被线覆盖的列加上这个元素,返回步骤3

继续拿上面的例子做演示:

step1 每一行最小的元素分别为15、20、20,减去得到:

step2 每一列最小的元素分别为0、20、5,减去得到:

step3 用最少的水平线或垂直线覆盖所有的0,得到:

step4 线的数量为2,小于3,进入下一步;
step5 现在没被覆盖的最小元素是5,没被覆盖的行(第一和第二行)减去5,得到:

被覆盖的列(第一列)加上5,得到:

跳转到step3,用最少的水平线或垂直线覆盖所有的0,得到:

step4:线的数量为3,满足条件,算法结束。显然,将任务2分配给第1个人、任务1分配给第2个人、任务3分配给第3个人时,总的代价最小(0+0+0=0):

所以原矩阵的最小总代价为(40+20+25=85):

在DeepSORT中,匈牙利算法用来将前一帧中的跟踪框tracks与当前帧中的检测框detections进行关联,通过外观信息(appearance information)和马氏距离(Mahalanobis distance),或者IOU来计算代价矩阵。

2、卡尔曼滤波

卡尔曼滤波被广泛应用于无人机、自动驾驶、卫星导航等领域,简单来说,其作用就是基于传感器的测量值来更新预测值,以达到更精确的估计。

假设我们要跟踪小车的位置变化,如下图所示,蓝色的分布是卡尔曼滤波预测值,棕色的分布是传感器的测量值,灰色的分布就是预测值基于测量值更新后的最优估计。

在目标跟踪中,需要估计track的以下两个状态:

  • 均值(Mean):表示目标的位置信息,由bbox的中心坐标 (cx, cy),宽高比r,高h,以及各自的速度变化值组成,由8维向量表示为 x = [cx, cy, r, h, vx, vy, vr, vh],各个速度值初始化为0。
  • 协方差(Covariance ):表示目标位置信息的不确定性,由8x8的对角矩阵表示,矩阵中数字越大则表明不确定性越大,可以以任意值初始化。

卡尔曼滤波分为两个阶段:(1) 预测track在下一时刻的位置,(2) 基于detection来更新预测的位置。

预测

基于track在t-1时刻的状态来预测其在t时刻的状态。


在公式1中,x为track在t-1时刻的均值,F称为状态转移矩阵,该公式预测t时刻的x':

矩阵F中的dt是当前帧和前一帧之间的差,将等号右边的矩阵乘法展开,可以得到cx'=cx+dtvx,cy'=cy+dtvy...,所以这里的卡尔曼滤波是一个匀速模型(Constant Velocity Model)。

在公式2中,P为track在t-1时刻的协方差,Q为系统的噪声矩阵,代表整个系统的可靠程度,一般初始化为很小的值,该公式预测t时刻的P'。

更新

基于t时刻检测到的detection,校正与其关联的track的状态,得到一个更精确的结果。





  • 公式3:z为detection的均值向量,不包含速度变化值,即z=[cx, cy, r, h],H称为测量矩阵,它将track的均值向量x'映射到检测空间,该公式计算detection和track的均值误差;
  • 公式4:R为检测器的噪声矩阵,它是一个4x4的对角矩阵,对角线上的值分别为中心点两个坐标以及宽高的噪声,以任意值初始化,一般设置宽高的噪声大于中心点的噪声,该公式先将协方差矩阵P'映射到检测空间,然后再加上噪声矩阵R;
  • 公式5:计算卡尔曼增益K,卡尔曼增益用于估计误差的重要程度;
  • 公式6、公式7:得到更新后的均值向量x和协方差矩阵P。

3、DeepSort工作流程

DeepSORT对每一帧的处理流程如下:
检测器得到bbox → 生成detections → 卡尔曼滤波预测→ 使用匈牙利算法将预测后的tracks和当前帧中的detecions进行匹配(级联匹配和IOU匹配) → 卡尔曼滤波更新

Frame 0:检测器检测到了3个detections,当前没有任何tracks,将这3个detections初始化为tracks
Frame 1:检测器又检测到了3个detections,对于Frame 0中的tracks,先进行预测得到新的tracks,然后使用匈牙利算法将新的tracks与detections进行匹配,得到(track, detection)匹配对,最后用每对中的detection更新对应的track

deepsort原理快速弄懂——时效比最高的相关推荐

  1. 快速弄懂陌生领域是一项“赚钱”的能力

    大家好,我是Z哥. 有时候,我们被动的需要去了解一个新行业或者领域.比如,工作需要.投资需要等等. 在这个时候,你能不能快速弄懂一个行业的80%,成为一个内行就很关键了.毕竟时机可是很重要的. 比如, ...

  2. 数据库原理:了解范式(1NF、2NF、3NF、BCNF),做例题快速弄懂

    如果你基本定义都理解了,建议直接跳到例题部分. 本篇讲的是范式及例题,如果函数依赖还不知道,请移步至另外一篇讲函数依赖的博客: 数据库原理:通过例题弄懂函数依赖,并附带题目_Allow-er的博客-C ...

  3. halcon机器视觉算法原理与编程实战_快速弄懂机器学习里的集成算法:原理、框架与实战...

    作者:  博观厚积 简书专栏:https://www.jianshu.com/u/2f376f777ef1 1. 关于集成学习算法 集成学习算法,通俗地讲就是:三个臭皮匠,顶个诸葛亮,这在很多地方都有 ...

  4. 如何快速弄懂一个新模型_如何评估创业项目是否靠谱?一个新的模型 | 创创锦囊...

    要判断一个创业项目是否靠谱,是否能拥有广阔的市场和巨大的增长潜力,不仅是投资人关心的话题,更是每一个创业者在创业过程中不断思考的问题. 投资人关注大趋势.大机会,遵循自上而下的思维模型,在心仪的赛道上 ...

  5. 微信怎么群发消息给所有人?图文教学,快速弄懂

    ​微信作为很多小伙伴经常使用的工具,无论是学习.工作还是其他方面都会使用到.有些时候,需要将同一条消息发给通讯录里的大多数人,一条一条的转发太慢了,群发消息给所有人是个不错的办法.微信怎么群发消息给所 ...

  6. 快速弄懂内存字节对齐

    字节对齐有三原则: 1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员 ...

  7. 快速弄懂iPhone X 设计尺寸和适配

    iPhone X适配分析 被iPhone X刷了一天屏,到下午实在受不了各种假帖.标题写着"iPhone X 适配.指南.设计稿" 内容却是发布会回顾和手机介绍.索性自己去官网找素 ...

  8. 一图让你快速弄懂客户端渲染(CSR)与服务端渲染(SSR)

    作为前端开发的话,大多数情况下基本使用CSR来进行页面渲染,但是一定必不可免的会了解到服务端渲染(SSR).为了更好的了解到二者之间的区别我们要抛出一个老生常谈的面试点,浏览器输入一个url地址到页面 ...

  9. 轻松搞定PMP考试的计算题(二)快速弄懂折旧计算

    在PMP考试当中,也有部分的计算题,这让不少同学非常苦恼,其实只要掌握其中的公式,再做一些习题,计算题也是可以轻松应对的. 从今天起,本周一连五天,将给大家讲解计算方面的内容,讲解将从必考计算公式.折 ...

最新文章

  1. NGUI_Depth
  2. CDays–2 完成核心功能 CMD模块 Python基础教程 cmd cli
  3. LeetCode 1653. 使字符串平衡的最少删除次数(DP)
  4. arduino图形编程——ardublock
  5. Sengled Snap带摄像头的智能灯泡
  6. 掌握这些的Linux命令,你基本稳了
  7. Via OpenCv Snake算法
  8. VOT数据集自动/手动下载
  9. 一分钟详解智能快递柜锁控板方案和原理
  10. 无人驾驶-控制-阿克曼模型
  11. CSS3初级学习(二)背景图片叠加
  12. 深井泵房无人值守系统 泵站无人值守平台 智慧水务
  13. Android RecyclerView设置paddingBottom,scrollbars跟随滑动到底部
  14. 简谈 Intel altera 和 Xilinx 的 FPGA 区别
  15. 华为云数据库公网ip_企业数据上云必有一战,华为云12.12云数据库2折起
  16. 11月第3周新闻回顾:难忘的光棍节 辛劳的IT人
  17. 关键词排名点击软件优化所必须考虑的几点内容!
  18. 文件批量重命名编号怎么弄?
  19. ipqc的工作流程图_IPQC的工作流程是什么
  20. 【算法练习】MVP争夺战

热门文章

  1. EventBus的使用(一看就懂)
  2. Error:This Gradle plugin requires Studio 3.0 minimum
  3. JDK相关版本特性浏览
  4. 查看jks文件中的签名
  5. 搞事情 -- python之线程
  6. Activiti——流程执行历史记录(七)
  7. MySQL 学习笔记(2)— 通配符/正则表达/运算符
  8. 编写函数求两个整数 a 和 b 之间的较大值。要求不能使用if, while, switch, for, ?: 以 及任何的比较语句。...
  9. js字母大小写字母转换
  10. mysql 常用sql与命令