时空上下文视觉跟踪(STC)算法的解读与代码复现

zouxy09@qq.com

http://blog.csdn.net/zouxy09

本博文主要是关注一篇视觉跟踪的论文。这篇论文是Kaihua Zhang等人今年投稿到一个会议的文章,因为会议还没有出结果,所以作者还没有发布他的Matlab源代码。但为了让我们先睹为快,作者把论文放在arxiv这个网站上面供大家下载了。对于里面所描述的神奇的效果,大家都跃跃欲试,也有人将其复现了。我这里也花了一天的时间去复现了单尺度的C++版本,主要是基于OpenCV。多尺度的有点复杂,这个后面再做考虑了。另外,能力有限,论文解读和代码实现可能会出现错误,所以如果代码里面出现错误,还望大家不吝指点。

论文见:

Kaihua Zhang, Lei Zhang, Ming-Hsuan Yang,and David Zhang, Fast Trackingvia Spatio-Temporal Context Learning

目前作者已公开了支持多尺度的Matlab代码了哦。可以到以下网址下载:

http://www4.comp.polyu.edu.hk/~cslzhang/STC/STC.htm

一、概述

该论文提出一种简单却非常有效的视觉跟踪方法。更迷人的一点是,它速度很快,原作者实现的Matlab代码在i7的电脑上达到350fps。

该论文的关键点是对时空上下文(Spatio-Temporal Context)信息的利用。主要思想是通过贝叶斯框架对要跟踪的目标和它的局部上下文区域的时空关系进行建模,得到目标和其周围区域低级特征的统计相关性。然后综合这一时空关系和生物视觉系统上的focus of attention特性来评估新的一帧中目标出现位置的置信图,置信最大的位置就是我们得到的新的一帧的目标位置。另外,时空模型的学习和目标的检测都是通过FFT(傅里叶变换)来实现,所以学习和检测的速度都比较快。

二、工作过程

具体过程见下图:

(1)t帧:在该帧目标(第一帧由人工指定)已经知道的情况下,我们计算得到一个目标的置信图(Confidence Map,也就是目标的似然)。通过生物视觉系统上的focus of attention特性我们可以得到另一张概率图(先验概率)。通过对这两个概率图的傅里叶变换做除再反傅里叶变换,就可以得到建模目标和周围背景的空间相关性的空间上下文模型(条件概率)。然后我们用这个模型去更新跟踪下一帧需要的时空上下文模型(可能这里还不太能理解,看到后面的相关理论分析和算法描述后可能会清晰一点)。

(2)t+1帧:利用t帧的上下文信息(时空上下文模型),卷积图像得到一个目标的置信图,值最大的位置就是我们的目标所在地。或者理解为图像各个地方对该上下文信息的响应,响应最大的地方自然就是满足这个上下文的地方,也就是目标了。

三、相关理论描述

3.1、上下文的重要性

时间和空间上的上下文信息对跟踪来说是非常重要的。虽然对跟踪,我们一直利用了时间上的上下文信息(用t去跟踪t+1等),但对空间上下文信息的利用却比较匮乏。为什么空间上下文信息会重要呢?考虑我们人,例如我们需要在人群中识别某个人脸(众里寻他千百度),那我们为什么只关注它的脸呢?如果这个人穿的衣服啊帽子和其他人不一样,那么这时候的识别和跟踪就会更加容易和鲁棒。或者场景中这个人和其他的东西有一定的关系,例如他靠在一棵树上,那么他和树就存在了一定的关系,而树在场景中是不会动的(除非你摇动摄像头了),那我们借助树来辅助找到这个人是不是比单单去找这个人要容易,特别是人被部分遮挡住的时候。还有一些就是如果这个人带着女朋友(有其他物体陪着一起运动),那么可以将他们看成一个集合结构,作为一组进行跟踪,这样会比跟踪他们其中一个要容易。

总之,一个目标很少与整个场景隔离或者没有任何联系,因为总存在一些和目标运动存在短时或者长时相关的目标。这种空间上下文的相关性就是我们可以利用的。

在视觉跟踪,局部上下文包括一个目标和它的附近的一定区域的背景。因为,在连续帧间目标周围的局部场景其实存在着很强的时空关系。例如,上图中的目标存在着严重的阻挡,导致目标的外观发生了很大的变化。然而,因为只有小部分的上下文区域是被阻挡的,整体的上下问区域是保持相似的,所以该目标的局部上下文不会发生很大的变化。因此,当前帧局部上下文会有助于帮助预测下一帧中目标的位置。图中,黄色框的是目标,然后它和它的周围区域,也就是红色框包围的区域,就是该目标的上下文区域。左:虽然出现严重的阻挡导致目标的外观发现很大的变化,但目标中心(由黄色的点表示)和其上下文区域中的周围区域的其他位置(由红色点表示)的空间关系几乎没有发生什么变化。中:学习到的时空上下文模型(蓝色方框内的区域具有相似的值,表示该区域与目标中心具有相似的空间关系)。右:学习到的置信图。

时间信息:邻近帧间目标变化不会很大。位置也不会发生突变。

空间信息:目标和目标周围的背景存在某种特定的关系,当目标的外观发生很大变化时,这种关系可以帮助区分目标和背景。

对目标这两个信息的组合就是时空上下文信息,该论文就是利用这两个信息来进行对阻挡等鲁棒并且快速的跟踪。

3.2、具体细节

跟踪问题可以描述为计算一个估计目标位置x似然的置信图:

置信图c(x)最大的那个位置x*就是目标的位置。从公式上可以看到,似然函数可以分解为两个概率部分。一个是建模目标与周围上下文信息的空间关系的条件概率P(x|c(z),o),一个是建模局部上下文各个点x的上下文先验概率P(c(x)|o)。而条件概率P(x|c(z),o),也就是目标位置和它的空间上下文的关系我们需要学习出来。

(1)Spatial Context Model 空间上下文模型

空间上下文模型描述的是条件概率函数:

hsc(x-z)是一个关于目标x和局部上下文位置z的相对距离和方向的函数,它编码了目标和它的空间上下文的空间关系。需要注意的是,这个函数并不是径向对称的。这有助于分辨二义性。例如图三,左眼和右眼相对于位置x*来说他们的距离是一样的,但相对位置也就是方向是不一样的。所以他们会有不一样的空间关系。这样就对防止误跟踪有帮助。

另外,这个模型是通过在线学习得到的。随着跟踪的进行不断更新。

(2)Context Prior Model 上下文先验模型

这是先验概率,建模为:

其中I(z)是点z的灰度,描述的是这个上下文z的外观。w是一个加权函数,z离x越近,权值越大。定义如下:

这个加权函数是由生物视觉系统的focus of attention 启发得到的,它表示人看东西的时候,会聚焦在一个确定的图像区域。通俗的来说,就是离我们的目标越近的点,会越受关注,越远就不好意思了,你的光芒会被无情的忽略掉。那多远的距离会被多大程度的忽略呢?这就得看参数sigma(相当于高斯权重函数的方差)了,这个值越大,越多的风景映入眼帘,祖国大好河山,尽收眼底。如果这个值越小,那就相当于坐井观天了。

(3)Confidence Map 置信图

定义为:

这个公式的参数β是很重要的,太大太小效果可能差之千里。具体分析见原论文。这个置信图是在给定目标的位置x*的基础上,我们通过这个公式来计算得到上下文区域任何一点x的似然得到的。

(4)时空模型的快速学习

我们需要基于上下文先验模型和置信图来学习这个时空模型:

里面的卷积可以通过FFT来加速(时域的卷积相当于频域的乘积),具体如下:

这样,我们就可以通过两个FFT和一个IFFT来学习我们要的空间上下文模型了:

然后我们用这个模型去更新时空上下文模型:

(4)最后的跟踪

得到时空上下文模型后,我们就可以在新的一帧计算目标的置信图了:

同样是通过FFT来加速。然后置信图中值最大的位置,就是我们的目标位置了。

(5)多尺度的实现

多尺度可以通过调整方差sigma来实现。具体分析见原论文。(感觉这个是很remarkable的一点)。尺度和方差sigma的更新如下:

四、算法描述

简单的算法描述如下,编程实现其实也是这个过程。(另外,不知道我的尺度更新的位置对不对,望指点)

(1)t帧:

根据该帧图像I和得到的目标位置x*。顺序进行以下计算:

1)学习空间上下文模型:

2)更新跟踪下一帧目标需要的时空上下文模型:

3)更新尺度等参数:

(2)t+1帧:

1)计算置信图:

2)找到最大值,这个最大值的位置就是我们要求的目标位置:

五、代码实现

我的代码是基于VS2010+OpenCV2.4.2的(暂时还没加入边界处理,也就是跟踪框到达图像边缘的时候程序就会出错)。代码可以读入视频,也可以读摄像头,两者的选择只需要在代码中稍微修改即可。对于视频来说,运行会先显示第一帧,然后我们用鼠标框选要跟踪的目标,然后跟踪器开始跟踪每一帧。对摄像头来说,就会一直采集图像,然后我们用鼠标框选要跟踪的目标,接着跟踪器开始跟踪后面的每一帧。

另外,为了消去光照的影响,需要先对图像去均值化,还需要加Hamming窗以减少图像边缘对FFT带来的频率影响。Hamming窗如下:

另外,OpenCV没有复数(FFT后是复数)的乘除运算,所以需要自己编写,参考如下:

复数除法:

复数乘法:

具体代码如下:

STCTracker.h

  1. // Fast object tracking algorithm
  2. // Author : zouxy
  3. // Date   : 2013-11-21
  4. // HomePage : http://blog.csdn.net/zouxy09
  5. // Email  : zouxy09@qq.com
  6. // Reference: Kaihua Zhang, et al. Fast Tracking via Spatio-Temporal Context Learning
  7. // HomePage : http://www4.comp.polyu.edu.hk/~cskhzhang/
  8. // Email: zhkhua@gmail.com
  9. #pragma once
  10. #include <opencv2/opencv.hpp>
  11. using namespace cv;
  12. using namespace std;
  13. class STCTracker
  14. {
  15. public:
  16. STCTracker();
  17. ~STCTracker();
  18. void init(const Mat frame, const Rect box);
  19. void tracking(const Mat frame, Rect &trackBox);
  20. private:
  21. void createHammingWin();
  22. void complexOperation(const Mat src1, const Mat src2, Mat &dst, int flag = 0);
  23. void getCxtPriorPosteriorModel(const Mat image);
  24. void learnSTCModel(const Mat image);
  25. private:
  26. double sigma;           // scale parameter (variance)
  27. double alpha;           // scale parameter
  28. double beta;            // shape parameter
  29. double rho;             // learning parameter
  30. Point center;           // the object position
  31. Rect cxtRegion;         // context region
  32. Mat cxtPriorPro;        // prior probability
  33. Mat cxtPosteriorPro;    // posterior probability
  34. Mat STModel;            // conditional probability
  35. Mat STCModel;           // spatio-temporal context model
  36. Mat hammingWin;         // Hamming window
  37. };

 

STCTracker.cpp

  1. // Fast object tracking algorithm
  2. // Author : zouxy
  3. // Date   : 2013-11-21
  4. // HomePage : http://blog.csdn.net/zouxy09
  5. // Email  : zouxy09@qq.com
  6. // Reference: Kaihua Zhang, et al. Fast Tracking via Spatio-Temporal Context Learning
  7. // HomePage : http://www4.comp.polyu.edu.hk/~cskhzhang/
  8. // Email: zhkhua@gmail.com
  9. #include "STCTracker.h"
  10. STCTracker::STCTracker()
  11. {
  12. }
  13. STCTracker::~STCTracker()
  14. {
  15. }
  16. /************ Create a Hamming window ********************/
  17. void STCTracker::createHammingWin()
  18. {
  19. for (int i = 0; i < hammingWin.rows; i++)
  20. {
  21. for (int j = 0; j < hammingWin.cols; j++)
  22. {
  23. hammingWin.at<double>(i, j) = (0.54 - 0.46 * cos( 2 * CV_PI * i / hammingWin.rows ))
  24. * (0.54 - 0.46 * cos( 2 * CV_PI * j / hammingWin.cols ));
  25. }
  26. }
  27. }
  28. /************ Define two complex-value operation *****************/
  29. void STCTracker::complexOperation(const Mat src1, const Mat src2, Mat &dst, int flag)
  30. {
  31. CV_Assert(src1.size == src2.size);
  32. CV_Assert(src1.channels() == 2);
  33. Mat A_Real, A_Imag, B_Real, B_Imag, R_Real, R_Imag;
  34. vector<Mat> planes;
  35. split(src1, planes);
  36. planes[0].copyTo(A_Real);
  37. planes[1].copyTo(A_Imag);
  38. split(src2, planes);
  39. planes[0].copyTo(B_Real);
  40. planes[1].copyTo(B_Imag);
  41. dst.create(src1.rows, src1.cols, CV_64FC2);
  42. split(dst, planes);
  43. R_Real = planes[0];
  44. R_Imag = planes[1];
  45. for (int i = 0; i < A_Real.rows; i++)
  46. {
  47. for (int j = 0; j < A_Real.cols; j++)
  48. {
  49. double a = A_Real.at<double>(i, j);
  50. double b = A_Imag.at<double>(i, j);
  51. double c = B_Real.at<double>(i, j);
  52. double d = B_Imag.at<double>(i, j);
  53. if (flag)
  54. {
  55. // division: (a+bj) / (c+dj)
  56. R_Real.at<double>(i, j) = (a * c + b * d) / (c * c + d * d + 0.000001);
  57. R_Imag.at<double>(i, j) = (b * c - a * d) / (c * c + d * d + 0.000001);
  58. }
  59. else
  60. {
  61. // multiplication: (a+bj) * (c+dj)
  62. R_Real.at<double>(i, j) = a * c - b * d;
  63. R_Imag.at<double>(i, j) = b * c + a * d;
  64. }
  65. }
  66. }
  67. merge(planes, dst);
  68. }
  69. /************ Get context prior and posterior probability ***********/
  70. void STCTracker::getCxtPriorPosteriorModel(const Mat image)
  71. {
  72. CV_Assert(image.size == cxtPriorPro.size);
  73. double sum_prior(0), sum_post(0);
  74. for (int i = 0; i < cxtRegion.height; i++)
  75. {
  76. for (int j = 0; j < cxtRegion.width; j++)
  77. {
  78. double x = j + cxtRegion.x;
  79. double y = i + cxtRegion.y;
  80. double dist = sqrt((center.x - x) * (center.x - x) + (center.y - y) * (center.y - y));
  81. // equation (5) in the paper
  82. cxtPriorPro.at<double>(i, j) = exp(- dist * dist / (2 * sigma * sigma));
  83. sum_prior += cxtPriorPro.at<double>(i, j);
  84. // equation (6) in the paper
  85. cxtPosteriorPro.at<double>(i, j) = exp(- pow(dist / sqrt(alpha), beta));
  86. sum_post += cxtPosteriorPro.at<double>(i, j);
  87. }
  88. }
  89. cxtPriorPro.convertTo(cxtPriorPro, -1, 1.0/sum_prior);
  90. cxtPriorPro = cxtPriorPro.mul(image);
  91. cxtPosteriorPro.convertTo(cxtPosteriorPro, -1, 1.0/sum_post);
  92. }
  93. /************ Learn Spatio-Temporal Context Model ***********/
  94. void STCTracker::learnSTCModel(const Mat image)
  95. {
  96. // step 1: Get context prior and posterior probability
  97. getCxtPriorPosteriorModel(image);
  98. // step 2-1: Execute 2D DFT for prior probability
  99. Mat priorFourier;
  100. Mat planes1[] = {cxtPriorPro, Mat::zeros(cxtPriorPro.size(), CV_64F)};
  101. merge(planes1, 2, priorFourier);
  102. dft(priorFourier, priorFourier);
  103. // step 2-2: Execute 2D DFT for posterior probability
  104. Mat postFourier;
  105. Mat planes2[] = {cxtPosteriorPro, Mat::zeros(cxtPosteriorPro.size(), CV_64F)};
  106. merge(planes2, 2, postFourier);
  107. dft(postFourier, postFourier);
  108. // step 3: Calculate the division
  109. Mat conditionalFourier;
  110. complexOperation(postFourier, priorFourier, conditionalFourier, 1);
  111. // step 4: Execute 2D inverse DFT for conditional probability and we obtain STModel
  112. dft(conditionalFourier, STModel, DFT_INVERSE | DFT_REAL_OUTPUT | DFT_SCALE);
  113. // step 5: Use the learned spatial context model to update spatio-temporal context model
  114. addWeighted(STCModel, 1.0 - rho, STModel, rho, 0.0, STCModel);
  115. }
  116. /************ Initialize the hyper parameters and models ***********/
  117. void STCTracker::init(const Mat frame, const Rect box)
  118. {
  119. // initial some parameters
  120. alpha = 2.25;
  121. beta = 1;
  122. rho = 0.075;
  123. sigma = 0.5 * (box.width + box.height);
  124. // the object position
  125. center.x = box.x + 0.5 * box.width;
  126. center.y = box.y + 0.5 * box.height;
  127. // the context region
  128. cxtRegion.width = 2 * box.width;
  129. cxtRegion.height = 2 * box.height;
  130. cxtRegion.x = center.x - cxtRegion.width * 0.5;
  131. cxtRegion.y = center.y - cxtRegion.height * 0.5;
  132. cxtRegion &= Rect(0, 0, frame.cols, frame.rows);
  133. // the prior, posterior and conditional probability and spatio-temporal context model
  134. cxtPriorPro = Mat::zeros(cxtRegion.height, cxtRegion.width, CV_64FC1);
  135. cxtPosteriorPro = Mat::zeros(cxtRegion.height, cxtRegion.width, CV_64FC1);
  136. STModel = Mat::zeros(cxtRegion.height, cxtRegion.width, CV_64FC1);
  137. STCModel = Mat::zeros(cxtRegion.height, cxtRegion.width, CV_64FC1);
  138. // create a Hamming window
  139. hammingWin = Mat::zeros(cxtRegion.height, cxtRegion.width, CV_64FC1);
  140. createHammingWin();
  141. Mat gray;
  142. cvtColor(frame, gray, CV_RGB2GRAY);
  143. // normalized by subtracting the average intensity of that region
  144. Scalar average = mean(gray(cxtRegion));
  145. Mat context;
  146. gray(cxtRegion).convertTo(context, CV_64FC1, 1.0, - average[0]);
  147. // multiplies a Hamming window to reduce the frequency effect of image boundary
  148. context = context.mul(hammingWin);
  149. // learn Spatio-Temporal context model from first frame
  150. learnSTCModel(context);
  151. }
  152. /******** STCTracker: calculate the confidence map and find the max position *******/
  153. void STCTracker::tracking(const Mat frame, Rect &trackBox)
  154. {
  155. Mat gray;
  156. cvtColor(frame, gray, CV_RGB2GRAY);
  157. // normalized by subtracting the average intensity of that region
  158. Scalar average = mean(gray(cxtRegion));
  159. Mat context;
  160. gray(cxtRegion).convertTo(context, CV_64FC1, 1.0, - average[0]);
  161. // multiplies a Hamming window to reduce the frequency effect of image boundary
  162. context = context.mul(hammingWin);
  163. // step 1: Get context prior probability
  164. getCxtPriorPosteriorModel(context);
  165. // step 2-1: Execute 2D DFT for prior probability
  166. Mat priorFourier;
  167. Mat planes1[] = {cxtPriorPro, Mat::zeros(cxtPriorPro.size(), CV_64F)};
  168. merge(planes1, 2, priorFourier);
  169. dft(priorFourier, priorFourier);
  170. // step 2-2: Execute 2D DFT for conditional probability
  171. Mat STCModelFourier;
  172. Mat planes2[] = {STCModel, Mat::zeros(STCModel.size(), CV_64F)};
  173. merge(planes2, 2, STCModelFourier);
  174. dft(STCModelFourier, STCModelFourier);
  175. // step 3: Calculate the multiplication
  176. Mat postFourier;
  177. complexOperation(STCModelFourier, priorFourier, postFourier, 0);
  178. // step 4: Execute 2D inverse DFT for posterior probability namely confidence map
  179. Mat confidenceMap;
  180. dft(postFourier, confidenceMap, DFT_INVERSE | DFT_REAL_OUTPUT| DFT_SCALE);
  181. // step 5: Find the max position
  182. Point point;
  183. minMaxLoc(confidenceMap, 0, 0, 0, &point);
  184. // step 6-1: update center, trackBox and context region
  185. center.x = cxtRegion.x + point.x;
  186. center.y = cxtRegion.y + point.y;
  187. trackBox.x = center.x - 0.5 * trackBox.width;
  188. trackBox.y = center.y - 0.5 * trackBox.height;
  189. trackBox &= Rect(0, 0, frame.cols, frame.rows);
  190. cxtRegion.x = center.x - cxtRegion.width * 0.5;
  191. cxtRegion.y = center.y - cxtRegion.height * 0.5;
  192. cxtRegion &= Rect(0, 0, frame.cols, frame.rows);
  193. // step 7: learn Spatio-Temporal context model from this frame for tracking next frame
  194. average = mean(gray(cxtRegion));
  195. gray(cxtRegion).convertTo(context, CV_64FC1, 1.0, - average[0]);
  196. context = context.mul(hammingWin);
  197. learnSTCModel(context);
  198. }



runTracker.cpp

    1. // Fast object tracking algorithm
    2. // Author : zouxy
    3. // Date   : 2013-11-21
    4. // HomePage : http://blog.csdn.net/zouxy09
    5. // Email  : zouxy09@qq.com
    6. // Reference: Kaihua Zhang, et al. Fast Tracking via Spatio-Temporal Context Learning
    7. // HomePage : http://www4.comp.polyu.edu.hk/~cskhzhang/
    8. // Email: zhkhua@gmail.com
    9. #include "STCTracker.h"
    10. // Global variables
    11. Rect box;
    12. bool drawing_box = false;
    13. bool gotBB = false;
    14. // bounding box mouse callback
    15. void mouseHandler(int event, int x, int y, int flags, void *param){
    16. switch( event ){
    17. case CV_EVENT_MOUSEMOVE:
    18. if (drawing_box){
    19. box.width = x-box.x;
    20. box.height = y-box.y;
    21. }
    22. break;
    23. case CV_EVENT_LBUTTONDOWN:
    24. drawing_box = true;
    25. box = Rect( x, y, 0, 0 );
    26. break;
    27. case CV_EVENT_LBUTTONUP:
    28. drawing_box = false;
    29. if( box.width < 0 ){
    30. box.x += box.width;
    31. box.width *= -1;
    32. }
    33. if( box.height < 0 ){
    34. box.y += box.height;
    35. box.height *= -1;
    36. }
    37. gotBB = true;
    38. break;
    39. }
    40. }
    41. int main(int argc, char * argv[])
    42. {
    43. VideoCapture capture;
    44. capture.open("handwave.wmv");
    45. bool fromfile = true;
    46. if (!capture.isOpened())
    47. {
    48. cout << "capture device failed to open!" << endl;
    49. return -1;
    50. }
    51. //Register mouse callback to draw the bounding box
    52. cvNamedWindow("Tracker", CV_WINDOW_AUTOSIZE);
    53. cvSetMouseCallback("Tracker", mouseHandler, NULL );
    54. Mat frame;
    55. capture >> frame;
    56. while(!gotBB)
    57. {
    58. if (!fromfile)
    59. capture >> frame;
    60. imshow("Tracker", frame);
    61. if (cvWaitKey(20) == 27)
    62. return 1;
    63. }
    64. //Remove callback
    65. cvSetMouseCallback("Tracker", NULL, NULL );
    66. STCTracker stcTracker;
    67. stcTracker.init(frame, box);
    68. int frameCount = 0;
    69. while (1)
    70. {
    71. capture >> frame;
    72. if (frame.empty())
    73. return -1;
    74. double t = (double)cvGetTickCount();
    75. frameCount++;
    76. // tracking
    77. stcTracker.tracking(frame, box);
    78. // show the result
    79. stringstream buf;
    80. buf << frameCount;
    81. string num = buf.str();
    82. putText(frame, num, Point(20, 30), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 0, 255), 3);
    83. rectangle(frame, box, Scalar(0, 0, 255), 3);
    84. imshow("Tracker", frame);
    85. t = (double)cvGetTickCount() - t;
    86. cout << "cost time: " << t / ((double)cvGetTickFrequency()*1000.) << endl;
    87. if ( cvWaitKey(1) == 27 )
    88. break;
    89. }
    90. return 0;
    91. }

时空上下文视觉跟踪(STC)算法的解读与代码复现(转)的更多相关文章

  1. 时空上下文视觉跟踪(STC)算法

    论文原文以及Matlab代码下载 算法概述 而STC跟踪算法基于贝叶斯框架,根据跟踪目标与周围区域形成的的时空关系,在图像低阶特征上(如图像灰度和位置)对目标与附近区域进行了统计关系建模.通过计算置信 ...

  2. 时空上下文视觉跟踪(STC)

    论文的关键点是对时空上下文(Spatio-Temporal Context)信息的利用.主要思想是通过贝叶斯框架对要跟踪的目标和它的局部上下文区域的时空关系进行建模,得到目标和其周围区域低级特征的统计 ...

  3. ICCV2021 | 用于视觉跟踪的学习时空型transformer

    ​  前言  本文介绍了一个端到端的用于视觉跟踪的transformer模型,它能够捕获视频序列中空间和时间信息的全局特征依赖关系.在五个具有挑战性的短期和长期基准上实现了SOTA性能,具有实时性,比 ...

  4. TLD视觉跟踪算法(转)

    源:TLD视觉跟踪算法 TLD算法好牛逼一个,这里有个视频,是作者展示算法的效果,http://www.56.com/u83/v_NTk3Mzc1NTI.html.下面这个csdn博客里有人做的相关总 ...

  5. TLD视觉跟踪算法

    TLD算法好牛逼一个,这里有个视频,是作者展示算法的效果,http://www.56.com/u83/v_NTk3Mzc1NTI.html.下面这个csdn博客里有人做的相关总结,感觉挺好的,收藏了! ...

  6. paper 140:TLD视觉跟踪算法(超棒)

    我是看了这样的一个视频:http://www.56.com/u83/v_NTk3Mzc1NTI.html 然后在准备针对TLD视觉跟踪算法来个小的总结. 以下博文转自:http://blog.csdn ...

  7. 关于视觉跟踪中评价标准的相关记录(The Evaluation of Visual Tracking Results on OTB-100 Dataset)

    关于视觉跟踪中评价标准的相关记录(The Evaluation of Visual Tracking Results on OTB-100 Dataset) 2018-01-22  21:49:17 ...

  8. DIY一个基于树莓派和Python的无人机视觉跟踪系统

    DIY一个基于树莓派和Python的无人机视觉跟踪系统 无人机通过图传将航拍到的图像存储并实时传送回地面站差点儿已经是标配.假设想来点高级的--在无人机上直接处理拍摄的图像并实现自己主动控制要怎么实现 ...

  9. 视觉跟踪:MDnet

    应用需注明原创! 深度学习在2015年中左右基本已经占据了计算机视觉领域中大部分分支,如图像分类.物体检测等等,但迟迟没有视觉跟踪工作公布,2015年底便出现了一篇叫MDNet的论文,致力于用神经网络 ...

随机推荐

  1. ros使用RPLIDAR激光雷达

    1.首先下载RPLIDAR的驱动功能包 https://github.com/robopeak/rplidar_ros 2.然后解压放到~/catkin_ws/src目录下 3.执行catkin_ma ...

  2. Python中通过多个字符分割(split)字符串的方法

    python中字符串自带的split方法一次只能使用一个字符对字符串进行分割,但是python的正则模块则可以实现多个字符分割 import re re.split('-|_','sharejs_ha ...

  3. IT公司100题-1-二叉树转换为双链表

    问题描述: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 10   /   \  6      14/  \    /   \4   8 1 ...

  4. Spring学习笔记之初始化和销毁方法的调用次序

    Multiple lifecycle mechanisms configured for the same bean, with different initialization methods, a ...

  5. 【参考文献1】Word2010删除引用参考文献留下的横线

    那个莫名其妙不能选中,相信你也遇到.如果是这样,可能那个是尾注分隔符.你可以按照本文的方法解决.当然啦,这个也是按照网上的方法整理参考文献会留下的直线 Office Word2010 方法/步骤   ...

  6. 用C#感受MongoDB MapReduce之魅力 转

    MapReduce这个名词随着hadoop的用户的增多,越来越被人关注.MapReduce可谓MongoDB之中的亮点,我也想深入了解MapReduce,加上MongoDB操作简单,所以就选择了它.M ...

  7. App跳转至系统Settings

    很多著名和非著名的App有在App内通过某种方式跳转到系统Settings的功能.不论初心和交互,某认为这个功能用的好确实是很方便的,Control Center功能有限,Home键点击起来很累,至于 ...

  8. iOS 三种录制视频方式

    随着每一代 iPhone 处理能力和相机硬件配置的提高,使用它来捕获视频也变得更加有意思.它们小巧,轻便,低调,而且与专业摄像机之间的差距已经变得非常小,小到在某些情况下,iPhone 可以真正替代它 ...

  9. (转)javascript中event对象详解

    原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解          博客分类: javaScript JavaScriptCS ...

  10. 查看某个html标签有哪些属性和事件

    <html><head><script> //查看input标签有哪些属性和事件 function a() { var str = new String(" ...