sort(simple online and realtime tracking)的组成

多目标跟踪有两种不同的实现方法:TBD(Tracking by detection)和DFT(Detection free tracking), 而sort方法则是TBD的代表,由目标检测+kalman filter + 匈牙利算法组成。另外,这里有个不错的人脸跟踪python实现,可以参考Face-Track-Detect-Extract

Kalman算法

sort中使用的kalman算法使用的是线性匀速模型,状态向量:
x⃗=[u,v,s,r,u˙,v˙,s˙]T\vec{x}=[u, v, s, r, \dot{u}, \dot{v}, \dot{s}]^T x=[u,v,s,r,u˙,v˙,s˙]T
这里的u,v是bbox的中心坐标, s为面积, r为横纵比,后面三个带点的为对应变量的速率,注意这里r是没有带点的,因为sort算法认为r是不变的常数。
kalman 算法的目的是融合测量值和估计值得到一个更好的测量值。
流程分为预测和更新两步。

  • 预测
    将状态向量x经过测量矩阵H的处理,变成一个修正了的测量值。

    3中,z为测量值(也就是我们要预测的值,比如前面提到的人脸位置和宽高信息),x为状态向量, 定义如前面所示,不仅包含我们感兴趣的人脸位置宽高信息,还有额外的速度信息等。其中HHH为观测矩阵,能够将包含冗余信息的x转换为我们要预测的值z,这个是一个固定的不需要更新的矩阵, vtv_tvt​为测量噪声。在预测阶段我们只要关心上面的公式即可,可以看出,只要我们获取xtx_txt​就可以算出z了,那么问题是xtx_txt​是怎么来的呢?那么可以看更新阶段的内容。
#mermaid-svg-WJ9yEMiqpNNbur5K {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WJ9yEMiqpNNbur5K .error-icon{fill:#552222;}#mermaid-svg-WJ9yEMiqpNNbur5K .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WJ9yEMiqpNNbur5K .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-WJ9yEMiqpNNbur5K .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WJ9yEMiqpNNbur5K .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WJ9yEMiqpNNbur5K .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WJ9yEMiqpNNbur5K .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WJ9yEMiqpNNbur5K .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WJ9yEMiqpNNbur5K .marker.cross{stroke:#333333;}#mermaid-svg-WJ9yEMiqpNNbur5K svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WJ9yEMiqpNNbur5K .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WJ9yEMiqpNNbur5K .cluster-label text{fill:#333;}#mermaid-svg-WJ9yEMiqpNNbur5K .cluster-label span{color:#333;}#mermaid-svg-WJ9yEMiqpNNbur5K .label text,#mermaid-svg-WJ9yEMiqpNNbur5K span{fill:#333;color:#333;}#mermaid-svg-WJ9yEMiqpNNbur5K .node rect,#mermaid-svg-WJ9yEMiqpNNbur5K .node circle,#mermaid-svg-WJ9yEMiqpNNbur5K .node ellipse,#mermaid-svg-WJ9yEMiqpNNbur5K .node polygon,#mermaid-svg-WJ9yEMiqpNNbur5K .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WJ9yEMiqpNNbur5K .node .label{text-align:center;}#mermaid-svg-WJ9yEMiqpNNbur5K .node.clickable{cursor:pointer;}#mermaid-svg-WJ9yEMiqpNNbur5K .arrowheadPath{fill:#333333;}#mermaid-svg-WJ9yEMiqpNNbur5K .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WJ9yEMiqpNNbur5K .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WJ9yEMiqpNNbur5K .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-WJ9yEMiqpNNbur5K .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-WJ9yEMiqpNNbur5K .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WJ9yEMiqpNNbur5K .cluster text{fill:#333;}#mermaid-svg-WJ9yEMiqpNNbur5K .cluster span{color:#333;}#mermaid-svg-WJ9yEMiqpNNbur5K div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WJ9yEMiqpNNbur5K :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

z
H. 测量矩阵,固定值
x. 状态向量
  • 更新
    每次更新时都要传入新的测量值z。涉及的公式:

可以看到,公式的左右两边分别是t和t-1,表示这一帧会关联上一帧的结果。

#mermaid-svg-H8SJy9Y0NvpPsrHl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-H8SJy9Y0NvpPsrHl .error-icon{fill:#552222;}#mermaid-svg-H8SJy9Y0NvpPsrHl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-H8SJy9Y0NvpPsrHl .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-H8SJy9Y0NvpPsrHl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-H8SJy9Y0NvpPsrHl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-H8SJy9Y0NvpPsrHl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-H8SJy9Y0NvpPsrHl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-H8SJy9Y0NvpPsrHl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-H8SJy9Y0NvpPsrHl .marker.cross{stroke:#333333;}#mermaid-svg-H8SJy9Y0NvpPsrHl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-H8SJy9Y0NvpPsrHl .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-H8SJy9Y0NvpPsrHl .cluster-label text{fill:#333;}#mermaid-svg-H8SJy9Y0NvpPsrHl .cluster-label span{color:#333;}#mermaid-svg-H8SJy9Y0NvpPsrHl .label text,#mermaid-svg-H8SJy9Y0NvpPsrHl span{fill:#333;color:#333;}#mermaid-svg-H8SJy9Y0NvpPsrHl .node rect,#mermaid-svg-H8SJy9Y0NvpPsrHl .node circle,#mermaid-svg-H8SJy9Y0NvpPsrHl .node ellipse,#mermaid-svg-H8SJy9Y0NvpPsrHl .node polygon,#mermaid-svg-H8SJy9Y0NvpPsrHl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-H8SJy9Y0NvpPsrHl .node .label{text-align:center;}#mermaid-svg-H8SJy9Y0NvpPsrHl .node.clickable{cursor:pointer;}#mermaid-svg-H8SJy9Y0NvpPsrHl .arrowheadPath{fill:#333333;}#mermaid-svg-H8SJy9Y0NvpPsrHl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-H8SJy9Y0NvpPsrHl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-H8SJy9Y0NvpPsrHl .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-H8SJy9Y0NvpPsrHl .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-H8SJy9Y0NvpPsrHl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-H8SJy9Y0NvpPsrHl .cluster text{fill:#333;}#mermaid-svg-H8SJy9Y0NvpPsrHl .cluster span{color:#333;}#mermaid-svg-H8SJy9Y0NvpPsrHl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-H8SJy9Y0NvpPsrHl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

x_t-1
F.状态转移矩阵
x_t-1_t-1
B.控制矩阵
x
z
H
K. kalman 增益
P.状态向量协方差
S.系统不确定性矩阵
P_t-1
R.测量噪音矩阵

公式5可以看出,x是通过K求的,这里K称为kalman增益,通过K融合了新的测量值ztz_tzt​和估计值xt∣t−1x_{t|t-1}xt∣t−1​.那么这里的待定参数K是怎么来的呢,可以看下公式6.

公式6中,通过P,H和S算出K,其中P为状态向量的斜方差矩阵,表示两个向量的差异程度,
Pt∣t−1=cov(xt−xt−1)P_{t|t-1}=cov(x_t - x_{t-1})Pt∣t−1​=cov(xt​−xt−1​), 不过经过推导,可以转换为与x无关的公式2. H为固定矩阵, S为系统不确定性矩阵,定义参考公式4.

公式4中, S为cov(zt−Hxt∣t−1)cov(z_t - H_{xt|t-1})cov(zt​−Hxt∣t−1​),不过经过推导可以转换为与x无关的公式4. R为测量噪音矩阵。

1中, 这里的F是状态转移矩阵,这个也是固定的不会更新的, B为控制矩阵,比如可以给汽车一个油门信号来控制汽车跑得更快,一般都是0矩阵,u为噪音。
2中,P为状态向量的斜方差矩阵,表示两个向量的差异程度,Pt∣t−1=cov(xt−xt−1)P_{t|t-1}=cov(x_t - x_{t-1})Pt∣t−1​=cov(xt​−xt−1​)
不过经过推导,可以转换为与x无关的公式2.
kalman_filter中kalman算法的流程:

while True:z = get_sensor_reading()f.predict()f.update(z)do_something_with_estimate (f.x)

kalman算法中的符号意义:

P:协方差矩阵
z:测量值
R:测量噪音矩阵
Q:处理测量噪音矩阵
F:状态转移矩阵
H:测试函数
K:kalman增益
S:系统不确定性

匈牙利算法

一种关联算法,匈牙利算法能将两个集合中的元素按照一定规则进行两两匹配。
匹配时需要构建一个损失矩阵, 匹配成功后的集合损失最小。

sort跟踪算法笔记相关推荐

  1. SORT跟踪算法的详细解释,不容错过

    转载自:https://blog.csdn.net/HaoBBNuanMM/article/details/85555547 SORT - SIMPLE ONLINE AND REALTIME TRA ...

  2. SORT 多目标跟踪算法笔记

    SORT 是一种简单的在线实时多目标跟踪算法.文章要点为: 以 IoU 作为前后帧间目标关系度量指标: 利用卡尔曼滤波器预测当前位置: 通过匈牙利算法关联检测框到目标: 应用试探期甄别虚检: 使用 F ...

  3. 算法笔记学习PAT甲级解题记录

    算法笔记学习记录 2019.06.26 float&&double 推荐全部使用double,注意区分scanf("%lf",&double1);与prin ...

  4. 相关滤波目标跟踪学习笔记(三)——KCF算法公式理解

    KCF算法特点: 1.通过循环移位产生了大量的虚拟样本: 2.利用循环矩阵可以在傅里叶域对角化的性质,大大减少了运算量,提高了运算速度: 3.核函数的运用,提高了分类器的性能: 4.采用HOG特征,相 ...

  5. 自动驾驶笔记-轨迹跟踪之①纯跟踪算法(Pure Pursuit)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.阿克曼转向模型 1.1 模型理解 1.2 模型表达 二.纯跟踪算法(Pure Pursuit) 2.1 算法理解 ...

  6. OpenCV 3 Tracking API目标跟踪学习笔记——定义、物体跟踪常用算法、demo

    今天开始接触目标跟踪 本文翻译自https://www.learnopencv.com/object-tracking-using-opencv-cpp-python/#opencv-tracking ...

  7. CMT跟踪算法学习笔记

    近期在学习目标跟踪算法的过程中发现,CMT算法的代码实测效果非常不错.对比之前学习过的SCM之类基于稀疏表示的跟踪算法,CMT的鲁棒性虽然不一定比之更高,但稀疏表示的方法普遍耗时很严重,导致其无法应用 ...

  8. 目标跟踪算法_Camshift函数(学习笔记)

    在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行op ...

  9. 数据结构与算法笔记 - 绪论

    数据结构与算法笔记 - 绪论 1. 什么是计算 2. 评判DSA优劣的参照(直尺) 3. 度量DSA性能的尺度(刻度) 4. DSA的性能度量的方法 5. DSA性能的设计及其优化 x1. 理论模型与 ...

最新文章

  1. 概率论快速学习03:概率公理补充
  2. list转datatable
  3. Windows下 Apache+PHP5+MYSQL5+phpmyadmin 规范安装
  4. Swagger 注解~用于模型
  5. MSDN WebCast网站全新改版
  6. Filter过滤器的生命周期
  7. 网络基础知识(面试基础)
  8. javaScript导出excel表格,数据量过大导出失败问题
  9. 2022年前端技术发展趋势
  10. 英伟达账号为什么登录不了_n卡的geforce experience登录不了怎么办?
  11. python爬虫:利用BeautifulSoup爬取链家深圳二手房首页的详细信息
  12. excel打开密码忘记了_行李箱密码忘记了怎么办?教你3招轻松打开
  13. 来看看你踩坑没有,新手做自媒体却没有收益?原因都在这5点
  14. 获取PC 服务器 可用的GPU
  15. 【闲】获取视频选集(每集)名字
  16. 【jquery】jquery $.fn $.fx是什么意思
  17. awb入门(4).颜色恒常方法(一)gamut mapping
  18. 鸟什么羊什么的成语(鸟什么羊什么四字成语大全)
  19. 解决utf-8‘ codec can‘t decode byte 0xca in position 0: invalid continuation byte
  20. IMU定位/位姿跟踪(IMU_localization or IMU_pose_tracking)

热门文章

  1. 直呼内行!阿里大佬离职带出内网专属“高并发系统设计”学习笔记
  2. 当前计算机主流的视频编辑方式,电脑视频剪辑软件排名 lightworks上榜 第一独创性强...
  3. js 计算误差的原因 及 加减乘除计算方法
  4. 模拟电路设计(19)---多谐波振荡器
  5. 这个网站安全吗?您的完整网站安全检查指南
  6. 自动配料称重计量传感器控制器设计与应用原理
  7. iOS应用程序工程文件以及启动流程
  8. 华硕主板破Linux密码,6种清除开机密码方法,总有一个适合你
  9. Word页码的设定(转)
  10. 第四次工业革命:区块链