Fast Visual Tracking via Dense Spatio-Temporal Context Lear

2023-12-23 10:08

本文主要是介绍Fast Visual Tracking via Dense Spatio-Temporal Context Lear,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文再续,书接一上回。话说上一次我们讲到了Correlation Filter tracker的老祖宗MOSSE,那么接下来就让我们看看如何对其进一步地优化改良。这次要谈的论文是我们国内Zhang Kaihua团队在ECCV 2014上发表的STC trackerFast Visual Tracking via Dense Spatio-Temporal Context Learning。相信做跟踪的人对他们团队应该是比较熟悉的了,如Compressive Tracking就是他们的杰作之一。今天要讲的这篇论文的Matlab源代码已经放出了,链接如下:

http://www4.comp.polyu.edu.hk/~cslzhang/STC/STC.htm

首先来看看他们的跟踪算法示意图:


 

看到更新方式,快速傅里叶变换什么的是不是很眼熟?没错,这篇论文其实与MOSSE方法基本是一致的,那么其创新点在哪了?笔者觉得,其创新点在于点,一是以密集时空环境上下文Dense Spatio-Temporal Context作为卖点;二是以概率论的方式包装了CF类方法;三是在模板更新的时候把尺度变换也考虑了进去。

那么什么是密集的时空上下文呢?其最朴素的思想可以用下面这个图来表达:在跟踪的过程中,由于目标外观变换以及遮挡等原因的影响,仅仅跟踪目标本身的话比较困难,但如果把目标周围区域也考虑进去(空间上下文),那么能够在一定程度降低跟踪失败的风险。以图中的例子来说,就是假如仅仅考虑目标本身(黄色框),那么在发生遮挡的时候,就难以实现跟踪,但是如果把周围的像素也考虑进去(红色框),那么就可以借助周围环境来确定目标所在。这是一帧的情况,假如考虑多帧情况的话,就对应产生了时空上下文。那么dense的说法从何而来?这一点我们后面再解释。

 

主要思想已经有了,下面我们来看如何用概率论进行理论支持。假设 xR2 为某一位置, o 为需要跟踪的目标,首先定义如下的confident map用来衡量目标在 x 出现的可能性:

然后定义 Xc={c(z)=(I(z),z)|zΩc(x)}  为上下文特征集合,其中 x 代表目标位置, Ωc(x) 表示在 x 点处两倍于跟踪目标大小的邻域, I(z) z 点的图像灰度值。这一公式的意思其实就是把 x 作为中心点,取其周围两倍于目标框大小的图像作为特征,如上图的红色框。然后我们利用全概率公式,以上下文特征为中间量把(1)展开:

       

(2)分为两项,左项 P(x|c(z),o) 代表给定目标和其上下文特征,目标出现在 x 点的概率,右项 P(c(z)|o) 则是某一上下文特征属于目标的概率,也就是目标的上下文概率先验了。右项的作用在于选择与目标外观相似的上下文,左项的作用在于在选择外观相似的同时也考虑出现在某一位置是否合理,避免跟踪过程中的漂移现象。

然后,因为在第一帧的时候,目标的位置是已知的,那么这时候就可以构造一个confident map,使其满足距离目标越近可能性越高的性质。作者定义confident map的具体值为如公式(3)所示:

         其中 b,α,β 都是经验常数。回想下上一篇我们讲的MOSSE方法,其实 m(x) 就是我们讲的响应输出,只不过MOSSE直接用一个高斯形状,而这里用的是如(3)式的定义。另外,之前谈到本篇论文标题中有一“dense”字样,体现在哪呢?就体现在这个地方,对于目标附近每一个点,都可以用(3)式对其概率值进行定义。传统的跟踪方法可能是随机采样或者隔段采样,而这里因为每一个点都进行了概率值的定义所以就是dense了。但其实目前所有的CF类方法都是dense sampling,而且这一个概念的明确提出应该是出现在后面会讲的CSK方法之中,只不过本篇作者将其改头换面成dense spatio temporal learning了。OK,闲话少说,接下来我们继续求解 P(x|c(z),o) P(c(z)|o)

         先看 P(c(z)|o) ,是目标的上下文先验,定义为如下所示:

                                                                                         

         其就是目标框附近的图像灰度值的高斯加权和(换成其它特征也可以,后面另有一篇论文会谈到)。然后 P(c(z)|o) 有了, m(x) 有了,就可以带入(2)求解 P(x|c(z),o) 了,套路还是跟MOSSE一样,首先将 m(x) 表示为 P(x|c(z),o) P(c(z)|o) 的卷积(互相关),通过FFT转到频率域变为点乘运算,运算完后逆变换回空间域,找响应最大值的地方作为目标位置。 具体就是,设 P(x|c(z),o)=hsc(xz) ,得

                                                          

        文中作者还强调了 hsc(xz) 是目标的位置与其环境上下文之间相对距离和方向的衡量,并且不是对称函数。

另外,根据卷积 fg 的定义:

                                                       

所以(5)式其实就是一卷积( x 就是 t m z 就是 τ n ),根据卷积定理:

                                                           

MOSSE不同的是,STC在训练模板、即计算 hsc(xz) 时只需考虑第一帧。而在跟踪过程中, hsc(xz) 的更新方式如同MOSSE,这里不再叙述。另外论文中还给出了目标框大小更新的方法,其基本思路可以这样理解:看到公式(5) m(x)=zΩc(x)hsc(xz)I(z)ωσ(zx)  ,其中 ωσ(zx) 不就是高斯形状的权重嘛,稍微不恰当的说,就是用个圆圈把目标包住嘛,圈内的权重高,圈外的相反,那么假如目标的size变大了,我们就把这个圈的范围扩大就好了,而扩大或者缩小就靠调整 σ  的值就ok了。具体推导过程如下:

 

假设从 t t+1 帧,目标的大小乘以了一个 s 倍,也即相当于坐标系的刻度乘以了 s 倍,为方便起见,我们设 (u,v)=(sx,sy) ,然后,不失一般性的,假设目标在第 t 帧的坐标为(0,0),则有

                                                        


                                                                                          

         然后,从 t 变到 t+1 帧,我们把变化后的坐标对应起来,因此有 hsct(u/s,v/s)hsct+1(u,v) It(u/s,v/s)It+1(u,v) ,所以式(9)继续变为

                                                              

 假设从 t t+1 帧是缩小的,因此跟缩放示意图一样,我们将(10)的积分看成两部分组合成的:一是红框部分( t+1 帧的上下文框大小),二是蓝框( t 帧的上下文框大小)减去红框的部分,用公式表达就是:

                                                               


  

因此就有

                                       

剩下的就是一些技巧了,比如用滑动窗口取 s 的平均之类的,具体可以看作者的原文。这篇文章大概就到这里了。总结一下,其中比较吸引笔者的其中的概率论支撑和后面的窗口大小的变化部分,至于环境上下文部分的话,换用其它特征应该可以作进一步扩展以提高算法的鲁棒性。作者主页上有源代码,有兴趣的可以下载来跑跑看,运行时留意下像woman这类视频吧

这篇关于Fast Visual Tracking via Dense Spatio-Temporal Context Lear的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/527652

相关文章

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

context:component-scan使用说明!

<!-- 使用annotation 自动注册bean, 并保证@Required、@Autowired的属性被注入 --> <context:component-scan base-package="com.yuanls"/> 在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @Controll

React的context学习总结

context是干什么的?为什么会存在这么一个东西? context字面意思是上下文,在react中存在是为了解决深层次组件传值困难的问题 这里涉及到组件的传值问题,大体商说分三总:兄弟间传值(通过父组件),父往子传值(通过props),子往父传(props函数回调),这是基础的传值问题,但是如果组件嵌套的太深,那么传值就变的非常麻烦,为了解决这样的问题才产生了context  这是cont

每天一道面试题(2):fail-safe 机制与 fail-fast 机制分别有什么作用?

当谈论Java集合的 fail-fast 和 fail-safe 机制时,涉及的是在集合被并发修改时的行为和处理方式。这些机制对保证程序的正确性和稳定性非常重要,尤其是在多线程环境中。 1. Fail-Fast 机制 定义: Fail-fast 机制的核心是在检测到集合在遍历过程中被修改时,立即抛出 ConcurrentModificationException 异常,从而中断迭代操作。这种

【Visual Studio 报错】未加载 wntdll.pdb(一种可行的解决办法)

调试程序时,会出现下面这个报错 分析原因: 出现未加载 wntdll.pdb 报错大概率是你的指针使用错误 ,比如使用野指针、越界访问、或者堆区空间释放方式错误等。 这里以 堆区空间释放方式错误 为例子 1、堆区开辟的数组空间使用 delete 释放 // 堆区开辟的数组空间使用 delete 释放int* p = new int[10];delete p; 正

查看Excel 中的 Visual Basic 代码,要先设置excel选项

1. excel VB的简单介绍 百度安全验证 2.excel选项设置 excel表格中在选项->自定义功能区域,选择开发工具,visual baisc/查看代码,即可看到代码。 3.excel已经设置,可以直接查看

[VC] Visual Studio中读写权限冲突

前置场景: 编译没有报错,但是运行提示 内存异常: 情景1: 如下代码运行异常,提示引发了异常:写入权限冲突。*** 是 0xFFFFF..... char* str = (char*)malloc(10);str[0] = 0x30;  解决方案:要包含头文件<stdlib.h>  情景2: 在FileA文件调用FileB文件的函数,但是在FileA中却没有声明该B函数的原型

解决Visual C++ 中相互包含头文件的问题

在编MFC应用程序时,经常会遇到头文件相互包含的问题,很是苦恼,于是便求助于强大的CSDN,得到如下答案:   方法一:利用友元类   我一共有两个类,由于要在两个类的头文件里互相应用对方,所以,在每一个类的头文件里面现包含另一个类的头文件,然后在该类的定义中声明另一个类为友元类。如下:    #include "B.h"      class CA: public CDialog

KDD 2024 时空数据(Spatio-temporal) ADS论文总结

2024 KDD( ACM SIGKDD Conference on Knowledge Discovery and Data Mining, 知识发现和数据挖掘会议)在2024年8月25日-29日在西班牙巴塞罗那举行。 本文总结了KDD2024有关时空数据(Spatial-temporal) 的相关论文,如有疏漏,欢迎大家补充。 时空数据Topic:时空(交通)预测, 生成,拥堵预测,定价预

兔子--The method setLatestEventInfo(Context, CharSequence, CharSequence, PendingIntent) from the type

notification.setLatestEventInfo(context, title, message, pendingIntent);     不建议使用 低于API Level 11版本,也就是Android 2.3.3以下的系统中,setLatestEventInfo()函数是唯一的实现方法。  Intent  intent = new Intent(