MOSSE(DSST)类和KCF类中滤波器推导结果不一致的解释
首先要说明,DSST//BMVC2014类的CF是从MOSSE//CVPR2010模型得到的,是从信号的角度考虑问题,该类CF直接认为信号和滤波器之间存在相关的关系
而KCF//TPAMI2015类CF并不默认这一关系,其依然是从传统的分类器(岭回归)角度去求解一个分类器的权重,但是由于其强制训练样本为循环矩阵形式,从而内嵌了权重w有一个类似于相关滤波器的作用。
这两种是不同的,所以最后的检测结果实际上也是有区别的。
而MOSSE(DSST)类的滤波器h和KCF类的权重w实际上有比较大的区别。因为在检测时,在时域上一个是相关运算,另一个是内积运算。明显不同。
问题的提出:
有两个问题:
问题1: 在DSST和KCF论文最后的推导上,他们的结果是不一样的,DSST是将最后分子中的共轭放在理想输出G上,如上面的公式,而KCF中的共轭是放在特征上的。
DSST:
KCF:
同样的差异也存在于CSR-DCF//CVPR2017,该论文最后的推导依然是把共轭放在输出G上的
问题2: 在DSST中的代码处理,却和论文是不一样的,他依然是在特征上取的共轭,而不是在G上取共轭,给人的感觉是DSST的代码实现似乎和KCF论文推导是一致的
问题的解释:
下面分几点来做该问题解释
1、公式推导是否正确
(1)MOSSE、DSST等论文的推导结果是没有问题
以DSST为例,推导如下:
这里H是/hat{h}的二维形式,同理F和G也是/hat{f}和/hat{g}的二维形式,都是在频域中的表示。
可以看出和DSST论文的结论一致。
另外,MOSSE论文中的结论如下:
DSST论文中的结论如上文,这两个滤波器,一个表示成H^*,一个表示H,实际上是一回事,都是正确的
(2)KCF公式的推导是有问题,这个已经被讨论过了:
https://zhuanlan.zhihu.com/p/26766703
所以正确的KCF中的权重w(这里不适合在KCF中也把这个叫做滤波器)应该是:
所以问题1中,DSST和KCF推导之间的差异实际上并不是原问题中共轭是放在特征上还是放在理想输出上的差异
而是MOSSE类的滤波器表示上是有共轭的,而且共轭是放在特征上,而KCF的w则根本就不应该有共轭符号
2、两者之间的差异
在MOSSE(DSST)类出现滤波器h的公式表示和KCF的权重w有差异是很正常的。
因为KCF的w并不是滤波器,它和MOSSE类的滤波器h有本质上的区别
在检测实现上,MOSSE是在时域上由滤波器h和检测样本z的相关运算计算得到,即,f(z)=h★z,这里的★表示相关,而在频域上相当于去计算/hat{h}^*/hat{z}。(注意:相关不是卷积,所以转换到频域,相当去前者频域的共轭和后者频域去做元素乘)
而KCF的检测,在时域上由样本z构成的循环矩阵和权重w做乘法计算得到的,即f(z)=Zw,这里循环矩阵的构成形式如KCF论文所示(注意:并不是所有文献对循环矩阵都是按照KCF论文这样按行构成的,诸如CFNET//CVPR2017这样的论文就是按列构成循环矩阵)
综上,这两者出现差异是没有问题的
3、DSST论文中的代码实现是否有误
DSST的代码实现是没有问题,分两步讨论:
(1)在滤波器学习上,我们可以看出,其代码实现是这样的
所以,其代码中所学的滤波器,并不是学习了/hat{h},而是学习了/hat{h}^*
(2)在检测上,按照前面的讨论,应该是在频域计算滤波器共轭和样本之间的元素乘。所以DSST的代码实现直接将这里学习的hf(PS.实际上是conj(hf))去和样本的频域xf做元素乘
所以,代码的实现和论文中公式的推导完全一致,没有问题
4、按这两个模型实现的tracker性能是否有差异
按照上面的讨论,MOSSE(DSST)类的滤波器和KCF中的权重根本就不一样,那么最后的检测结果是否一样,换言之,对于一个CF类的tracker,如果我们应用MOSSE模型或者KCF模型去实现tracker的基本核心组件,实验结果上是否一样?
回答是一样的,尽管从出发点上,两者的区别很大,但是归根到最后检测上,即f(z)的表达完全一样(如果不考虑其时态更新方式,详见第6点的讨论),证明如下:
首先我们对于DSST和KCF分别计算其f(z),这里的KCF我们首先以/alpha去计算(P.S.CF论文关于对偶变量/alpha的推导都是正确的)
可以看出两者是完全一样的,另外这里需要说明一点的是,相关运算是不能前后交换的,即h★z≠z★h,不过它们在频域上也就差一个共轭。
所以我们在MOSSE(DSST)类CF是去计算f(z)=h★z还是f(z)=z★h是有区别的。
但是这个在代码实现上是没有差异的,因为代码实现上都是会在response的计算时加一个real。共轭复数的实部是相同的。
另外对于KCF,如果我们按照w去推导,也依然能推导出相同的结果
5、其他的一些讨论
在其他的一些文献中也有类似的问题,以CVPR2017的oral:CA为例 (这里感谢和@YuKi的交流)
Mueller M, Smith N, Ghanem B. Context-Aware Correlation Filter Tracking// CVPR 2017.
该论文在推导实现上都是从KCF模型出发的,但是其代码实现上确实按照MOSSE(DSST)模型去实现的,从上面第4点的讨论,这样的实现是没有问题的。
首先说明CA论文中的推导的错误,在其supplemenary material中,有以下的推导过程:
这里的推导出现了好几处错误,正确的推导如下:
可以看到这里/hat{w}的的形式和KCF中的/hat{w}是完全类似的。
而在其代码实现上(以DCF-CA为例)
滤波器学习:
可以看着这里学习的就是滤波器,而不是像KCF类那样的权重
检测输出:
其代码实现和DSST的实现完全一致。
6.时态更新方式上的一些讨论
在第4点的讨论上,我们认为KCF和MOSSE的最终实验性能完全一样,是不考虑滤波器的更新的。实际上由于采取了不同的时态更新方式,他们之间还是有细微的区别的
KCF:对alpha和x同时采用时态插值更新
MOSSE:对分子和分母同时采用时态插值更新
CA:对分子和分母相除得到的滤波器采用时态插值更新
具体结果如下:
OVER
MOSSE(DSST)类和KCF类中滤波器推导结果不一致的解释的更多相关文章
- C++类成员在内存中的存储及对齐方式
前言:数据对齐的基本理论参见文章:http://www.cnblogs.com/MyBlog-Richard/articles/5993448.html 一.空类的大小 C++中空类的大小是1,这是因 ...
- JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式
相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...
- java中的 FileWriter类 和 FileReader类的一些基本用法
1,FileWriter类(字符输出流类) |--用来写入字符文件的便捷类.此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的.要自己指定这些值,可以先在 FileOutputStream ...
- 22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表。然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。
22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法sh ...
- 实体类在Windows程序中的高级应用--------------------》》心境是一种境界。
一.事务 我们在大家学到这,或多或少对事务都有一些理解了.今天的我也对事务有了更深一层的理解对我来说,我想与大家一起分享一下. 解析: 1.ADO.NET提供了事务处理功能 2.C#中开启事务 3.在 ...
- 【转载】C++中的基类与派生类
转自:http://www.cnblogs.com/sujz/articles/2044365.html 派生类的继承方式总结: 继承方式 说明 public 基类的public和protected的 ...
- Effective Objective-C 2.0 — 第二条:类的头文件中尽量少引入其他头文件
第二条:类的头文件中尽量少引入其他头文件 使用向前声明(forward declaring) @class EOCEmployer 1, 将引入头文件的实际尽量延后,只在确有需要时才引入,这样就可以减 ...
- (转) C++中基类和派生类之间的同名函数的重载问题
下面有关派生类与基类中存在同名函数 fn: class A { public: void fn() {} void fn(int a) {} }; class B : public A { publi ...
- c++中基类与派生类中隐含的this指针的分析
先不要看结果,看一下你是否真正了解了this指针? #include<iostream> using namespace std; class Parent{ public: int x; ...
随机推荐
- 关于 数据库 my_slq的 安装及其卸载
安装的时候 注意事项 自定后 根据电脑的系统版本 选择32 或者64 然后选择→方向键 密码默认是123456 或者 123123 查看装的数据库是否安装好了 如何完全卸载 mysql 数据库 ...
- shell脚本实例-case实现jumpserver跳板机
1,先通过ssh-keygen 生成公钥,然后将公钥推送到各个主机ssh-copy-id web1|ip 2简单的代码实现 #!/usr/bin/bash trap "" HUP ...
- python 递归函数操作方法
.递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知.使用递归解决问题,思路清晰,代码少.但是在主流 ...
- python 1-10考试
- 2017第八届蓝桥杯C/C++ B组省赛-等差素数列
标题:等差素数列 2,3,5,7,11,13,....是素数序列. 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列. 上边的数列公差为30,长度为6. 200 ...
- Buildroot lmbench使用方法
/********************************************************************** * Buildroot lmbench使用方法 * 说明 ...
- Samsung_tiny4412(驱动笔记05)----Makefile,open,read,write,lseek,poll,ioctl,fasync
/*********************************************************************************** * * Makefile,op ...
- MySQL中增删改操作
一.插入数据 1.1使用insert...values语句插入 语法:insert [low_priority|delayed|high_priority](优先级问题,ow_priority是指 ...
- conda创建虚拟环境
可能自己常常会遇到一个这样的问题,自己服务器安装的是python2,但是现在有的代码是基于python3的啊 怎么办?自己将代码转换成python2的呗,是的,我曾经就这样做过,但是真的是很鸡肋 更有 ...
- C语言常用命令
## 基本流程:创建——编辑——编译.链接——执行$ touch 1-1.c$ vim 1-1.c # include <stdio.h>int main{printf("... ...