MedianFlow 跟踪算法详解

在技术日新月异的时代,今天的技术可能在明天就会被新的技术取代,例如现在爆火的大模型。但目前看来,大模型还不能做到无所不能。

所以这篇博客还是来考古一下,写一下传统的跟踪算法。这里不是为了怼大模型而为了写一篇传统算法而写传统算法。只是觉得这个算法有个思想非常有意思,所以记录一下。

该算法在2010年发表在ICPR上,它主要是提出了Forward-Backward errors这种跟踪点的校验思想,使得跟踪点更为可靠。但博主这里认为,这篇文章其实还有一个比较有意思的一点,就是文章后面提出的MedianFlow跟踪算法,里面利用了中位数来估计待跟踪目标的位移和缩放尺度。接下来大概按照文章结构对该跟踪算法进行详细说明。

一、Forward-Backwark errors(FB errors)

从名字上可以看出,Forward-Backwark errors其实就是根据跟踪点前向和后向的结果来计算跟踪点的偏差。如下图所示:

在这里插入图片描述

从上图上半部分可以看出算法流程是这样的:

  1. 首先在第一帧输入的图片中定义需要跟踪的点,例如图中的点1和点2。为了这些点能够更稳定的被跟踪,通常会采用像Harris角点检测算法或者像FAST特征点检测算法来提取图片中特征明显的点
  2. 利用点跟踪算法,跟踪第一帧的点在第二帧的位置。通常这里会采用Lucas-Kanade稀疏光流算法
  3. 通过第2步获取到当前帧的点后,再将这些点再次利用点跟踪算法,计算出它们在前一帧的位置
  4. 利用第3步获得的前一帧的点的位置和第1步初始化的点的位置计算点的偏差,这样就得到了所谓的FB errors
  5. 根据FB errors就可以过滤掉位移较大的点,也就是跟踪失败的点

上图中的下半部分是采用符号的形式来表示这个流程:

假设目前有k的图片帧,用符号表示为 S = ( I t , I t + 1 . . . , I t + k ) S=(I_t, I_{t+1}...,I_{t+k}) S=(It,It+1...,It+k), x t x_t xt为在时刻t这一帧中待跟踪的点

  1. 采用某种点跟踪算法,跟踪点 x t x_t xt在后面k帧中的位置,这样就可以得到一条点 x t x_t xt的移动轨迹 T f k = ( x t , x t + 1 , . . . , x t + k ) T^{k}_{f}=(x_t, x_{t+1}, ..., x_{t+k}) Tfk=(xt,xt+1,...,xt+k)。这一步就称为Forward
  2. 同理根据相同的跟踪算法,将t+k帧中的跟踪点 x t + k x_{t+k} xt+k反向跟踪回第t帧,这样又可以得到一条移动轨迹 T b k = ( x ^ t , x ^ t + 1 , . . . , x ^ t + k ) T^{k}_{b}=(\hat{x}_t, \hat{x}_{t+1},...,\hat{x}_{t+k}) Tbk=(x^t,x^t+1,...,x^t+k),这里 x ^ t + k = x t + k \hat{x}_{t+k}=x_{t+k} x^t+k=xt+k
  3. FB errors用公式表示为 F B ( T f k ∣ S ) = d i s t a n c e ( T f k , T b k ) FB(T^{k}_{f}|S)=distance(T^{k}_{f}, T^{k}_{b}) FB(TfkS)=distance(Tfk,Tbk),文章为了简单定义 = d i s t a n c e ( T f k , T b k ) = ∣ ∣ x t − x ^ t ∣ ∣ =distance(T^{k}_{f}, T^{k}_{b})=||x_t-\hat{x}_t|| =distance(Tfk,Tbk)=∣∣xtx^t∣∣。也就是说FB errors文章采用初始点和反向跟踪到t帧的点之间的距离来表示

二、MedianFlow跟踪算法

MedianFlow算法是在利用上述提出的FB errors基础上获取可靠的跟踪点,进而来跟踪物体。MedianFlow跟踪算法如下图所示

在这里插入图片描述

如上图中上半部分所示,现在有两帧图片 I t I_t It I t + 1 I_{t+1} It+1,现在想利用MedianFlow算法来跟踪图中的小车。也即输入图片 I t I_t It I t + 1 I_{t+1} It+1,bounding box β t \beta_t βt,跟踪器输出 β t + 1 \beta_{t+1} βt+1

算法流程如上图中下半部分所示

  1. 根据输入的bounding box β t \beta_t βt,在框中初始化一些待跟踪点。这里的初始化方式跟第一部分所述有点不同。这里不采用角点或者特征点来初始化,而是简单的采用在框中间距相同的点作为待跟踪点
  2. 利用某种跟踪点的算法,例如Lucas-Kanade稀疏光流算法跟踪在t+1帧中点的位置
  3. 利用某种过滤算法将跟踪失败的点进行过滤,当然这里采用的就是FB errors将50%的误差较大的点进行过滤。文章其实还增加了一个叫NCC的方法(后面会做简单说明),也将误差较大的50%的点过滤掉。最终得到的点集就为跟踪到的点
  4. 利用跟踪到的点进行t+1帧bounding box的预估

上面流程中有两点需要待解释,一个是NCC,一个是bounding box的预估。下面分别做一下介绍

2.1 Normalized Cross Correlation(NCC)

从名字可以看出这里就是去求两个图之间的归一化互相关系数。

具体的对于输入的两个图 S 1 S_1 S1 S 2 S_2 S2,两张图的大小都为 m × n m\times n m×n,它们之间的互相关系数用公式表示如下:

ρ = 1 m n ∑ i = 1 m ∑ j = 1 n ( S 1 ( i , j ) − S ‾ 1 ) ( S 2 ( i , j ) − S ‾ 2 ) 1 m n ∑ i = 1 m ∑ j = 1 n ( S 1 ( i , j ) − S ‾ 1 ) 2 1 m n ∑ i = 1 m ∑ j = 1 n ( S 2 ( i , j ) − S ‾ 2 ) 2 \rho=\frac{\frac{1}{mn}\sum^m_{i=1}\sum^{n}_{j=1}(S_1(i,j)-\overline{S}_1)(S_2(i,j)-\overline{S}_2)}{\sqrt{\frac{1}{mn}\sum^m_{i=1}\sum^{n}_{j=1}(S_1(i,j)-\overline{S}_1)^2}\sqrt{\frac{1}{mn}\sum^m_{i=1}\sum^{n}_{j=1}(S_2(i,j)-\overline{S}_2)^2}} ρ=mn1i=1mj=1n(S1(i,j)S1)2 mn1i=1mj=1n(S2(i,j)S2)2 mn1i=1mj=1n(S1(i,j)S1)(S2(i,j)S2)

其中 x ‾ \overline{x} x表示求平均操作。

所以NCC操作就是两图的协方差除以两图标准差的结果,又称为Pearson相关系数。在MedianFlow两个图来源于对应跟踪点周边一定大小的图片块。

2.2 bounding box的预估

要预估一个bounding box,我们只需要预估出新的bounding box的位移以及对应的缩放尺寸。

我们通过下面两步来分别预估这两个参数

  1. 在得到可靠的跟踪点后,计算所有可靠的跟踪点的在x和y方向的移动位置,分别取x方向移动值的中位数和y方向移动值的中位数作为新的bounding box相对之前bounding box的位移
  2. 在得到可靠的跟踪点后,计算这些跟踪点两两之间的距离以及在t帧中对应点两两之间的距离,这些距离各自相除,出所有除数的中位数作为bounding box的缩放比例。

上面第2点可能有点绕,这里举个例子来说明。假设在t+1帧中,通过过滤得到的跟踪点有n个,那么对应t帧中也有n个。计算t+1帧中n个点的两两之间的距离,得到 n ∗ n n*n nn个值,同理t帧对应的点也可以得到 n ∗ n n*n nn个值,对应两帧中 n ∗ n n*n nn个值相除,得到 n ∗ n n*n nn个除数,这 n ∗ n n*n nn个除数取其中的中位数就为新的bounding box的缩放尺寸。

MedianFlow算法在opencv中是有开源代码的,可以路径https://github.com/opencv/opencv_contrib/blob/3.4/modules/tracking/src/trackerMedianFlow.cpp

参考:
  1. http://kahlan.eps.surrey.ac.uk/featurespace/tld/Publications/2010_icpr.pdf
  2. https://github.com/opencv/opencv_contrib/blob/3.4/modules/tracking/src/trackerMedianFlow.cpp

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/115492.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

路由器基础(八):策略路由配置

在实际网络应用中,策略路由也是一种重要的技术手段。尽管 在考试并不注重策略路由,但是实际上应用较多,建议考生除了掌握基本的静态路由协议IP route-static, 动态路由协议RIP 、OSPF的基础配置外,还要掌握如何配置策略路由。…

pytorch学习第五篇:NN与CNN代码实例

这篇文章详细介绍了全链接神经网络实现方法,以及卷积的实现方法。最后我们发现,卷积的实现方法与全链接大同小异,因为 torch 为我们做了很多工作,我们来看看这两个有什么区别。 我们使用 torch 框架来实现两种神经网络,来对图形进行分类。 NN 首先我们引入依赖包 impor…

linux下多机器ssh免密码登录配置

20,21,22,23等4台机器配置ssh免密登陆 确认sshd配置 查看/etc/ssh/sshd_config文件,确认如下配置没有被注释掉: AuthorizedKeysFile .ssh/authorized_keys每一台机器修改hosts配置主机名(可选) 执行ssh命令,如…

Marp: 将 Markdown 变为 PPT 式样的 VScode 插件

样例代码&#xff1a; --- marp: true size: 16:9 theme: default header: footer: --- <!-- _footer: Jia ming<br>Gansu University of Political Science and Law --> <!-- _backgroundColor: lightskyblue --> ## <!-- fit --> 笔记检验概述>…

COCOS2DX3.17.2 Android升级targetSDK30问题解决方案

一、luajit不兼容问题 不兼容版本&#xff1a;【2.1.0-bate2、2.1.0-bate3都存在异常】 出问题系统&#xff1a;Android11&#xff1b;Android10的系统部分机型有问题&#xff0c;部分机型正常 异常点1&#xff1a;c调用lua接口&#xff0c;pushObjiect的时候crash 异常点2…

解决方案中word中分节符的使用

解决方案中必不可少的两个“符号”&#xff0c;分页符&#xff0c;分节符 有了分节符&#xff0c;可以为不同节设置不同的页眉页脚、分栏格式、纸张大小及方向、页边距、不同节间采用不同的页码序号&#xff0c;常用的功能主要是把word下一次的由原来的“竖版”&#xff0c;变…

软件测试必备技能—接口测试

接口测试&#xff0c;其实并没有那么可怕&#xff0c;但是作为测试人员也是必不可少的技能。 接口分为&#xff1a;内部接口和外部接口。 内部接口&#xff1a;是浏览器与服务器的接口。这个很容易理解&#xff0c;web开发一般分前端和后端&#xff0c;前端开发人员用html/cs…

ModuleNotFoundError: No module named ‘paddle.fluid.incubate.fleet‘

在使用rocketqa的时候可能会遇到下面的问题&#xff1a; 问题&#xff1a; 解决方法&#xff1a; 这完全是paddlepaddle的问题。 在rocketqa/utils/optimization.py出现下面的语句&#xff0c;这个时候直接把出错的注释掉就可以&#xff0c;因为它完全没有用到。&#xff08;…

2.Spark的工作与架构原理

概述 目标&#xff1a; spark的工作原理spark数据处理通用流程rdd 什么是rddrdd 的特点 spark架构 spark架构相关进程spark架构原理 spark的工作原理 spark 的工作原理&#xff0c;如下图 图中中间部分是spark集群&#xff0c;也可以是基于 yarn 的&#xff0c;图上可以…

数字频带传输——多进制数字调制及MATLAB仿真

文章目录 前言一、MASK&#xff08;一维信号&#xff09;1、MASK 简介2、MASK 矢量表示 二、MPSK&#xff08;二维信号&#xff09;1、MPSK 简介2、MPSK 矢量表示 三、MQAM&#xff08;二维信号&#xff09;1、MQAM 简介2、MQAM 信号的矢量表示 四、正交 MFSK&#xff08;M维信…

两个字符串的最小ASCII删除和

题目描述 给定两个字符串s1 和 s2&#xff0c;返回 使两个字符串相等所需删除字符的 ASCII 值的最小和 。 示例 思路 这个题的解法一和最长公共子序列的解法大致相同&#xff0c;我们可以在此代码基础上稍微更改即可。 代码如下 解法一 public int minimumDeleteSum1(Stri…

InSAR 数据处理误差的减弱措施

目录 1.失相干误差2.基线误差3.DEM 误差4.大气误差5.解缠误差 6.地理编码误差 本文由CSDN点云侠原创&#xff0c;爬虫网站请自重。 InSAR 获取的干涉相位通常可表示为&#xff1a; φ i n t ( η , ξ ) φ d e f ( η , ξ ) φ a t m ( η , ξ ) φ t o p o ( η , ξ )…

TCP 协议

文章目录 协议格式1面向连接:1.1三次握手&#xff08;建立连接&#xff09;1.2包序管理1.2四次挥手&#xff08;断开连接&#xff09; 2可靠传输:一。保证数据可靠有序的到达对端:确认应答机制超时重传机制 二。提高传输效率:1.提升自身发送数据量滑动窗口机制 rwnd滑动窗口丢包…

对5款驱动软件个人感受

1、基于安全考虑&#xff0c;个人建议优先选用官网可以下载到的版本。 2、拓展&#xff1a; 在线版&#xff1a;普通版&#xff0c;需要安装&#xff0c;且只能联网使用。离线版&#xff1a;把所有驱动都包含在内&#xff0c;无需联网也能安装驱动&#xff0c;一般从大小就可区…

教你怎么用Python每天自动给女朋友免费发短信

今天的教程就是教大家怎么发送免费短信给女朋友。 发送短信接口&#xff0c;我知道的常见的有两个平台&#xff0c;一个是 twilio&#xff0c;可以免费发短信 500 条&#xff0c;可发任意信息&#xff0c;一个是腾讯云&#xff0c;可以免费发短信 100 条&#xff0c;需要申请短…

直播间讨论区需要WebSocket,简单了解下

由于 http 存在一个明显的弊端&#xff08;消息只能有客户端推送到服务器端&#xff0c;而服务器端不能主动推送到客户端&#xff09;&#xff0c;导致如果服务器如果有连续的变化&#xff0c;这时只能使用轮询&#xff0c;而轮询效率过低&#xff0c;并不适合。于是 WebSocket…

联想服务器-HTTP boot安装Linux系统

HTTP boot与传统PXE的主要差异 HTTP不再需要使用UDP协议的tftp服务&#xff08;连接不可靠、不支持大文件&#xff09;了&#xff0c;只需要dhcp 和http 两个服务即可&#xff0c;支持较稳定的大文件传输。 实验环境 ThinkSystem服务器SR650V2 SR660V2 通过HTTP boot安装Cen…

【C++基础知识学习笔记】精华版(复习专用)

常用语法 函数重载(Overload) 规则: 函数名相同 参数个数不同、参数类型不同、参数顺序不同 注意: 返回值类型与函数重载无关 调用函数时,实参的隐式类型转换可能会产生二义性 默认参数 C++ 允许函数设置默认参数,在调用时可以根据情况省略实参。规则如下: 默认参数只能…

Aop自定义注解生成日志

Aop自定义注解生成日志 1.编写自定义注解 //表示此注解可以标注在方法上 Target(ElementType.METHOD) //运行时生效 Retention(RetentionPolicy.RUNTIME) public interface OpetionLog {//定义一个变量&#xff0c;可以接收参数String value() default "";}2.Cont…

【移远QuecPython】EC800M物联网开发板的内置GNSS定位的恶性BUG(目前没有完全的解决方案)

【移远QuecPython】EC800M物联网开发板的内置GNSS定位的恶性BUG&#xff08;目前没有完全的解决方案&#xff09; GNSS配置如下&#xff1a; 【移远QuecPython】EC800M物联网开发板的内置GNSS定位获取&#xff08;北斗、GPS和GNSS&#xff09; 测试视频&#xff08;包括BUG复…