以代码的脉络理解KCF论文思想

以代码的脉络理解KCF论文思想

1:void init(const cv::Rect &roi, cv::Mat image);
第一帧图像用来初始化。里面有两个重要步骤, cv::Mat getFeatures(const cv::Mat & image, bool inithann, float scale_adjust = 1.0f);和void train(cv::Mat x, float train_interp_factor);
getFeatures()函数用来提取特征
步骤:
① 根据目标位置,在对应视频上截取适当大小ROI。这里有三个重要参数,padding,template_size和cell_size。将原来目标width,height各自扩大padding倍,选边长大的一边,使其等于template_size,计算出扩大的倍数,使另一边以同样的倍数扩大,最后各自加上cell_size * 2,得到新的_tmpl_sz长宽大小。
② 在视频帧中,在目标原位置,大概截取目标扩大padding倍之后大小的ROI,然后resize到_tmpl_sz大小,得到送入HOG中提取特征的最终图像patch.如下图中,
以代码的脉络理解KCF论文思想_第1张图片
红色虚线为目标位置,其他实线框为patch循环位移产生的其他样本。
③ 对样本提取HOG特征,然后经PCA降维,得到31维特征。
④ 对样本提取Lab特征,得到15维特征(设置的)。
⑤ 两者特征融合,即直接将15维的Lab特征,拼接在31维的HOG特征后面,最终形成46维特征。
train()函数用来训练。 初始化时,通过高斯核运算,得到自相关矩阵,然后经过简单的线性运算,得到初始帧的特征矩阵及权重矩阵。
2,cv::Rect update(cv::Mat image);
后续帧用来更新。里面有两个重要的步骤, cv::Rect update(cv::Mat image);和void train(cv::Mat x, float train_interp_factor);
update() 更新目标位置。
步骤:
① 计算上一帧特征图与这帧特征图的互相关,返回互相关最大的响应值以及最大响应值位置。
② 分别计算三个不同尺寸的特征图与上一帧特征图计算互相关,返回最终最大的响应值以及响应值位置。作为目标更新的位置。
train() 函数用来训练。与初始化时的训练过程一样,区别在于更新时的训练,产生的当前帧特征图主要是历史特征,当前帧特征权重很小。

你可能感兴趣的:(跟踪)