VOT Toolkit环境配置与使用
本文主要是面向使用C/C++设计跟踪器算法的同学,搭建VOT的测试环境,以及一部分使用的经验。
VOT挑战赛是世界上公认的最权威的目标跟踪的比赛,赛事相关的论文奇数年会发在ICCV上,偶数年会发在ECCV上。在赛事的官网上能下载历年的比赛结果和数据集,VOT采用的算法性能评估工具是基于TraX协议,待评估的算法需要按照TraX的协议进行编写。
TraX协议
参考Luka Čehovin 2014年的论文:TraX: Visual Tracking eXchange Protocol,里面比较详细地介绍了基于TraX协议测试跟踪器的方式。
比较反直觉的是,我们自己写的跟踪器被称为“Server”,而给我们的跟踪器送图片的进程称为“Client”。Client会调用我们的跟踪器产生一个Seerver进程,两个进程之间按照一定的消息格式通信。
编译OpenCV
TraX的编译是依赖OpenCV的,后面作为样例的跟踪器也需要OpenCV。虽然可以在网上找到别人编译好的OpenCV,但是难免会遇到和我们本地的编译器不兼容的情况。别人编译的库文件要是有问题,就会很头疼,所以最 ...
CSK与KCF算法推导(六)
本文是CSK与KCF算法推导的第六篇,主要介绍HOG特征提取与多通道计算。
CSK与KCF算法推导(一)——DFT、相关运算和循环卷积
CSK与KCF算法推导(二)——带核函数的岭回归问题求解
CSK与KCF算法推导(三)——算法主体部分推导
CSK与KCF算法推导(四)——从一维推广到二维
CSK与KCF算法推导(五)——具体实现细节
CSK与KCF算法推导(六)——HOG特征提取与多通道计算
边缘特征提取
采用 [-1,0,1] 的滤波模版求原始图像的水平和垂直方向的梯度。滤波模版的Anchor位于滤波模版的中心。求边缘的像素的梯度时,对原始图像的 边界有一个扩展的操作,作者采用的是镜像扩展,这样一来边缘像素的梯度值均为0。
方向图与强度图
在得到xxx方向的梯度图和yyy方向的梯度图之后,我们就得到了原始图像中每个像素点的梯度向量(dx,dy)(dx,dy)(dx,dy),将这些梯度向量转换成模rrr与方向角α\alphaα进行表示,用于生成方向梯度直方图(Histogram of Oriented Gradient,HOG)。
HO ...
CSK与KCF算法推导(五)
本文是CSK与KCF算法推导的第五篇,主要介绍具体实现的细节。
CSK与KCF算法推导(一)——DFT、相关运算和循环卷积
CSK与KCF算法推导(二)——带核函数的岭回归问题求解
CSK与KCF算法推导(三)——算法主体部分推导
CSK与KCF算法推导(四)——从一维推广到二维
CSK与KCF算法推导(五)——具体实现细节
CSK与KCF算法推导(六)——HOG特征提取与多通道计算
算法流程
算法的大致流程如上图所示。左边是第一次训练,右边是每次的更新。我认为整个算法最关键的地方在于提取特征图和核函数的计算。作者的代码里有提取hog特征,也有直接用原始的灰度图像数据作为特征图,目前我只看了用灰度图作为特征图的部分。需要注意的是,这里的灰度图是归一化到[-0.5,0.5]的区间内的!!!
fftshift()
MATLAB里有一个fftshift()的函数。原本DFT的结果中,低频部分是在序列两端,高频在中间;这个函数可以把低频移到中间,高频移到两边。
在我前面的文章中介绍了,标签值应该是一个峰值在序列两端的高斯函数。既然我们是用这样的标 ...
CSK与KCF算法推导(四)
本文是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的矩阵。 ...
CSK与KCF算法推导(三)
本文是CSK与KCF算法推导的第三篇,主要介绍算法的主体部分推导。
CSK与KCF算法推导(一)——DFT、相关运算和循环卷积
CSK与KCF算法推导(二)——带核函数的岭回归问题求解
CSK与KCF算法推导(三)——算法主体部分推导
CSK与KCF算法推导(四)——从一维推广到二维
CSK与KCF算法推导(五)——具体实现细节
CSK与KCF算法推导(六)——HOG特征提取与多通道计算
循环矩阵
循环矩阵从CSK的文章里就提出了,概念也很容易理解。一个样本xxx,可以通过循环移位生成不同的向量,组合成一个矩阵C(x)C(x)C(x)。下面的图里分别列出了xxx、C(x)C(x)C(x)和C(x)C(x)C(x)的转置。
循环矩阵C(x)C(x)C(x)和另一个列向量zzz相乘,得到的结果就是xxx和zzz进行相关运算的结果。这个也很好理解,就是xxx在zzz上面滑动,然后进行乘加运算。同样可以写出循环卷积的矩阵表达式,循环卷积需要先将xxx倒序,然后再滑动。对比循环卷积所用的矩阵和(C(x))T(C(x))^T(C(x))T的颜色,可以发现它 ...
CSK与KCF算法推导(二)
本文是CSK与KCF算法推导的第二篇,主要介绍标量对向量求导、核函数、岭回归问题求解等内容。
CSK与KCF算法推导(一)——DFT、相关运算和循环卷积
CSK与KCF算法推导(二)——带核函数的岭回归问题求解
CSK与KCF算法推导(三)——算法主体部分推导
CSK与KCF算法推导(四)——从一维推广到二维
CSK与KCF算法推导(五)——具体实现细节
CSK与KCF算法推导(六)——HOG特征提取与多通道计算
向量求导
很多论文里的数学推导都离不开对向量求导。对向量求导的本质也是对一个个分量求导,用向量写起来就非常紧凑美观。向量分为行向量和列向量,习惯上我们都是把变量写成列向量,所以大多数情况都是对列向量求导。有些书里提出了“分子布局”、“分母布局”的概念,帮助阐述如何对向量求导,但我怕比较繁琐就不在这里介绍了。
标量对向量求导
两个向量的内积可以得到一个标量,这个标量对向量求导实际上是对向量的每个分量分别求导。设q={q1,q2,q3⋯qn}Tq=\{q_1, q_2,q_3\cdots q_n\}^Tq={q1,q2,q3⋯qn} ...
CSK与KCF算法推导(一)
从2015年João F. Henriques等人提出KCF以来,网上已经有了很多相关的科普,也有博主给出了非常详细的推导,但如果想要真正理解我觉得还是得自己推导一遍,所以我在这里准备写一下自己学习过程中的一些想法。
本文是CSK与KCF算法推导的第一篇,主要介绍DFT、相关运算和循环卷积相关的内容。
SpringerLink上的ECCV2012里的CSK的论文里公式(4)落了一个共轭,下面链接里的CSK论文没有问题。知乎上有人说作者的论文中推导有问题,我推导了之后也发现确实是有那个问题,但无伤大雅。
2012 - CSK: Exploiting the Circulant Structure of Tracking-by-detection with Kernels
2015 - KCF: High-Speed Tracking withKernelized Correlation Filters
2015 - 作者博士论文: Circulant Structures in Computer Vsion
作者Github源码
上面的这些链接是我的主要参考资料。
...
CUDA优化入门
Refences
System Requirment
How To Build
Check Compute Capability
Build All
Content
baseline
shared memory
coalesce
other practice
graph
memory mapped
本文记录了我的cuda学习经历,和大多数人一样,通过优化矩阵乘法的过程来了解一些基本的概念。仓库链接:
Gitee
Github
Refences
NVIIDA Fermi Architecture Whitepaper
CUDA C++ Programming Guide
CUDA C++ Best Practices Guide
其中Fermi架构是Compute Capability 2.0的架构。从白皮书里能了解到硬件相关的一些基本概念。比如streaming multiprocessor,有时候也简称multiprocessor或者SM。一个SM里有32个cuda core,有两个warp调度器。一个warp是由32个thread组成。和硬件结合 ...
二分图的判断与匹配
判断
二分图是无向图的一种,它只对无向图中的边做了限制。将图中的所有定点分到两个集合中,要求所有边的两个端点分别处于这两个集合。
解题思路也很简单。遍历每个点,并从每个点出发找它的相邻的点,对处于不同集合的点做不同得标记。如果发现标记产生冲突,那么就不是二分图;如果成功给每个点做上标记,则是二分图。
leetcode有一题判断二分图的题,链接
1234567891011121314151617181920212223242526272829303132333435363738394041424344class Solution { private: constexpr static int nocolor = 0; constexpr static int red = 1; constexpr static int green = 2; vector<int> color_; bool dfs(int node, int c, const vector<vector<int>>& graph) { colo ...
长风破浪会有时
工作半年了,实际的工作体验跟当初想象的好像是不太一样。感觉还是在学校读书好啊
方向?
半年没更了,偶尔也有些网友私信问我DSP相关的问题,但是我现在也没有继续做DSP了,很多也都忘了,所以可能帮不上什么忙,也就都没有回复了。在这里统一回复一下,抱歉抱歉T_T。
在本科的时候,我喜欢做硬件,跟一堆电子元件打交道,追求尽可能用一些小封装的器件设计精巧的电路。做比赛做的大多也都是通信方向,但是一直都没有深入去理解,浅尝辄止,想着尽可能接触一些新的东西。读研之后开始转方向了,类似于嵌入式软件的开发(也不知道是不是正经的嵌软),写C/C++,也写一些Verilog,开发DSP和FPGA。感觉也是一种不上不下的状态,C/C++打不过真正做软件的,Verilog也没有做数字IC的能打。算法能力也不用说,仅限于刷过几道题的水平。所以读了几年书下来,一直都没有一种可以拿得出手的特长。参加工作之后做的是一般的C/C++开发工作,但感觉也没有很大的兴趣,对未来的方向有点迷茫了。
我觉得能够越早找准自己的定位,自己的方向,就可以走越少的弯路。关于寻找自己的方向,我还在路上……
学习
学习是一个很宽泛的概念,学 ...