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源码
上面的这些链接是我的主要参考资料。
...
2024年终总结
我的2024
回顾我的2024,我觉得今年的主旋律是“美好生活”。
今年去了好多地方旅游
3月去了长沙,乘着周末去的,从武汉去长沙真的很方便,早上出发玩了一天晚上回武汉,感觉行程刚刚好很充实。
4月去了宜昌的三峡人家,去泡了咸宁的温泉。当时和小🐻规划着每周末都去武汉周边没去过的地方打卡。
6月换工作了,乘着换工作的间隙区了青岛,青岛之旅是今年最美的一次旅行!风景很不错,很适合拍照。
8月去了河南郑州,打卡“只有河南”,打卡“胖东来”,也都是很新奇的体验。
为了更方便地在武汉周边玩,今年9月果断买车了!武汉市内也去了不少地方。比如解放公园,汤逊湖,光古书房,八分山,九峰山……
为了拍更多好看的照片,今年12月份我们也把相机升级了一下,换了Sony ZV-1,拍照更方便啦。
家里的幸福感拉满
今年我们租了一个更大的房子,但是在刚住进这个房子的时候有很多问题。比如房间,纱窗,冰箱都很脏,没有电视,没有洗衣机……但在我们的努力下,我们慢慢解决了这些问题。
我们布置了一个单独的书房,可以给我们两个人一起办公。 一天回家路上我们在路边买了一些盆栽,给家里增添了许多生机。每周五晚上下班之后我 ...
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 ...