Exploiting the Circulant Structure of Tracking-by-detection with Kernels(CSK)

本文深入探讨CSK目标跟踪算法,源自ECCV2012,详解核函数及循环矩阵的应用,揭示密集采样的原理,分析MATLAB插值与傅里叶变换在图像处理中的角色。

Exploiting the Circulant Structure of Tracking-by-detection with Kernels [paper] [code]

目标跟踪CSK代码出自ECCV2012,其主要的贡献是在MOSSE的基础上使用了核函数,同时证明了核函数是循环矩阵,通过循环矩阵可以实现密集采样。

预备知识

作者给出的整体思路


这张图片已经对CSK的整个思路梳理的很清晰。

几点理解

  • 为什么说循环矩阵就可以实现在一张图片上对在搜索区域内的所有子窗口进行密集采样呢?
    我的理解是:循环位移相当于目标框(上一帧得出的以目标中心范围,也可以理解为框的范围)不动,而在当前帧截取的图片(也就是搜索区域)动,每移动一次就可以求出目标框与搜索区域重叠部分的互相关值即C(x)y,这样互相关值越大,就说明越有可能是目标所在位置,这样就可以得出目标框与搜索区域每一部分的互相关值。
  • 代码dense_gauss_kernel.m文件中有将零频分量移到频谱中心的操作,做以下说明:
    通过输出mesh(x)与mesh(xf)可以看到x的能量集中在中心位置(其已经进行过加余弦窗处理),而xf的信号能量将集中在系数矩阵的四个角上。
    这是由二维傅里叶本身性质决定的:若变换矩阵原点设在中心,其频谱能量集中分布在变换系数短阵的中心附近(图中阴影区)。若所用的二维傅里叶变换矩阵的原点设在左上角,那么图像信号能量将集中在系数矩阵的四个角上。表明了图像能量集中低频区域。
    而MATLAB的fft函数进行傅里叶变换时,其变换矩阵原点就在左上角,因此造成了形成的傅里叶域内的图像能量集中在四角.这就导致了傅里叶变换后频谱图上的各点与图像上各点并不存在一一对应的关系,因此要将其对应回来(MATLAB官方说法是零频分量移到频谱中心),MATLAB官方给出的是使用fftshift函数,而本文作者在下面使用了circshift(ifft2(xyf),floor(size(x)/2))操作,实质上也是将零频分量移到频谱中心。只是fftshift更像是执行块操作(如果 X 是矩阵,则 fftshift 会将 X 的第一象限与第三象限交换,将第二象限与第四象限交换.),而circshift更像是一位一位的移动,直到移动到满足需要移动的位移数为止。
  • 论文P11的Algorithm1的第三个函数function k = dgk(x1, x2, sigma)对于k的求解时除以了numel(x1),这是高斯核,而对于论文中求解的高斯核并没有这一项,论文中也没有解释为什么存在这一项,这里写下自己的理解:
    首先要看到的一点是numel(x1)=numel(x2).
    再就是解释这里为什么除以numel(x1):通过将除numel(x1)和不除两种情况下的mesh(k)输出和查看k的值分析,如若不除以numel(x1),那么除了中心点外在其他位置的k_i都无限趋近于0,k的输出值直接取了0,这就导致了核k会认为除了正好截取到目标,其他情况都认为目标出图找不到了,通俗解释就是跟踪中心点偏一点都不可以,鲁棒性太差。而除以numel(x)后,会将所有的值都在一个很小的范围内,k值输出更平滑,鲁棒性更好。使用dog1数据集进行测试验证了分析,可以看到,当dog1中dog移动不大时,都可以跟踪到,稍微有点偏移就跟踪丢失了。
  • 由论文Eq.4可知C(u)v= F − 1 F^{-1} F1( F ∗ ( u ) F^*(u) F(u) ⨀ \bigodot F(v)),也就是说C(y)x=ifft(F(xy))=ifft(F(x) .* F*(y)),可以看到只要执行ifft(F(x) .* F*(y)),就是对y进行了循环矩阵操作,同时求得y进行循环后其与x的互相关性,因为C(y)x是将y进行循环后求其与x的互相关性。
    这在给出的源码中就是直接使用的频域内的公式,在时域内就相当于已经进行了循环位移,将时域的循环转至频域内实现。
  • 此算法的重要参数求解都是在傅里叶领域内,是本文的创新点,也是速度快的一个原因。
  • 相关滤波的循环矩阵密集采样缺点:在搜索半径很大时非常慢,因此不适用于很大的采样空间。总的来说,tracking-by-detection类的局部搜索有很缺点,尤其是相关滤波,对快速运动目标很难处理。

自己总结的论文及相关公式推导


在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

要通关“Exploiting PHP deserialization with a pre-built gadget chain”关卡,以下是一些通用的步骤和思路: ### 理解PHP反序列化漏洞原理 PHP反序列化漏洞通常是由于应用程序在反序列化用户提供的数据时,没有对输入进行严格的验证和过滤,导致攻击者可以构造恶意的序列化数据,触发一系列的魔术方法调用,最终执行任意代码或进行其他恶意操作。 ### 分析预构建的小工具链 关卡中提到了预构建的小工具链,需要仔细分析这个小工具链的组成和功能。小工具链通常是由一系列的PHP对象和方法调用组成,通过精心构造这些对象和方法的调用顺序,可以达到特定的攻击目的。 ### 构造恶意序列化数据 根据分析得到的小工具链,构造恶意的序列化数据。这通常需要了解PHP的序列化格式和相关的魔术方法。例如,以下是一个简单的PHP序列化和反序列化示例: ```php <?php class ExampleClass { public $property = 'value'; public function __destruct() { // 当对象被销毁时会调用这个方法 echo "Object is being destroyed."; } } // 创建对象 $obj = new ExampleClass(); // 序列化对象 $serialized = serialize($obj); // 输出序列化后的字符串 echo $serialized; // 反序列化对象 $deserialized = unserialize($serialized); ?> ``` ### 注入恶意序列化数据 将构造好的恶意序列化数据注入到应用程序中可以接受序列化数据的地方,例如表单字段、URL参数等。在注入时,需要注意数据的编码和传输方式,确保数据能够被正确地反序列化。 ### 测试和调试 注入恶意序列化数据后,需要进行测试和调试,观察应用程序的响应和行为。如果没有达到预期的效果,需要检查构造的恶意序列化数据是否正确,以及应用程序是否对输入进行了额外的过滤和验证。 ### 绕过过滤和防护机制 如果应用程序对输入进行了过滤和防护,需要尝试绕过这些机制。常见的绕过方法包括使用编码、变形等技术,将恶意数据伪装成合法的数据。 ### 利用漏洞获取权限或执行操作 一旦成功绕过过滤和防护机制,并且触发了小工具链的执行,就可以利用漏洞获取系统权限、执行任意代码或进行其他恶意操作。 ### 相关问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值