本文是CSK与KCF算法推导的第四篇,主要介绍将前面推导采用的一维情况推广到二维。

  • CSK与KCF算法推导(一)——DFT、相关运算和循环卷积
  • CSK与KCF算法推导(二)——带核函数的岭回归问题求解
  • CSK与KCF算法推导(三)——算法主体部分推导
  • (本文)CSK与KCF算法推导(四)——从一维推广到二维
  • CSK与KCF算法推导(五)——具体实现细节
  • CSK与KCF算法推导(六)——HOG特征提取与多通道计算

  KCF全文的推导都是建立在一维样本上的,但是实际使用却是用于二维的图像。那么它是怎样从一维推广到二维的呢?本文参照一维推导的思路给出二维的推导过程。

矩阵内积与矩阵的迹

  二维的推导,需要定义一些新的运算。AAA和BBB都是m×nm\times nm×n的矩阵,数学上有trace(ATB){\rm trace}(A^TB)trace(ATB)表示矩阵对应位置元素相乘并求和的结果。参考向量内积,为了方便起见,定义两个矩阵的内积<A,B><A,B><A,B>,AAA和BBB都是m×nm\times nm×n的矩阵。它们两个的内积就是矩阵中对应位置的数相乘再相加。
<A,B>:=trace(ATB)< A,B > : = {\mathop{\rm trace}\nolimits} ({A^T}B)<A,B>:=trace(ATB)

矩阵阵列

  用[⋅][\cdot][⋅]表示矩阵阵列,矩阵阵列是一个四维的结构,就是矩阵里面嵌套矩阵。[⋅]uv[\cdot]_{uv}[⋅]uv​表示矩阵阵列中的每个矩阵。

矩阵阵列和矩阵的乘法

  定义矩阵阵列和矩阵的乘法,用∘\circ∘表示。如下图所示:

  一个矩阵阵列[A][A][A]和一个矩阵BBB相乘,就是矩阵阵列[A][A][A]中的每个矩阵和BBB内积,然后结果放到对应的位置,得到一个新的矩阵。
[A]∘B=CC(x,y)=<[A]xy,B>[A]\circ B=C\ \ \ \ C(x,y)=<[A]_{xy},B>[A]∘B=C    C(x,y)=<[A]xy​,B>

矩阵阵列和矩阵阵列的乘法

  矩阵阵列和矩阵的乘法,类似于矩阵和列向量的乘法。自然,类似于矩阵和矩阵的乘法,我们也能有矩阵阵列和矩阵阵列的乘法。

  矩阵阵列[A][A][A]依次和矩阵阵列[B][B][B]中的每个矩阵相乘,然后就能得到一个矩阵阵列[C][C][C]
[A]∘[B]uv=[C]uv[A]\circ [B]_{uv}=[C]_{uv}[A]∘[B]uv​=[C]uv​

矩阵分裂

  两个列向量的哈达玛积可以写成对角矩阵和列向量相乘的形式,两个矩阵的哈达玛积也可以写成一个矩阵阵列和矩阵相乘的形式。

  定义split()\rm split()split()函数,它可以将一个矩阵中的所有元素分散到矩阵阵列中的每个矩阵中去。类似于diag()\rm diag()diag()的过程。

单位矩阵阵列


  单位矩阵阵列指的是满足以下条件的矩阵阵列:
[I]uv(x,y)={1,x=u&y=v0,else{\left[ I \right]_{uv}}(x,y) = \left\{ \begin{matrix} 1,\;x = u\;\& \;y = v\\ 0,\;else \end{matrix} \right.[I]uv​(x,y)={1,x=u&y=v0,else​

二维DFT的矩阵阵列表示

  首先给出二维DFT运算的式子。有一个矩阵m×n的矩阵A(x,y)A(x,y)A(x,y),它的二维DFT结果为A^(u,v)\hat A(u,v)A^(u,v)。
A^(u,v)=∑y=0M−1∑x=0N−1A(x,y)WNuxWMvy\hat A(u,v) = \sum\limits_{y = 0}^{M - 1} {\sum\limits_{x = 0}^{N - 1} {A(x,y)W_N^{ux}W_M^{vy}} }A^(u,v)=y=0∑M−1​x=0∑N−1​A(x,y)WNux​WMvy​


  根据二维DFT的计算公式,我们可以直接画出二维DFT对应的矩阵阵列[DFT2][DFT2][DFT2]。上图中右边每个黄色方框内的值是对应的行列旋转因子相乘。类似一维情况下的推导,我们可以得出:
[DFT2]∘[DFT2]∗=MN[I]\left[ {DFT2} \right] \circ {\left[ {DFT2} \right]^*} = MN\left[ I \right][DFT2]∘[DFT2]∗=MN[I]
(1MN[DFT2])∘(1MN[DFT2]∗)=[I]\left( {\frac{1}{{\sqrt {MN} }}\left[ {DFT2} \right]} \right) \circ \left( {\frac{1}{{\sqrt {MN} }}{{\left[ {DFT2} \right]}^*}} \right) = \left[ I \right](MN​1​[DFT2])∘(MN​1​[DFT2]∗)=[I]

二维相关运算

  首先给出二维的相关运算:
f(x,y)=∑q=0M−1∑p=0N−1A(p,q)B(x+p,y+q)f(x,y) = \sum\limits_{q = 0}^{M - 1} {\sum\limits_{p = 0}^{N - 1} {A(p,q)B\left( {x + p,y + q} \right)} }f(x,y)=q=0∑M−1​p=0∑N−1​A(p,q)B(x+p,y+q)
F(u,v)=∑y=0M−1∑x=0N−1∑q=0M−1∑p=0N−1A(p,q)B(x+p,y+q)WNuxWMvyF(u,v) = \sum\limits_{y = 0}^{M - 1} {\sum\limits_{x = 0}^{N - 1} {\sum\limits_{q = 0}^{M - 1} {\sum\limits_{p = 0}^{N - 1} {A(p,q)B\left( {x + p,y + q} \right)} } W_N^{ux}W_M^{vy}} }F(u,v)=y=0∑M−1​x=0∑N−1​q=0∑M−1​p=0∑N−1​A(p,q)B(x+p,y+q)WNux​WMvy​
F(u,v)=∑q=0M−1WM−vq∑p=0N−1A(p,q)WN−up∑x=0M−1WMv(y+q)∑y=0N−1B(x+p,y+q)WNu(x+p)=A^∗(u,v)B^(u,v)F(u,v) = \sum\limits_{q = 0}^{M - 1} {W_M^{ - vq}\sum\limits_{p = 0}^{N - 1} {A(p,q)W_N^{ - up}\sum\limits_{x = 0}^{M - 1} {W_M^{v(y + q)}\sum\limits_{y = 0}^{N - 1} {B\left( {x + p,y + q} \right)} } W_N^{u(x + p)}} } = {{\hat A}^*}(u,v)\hat B(u,v)F(u,v)=q=0∑M−1​WM−vq​p=0∑N−1​A(p,q)WN−up​x=0∑M−1​WMv(y+q)​y=0∑N−1​B(x+p,y+q)WNu(x+p)​=A^∗(u,v)B^(u,v)
  二维相关运算也可以用二维DFT加速。

循环矩阵阵列

  类似论文中提出的循环矩阵,这里我们定义循环矩阵阵列C(A)C(A)C(A),由m×n的矩阵AAA通过循环移位产生。

  • 定义算符PiP^iPi,PiAP^iAPiA表示矩阵AAA在沿着xxx正方向整体循环移位iii个单位;
  • 定义算符QiQ^iQi,QiAQ^iAQiA表示矩阵AAA在沿着yyy正方向整体循环移位iii个单位;
    C(A)uv=PuQvAC(A)_{uv}=P^uQ^vAC(A)uv​=PuQvA

  这个图太难画了,但我觉得这应该不难理解,就和一维的向量循环移位构成矩阵类似,矩阵循环移位构成矩阵阵列。
  C(A)∘BC(A)\circ BC(A)∘B表示的就是相关运算。这里我没有用二维卷积是因为我没想到怎样在矩阵阵列里定义对应的转置运算
C(A)∘B=[IDFT2]∘(A^∗⊙B^)=[IDFT2]∘split(A^∗)([DFT2]∘B)C(A) \circ B = \left[ {IDFT2} \right] \circ \left( {{{\hat A}^*} \odot \hat B} \right) = \left[ {IDFT2} \right] \circ {\mathop{\rm split}\nolimits} ({{\hat A}^*})\left( {\left[ {DFT2} \right] \circ B} \right)C(A)∘B=[IDFT2]∘(A^∗⊙B^)=[IDFT2]∘split(A^∗)([DFT2]∘B)
C(A)=[U∗]∘split(A^∗)∘[U]U=1MN[DFT2]C(A) = \left[ {{U^*}} \right] \circ {\mathop{\rm split}\nolimits} ({{\hat A}^*}) \circ \left[ U \right]\;\;\;\;U = \frac{1}{{\sqrt {MN} }}\left[ {DFT2} \right]C(A)=[U∗]∘split(A^∗)∘[U]U=MN​1​[DFT2]
  所以循环矩阵阵列也能够用DFT实现“分裂化”,即基础矩阵的二维DFT得到的结果分散到矩阵阵列的每个小矩阵中。正是因为能够做这样的特征分解,才有后面的element-wise的运算。
  后面我推不下去了,二维的岭回归大概是每个样本都是一个矩阵,所有样本排列在一起构成矩阵阵列,样本的标签值是一个二维函数,要优化的目标ω\omegaω也是一个二维的矩阵……

训练标签

  左上角第一个点表示样本不发生循环移动,如果用二维高斯函数作为训练标签,而且一开始我们关心的目标在训练样本图像的正中央,那么二维标签的左上角才是峰值点,因为左上角对应的位移量为0。又因为是循环移位的结构,所以四个角落都是峰值。

  如果我们关心的目标在样本图像的左上角,那么这个训练样本需要向左和向下平移一半的图像大小才能将样本移动到正中央,那样对应的二维高斯标签就是峰值在中央的情况。但这样做是不合理的,因为如果目标在左上角,那么目标周围的上下文信息就是残缺的。在做DFT之前为了保持周期的连续性,防止频谱泄露,还需要在给样本加窗。那样在左上角的目标信息就会丢失。
  所以如果目标是在训练样本的正中央的话,二维标签的峰值一定是在四个角落上。

CSK与KCF算法推导(四)相关推荐

  1. CSK与KCF算法推导(二)

      本文是CSK与KCF算法推导的第二篇,主要介绍标量对向量求导.核函数.岭回归问题求解等内容. CSK与KCF算法推导(一)--DFT.相关运算和循环卷积 (本文)CSK与KCF算法推导(二)--带 ...

  2. CSK与KCF算法推导(六)

      本文是CSK与KCF算法推导的第六篇,主要介绍HOG特征提取与多通道计算. CSK与KCF算法推导(一)--DFT.相关运算和循环卷积 CSK与KCF算法推导(二)--带核函数的岭回归问题求解 C ...

  3. CSK与KCF算法推导(三)

      本文是CSK与KCF算法推导的第三篇,主要介绍算法的主体部分推导. CSK与KCF算法推导(一)--DFT.相关运算和循环卷积 CSK与KCF算法推导(二)--带核函数的岭回归问题求解 (本文)C ...

  4. CSK与KCF算法推导(五)

      本文是CSK与KCF算法推导的第五篇,主要介绍具体实现的细节. CSK与KCF算法推导(一)--DFT.相关运算和循环卷积 CSK与KCF算法推导(二)--带核函数的岭回归问题求解 CSK与KCF ...

  5. CSK与KCF算法推导(一)

      从2015年João F. Henriques等人提出KCF以来,网上已经有了很多相关的科普,也有博主给出了非常详细的推导,但如果想要真正理解我觉得还是得自己推导一遍,所以我在这里准备写一下自己学 ...

  6. 相关滤波目标追踪二:从Mosse、csk、kcf、ddst单目标跟踪算法的一些总结。

    相关滤波源于信号处理领域,相关性用于表示两个信号之间的相似程度,通常用卷积表示相关操作.那么基于相关滤波的跟踪方法的基本思想就是,寻找一个滤波模板,让下一帧的图像与我们的滤波模板做卷积操作,响应最大的 ...

  7. 【KCF算法解析】High-Speed Tracking with Kernelized Correlation Filters笔记

    前段时间研究了一下KCF算法,单单看论文有很多看不懂的地方.查阅参考了,很多博客和其他材料才算了解了文章的大题思路,现将个人的理解在此记录,作为笔记. 主要内容 0.1 目标跟踪的背景介绍 0.2 学 ...

  8. 收藏 | 人人都能看懂的LSTM介绍及反向传播算法推导

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者:陈楠 来源:知乎 链接:https://zhuanla ...

  9. 决策树后剪枝算法(四)最小错误剪枝MEP

    ​  ​​ ​决策树后剪枝算法(一)代价复杂度剪枝CPP  ​​ ​决策树后剪枝算法(二)错误率降低剪枝REP  ​​ ​决策树后剪枝算法(三)悲观错误剪枝PEP  ​​ ​决策树后剪枝算法(四)最小 ...

最新文章

  1. 混合云环境中扩展Kubernetes的挑战及方案
  2. 浏览器的referer是服务器修改的吗,利用浏览器调整http的referer
  3. leetcode 553. Optimal Division | 553. 最优除法(暴力递归->傻缓存)
  4. 前端学习(2786):完成推荐商品结构之头部标签栏
  5. Thymeleaf视图
  6. c语言 复杂指针声明,C指针复杂声明
  7. git分支建立删除,打tag
  8. 手机弹出键盘 窗口改变事件
  9. 酷站欣赏:12个漂亮的国外单页网站设计案例
  10. 蘑菇街基于Docker的私有云实践
  11. linux关机方法有哪些?有何区别_茅台酒都有哪些容量?一升装的与一斤装的到底有何区别?...
  12. ROS学习(15)RoboWare Studio的安装使用
  13. TB6612FNG电机驱动使用说明
  14. 飞腾服务器通过KunLun BIOS 对JBOD模式的系统盘进行格式化,删除系统盘中残留数据的操作方法
  15. 一个机柜多少u?一个机柜可以放多少台服务器?
  16. 关于卓颖助手练习项目新增地址功能处介绍
  17. 小森生活一直显示服务器连接异常,小森生活进不去怎么解决?无法进入游戏问题原因与解决办法[多图]...
  18. #7.白盒测试:控制流测试
  19. TDD_UT测试总结
  20. 近视手术:全飞秒 vs 半飞秒

热门文章

  1. html屏幕飘灯笼,HTML5+CSS3实现摇晃的蓝色斋月灯笼动画效果
  2. 分析如何用金融学的知识促进修真世界、末日世界、游戏世界等世界的社会进步
  3. 【Houdini】如何利用黑白的图片在Houdini中快速制作一个立体的模型
  4. C++最经典打怪游戏代码,(高仿),完美复原原游戏,好玩到停不下来
  5. AC-DMIS 5.3 输出DMO文件
  6. route虚拟服务器模拟,Windows Server 2012R2 路由和网桥设置
  7. 什么时候会使用内部临时表?
  8. Hyperworks许可不够
  9. 黑马程序员——C基础之推箱子游戏
  10. IntelliJ IDEA 编码过程中没有错误提示以及自动提示等等的解决方法