目标跟踪学习算法DSST
原文:http://blog.csdn.net/gxb0505/article/details/52601613?locationNum=8
简介(Accurate Scale Estimation for Robust Visual Tracking)
DSST(Discriminative Scale Space Tracking)在2014年VOT上夺得了第一名,算法简洁,性能优异,并且我上一篇所述的KCF夺得了第三名,两者都是基于滤波器的算法,这一年是CF义军突起的一年,值得研究这些相近的优秀算法。这篇算法是基于MOSSE的改进,突出内容是加入了尺度变换,下面开始逐一讲解算法内容。
相关滤波器
首先讲一下MOSSE提出的相关滤波器,从目标中提取一系列的图像patches,记为f1,f2,...ft作为训练样本,其对应的滤波器响应值为一个个高斯函数g1,g2,...gt,而目的就是找到满足最小均方差(Minimum Output Sum of Squared Error)的最优滤波器:
其中第二个等号根据Parseval定理导出,等式左侧是空域的方程式,右侧是频域的方程式,正正是这个等式,使得我们将问题求解变换到频域里求解, ε的最小值在频域里的解如下:
一般而言, gj可以是任意形状的输出,这里的输出 gj是高斯型的函数,峰值位于中心处。这个方法的 技巧或者 目的在于:一是运算简洁,基本都是矩阵运算;二是引入快速傅里叶(FFT)大大加快运算效率。这即是相关滤波器被应用在Tracking并获得较好效果的原因,满足了对速度的一大需求。
在得到上述相关滤波器后,对于新的一帧中的候选输入样本z,求相关得分y:
y取最大响应值时对应的位置z为新的目标位置。
算法思想
算法设计了两个一致的相关滤波器,分别实现目标的跟踪和尺度变换,定义为位置滤波器(translation filter)和尺度滤波器(scale filter),前者进行当前帧目标的定位,后者进行当前帧目标尺度的估计。两个滤波器是相对独立的,从而可以选择不同的特征种类和特征计算方式来训练和测试。文中指出该算法亮点是尺度估计的方法可以移植到任意算法中去。
算法流程:如上图所示,通过左侧的图像patch目标提取的特征F和右侧的高斯型函数G,应用式(2)得到一个相关滤波器H。然后在下一帧将测试的图像patches提取特征Z作为输入,与相关滤波器H按照式(3)进行运算,得到响应值y最大的候选目标,所以算法很简洁。
该算法将输入信号f(图像中的某一个patch)设计为d维特征向量(可选gray,hog),通过建立最小化代价函数构造最优相关滤波器h,如下:
其中,l表示特征的某一维度,λ是正则项系数,作用是消除f频谱中的零频分量的影响,避免上式解的分子为零,如下:
由于patch中的每个像素点需要求解dxd维的线性方程,计算非常耗时,为了得到鲁棒的近似结果,对上式中分子Alt和分母Bt分别进行更新:
其中,η为学习率。
在新的一帧中,目标位置可以通过求解最大相关滤波器响应值得到:
快速尺度空间跟踪
本算法的亮点就是提出的基于一维独立的相关滤波器的尺度搜索和目标估计方法。具体操作方法是:在新的一帧中,先利用2维的位置相关滤波器来确定目标的新候选位置,再利用1维的尺度相关滤波器以当前中心位置为中心点,获取不同尺度的候选patch,从而找到最匹配的尺度。尺寸选择原则是:
其中, P,R分别为目标在前一帧的宽高, a=1.02为尺度因子, S=33为尺度的数量。上述尺度不是线性关系,而是由精到粗(从内到外的方向)的检测过程。
算法流程
论文中的流程图已经详细写的挺详细了,为了保持内容完整性再赘述一遍:
Input:
输入图像patch It
上一帧的位置Pt−1和尺度St−1
位置模型Atranst−1、Btanst−1和尺度模型Ascalet−1、Bscalet−1
Output:
估计的目标位置Pt和尺度St
更新位置Atranst、Btranst和尺度模型Ascalet、Bscalet
其中,
位置评估:
1.参照模板在前一帧的位置,在当前帧中按照前一帧目标尺度的2倍大小提取一个样本Ztrans
2.利用Ztrans和Atranst−1、Btanst−1,根据公式(7)计算ytrans
3.计算max(ytrans),得到目标新的位置Pt
尺度评估:
4.以目标当前新位置为中心,提取33种不同尺度的样本Ztrans
5.利用Ztrans和Atranst−1、Btanst−1计算出yscale
6.计算max(yscale),得到目标准确的尺度St
模型更新:
7.提取样本ftrans和fscale
8.更新位置模型Atranst和Btranst
9.更新尺度模型Ascalet和Bscalet
下面给出两个不同相关滤波器的关键代码:
训练部分:
%提取特征训练样本输入X%样本中每个像素点计算28维融合特征(1维原始灰度+27维fhog)%乘以二维hann后作为输入X%提取特征用于位置相关滤波器xl = get_translation_sample(im, pos, sz, currentScaleFactor, cos_window);%获取分子A=GF;分母B=F*F;此时没有lambdaxlf = fft2(xl);new_hf_num = bsxfun(@times, yf, conj(xlf));new_hf_den = sum(xlf .* conj(xlf), 3);%把每个样本resize成固定大小,分别提取31维fhog特征,每个样本的所有fhog再%串联成一个特征向量构成33层金字塔特征,乘以一维hann窗后作为输入X% 提取特征用于尺度相关滤波器xs = get_scale_sample(im, pos, base_target_sz, currentScaleFactor * scaleFactors, scale_window, scale_model_sz);%同样的获取分子A=GF;分母B=F*F;此时没有lambdaxsf = fft(xs,[],2);new_sf_num = bsxfun(@times, ysf, conj(xsf));new_sf_den = sum(xsf .* conj(xsf), 1);
检测部分:
%提取特征测试输入F%样本中每个像素点计算28维融合特征(1维原始灰度+27维fhog)%乘以二维hann后作为输入F%用于位置相关滤波器xt = get_translation_sample(im, pos, sz, currentScaleFactor, cos_window);%计算响应值y=F-1{(A*Z)/(B+lambda)}xtf = fft2(xt);response = real(ifft2(sum(hf_num .* xtf, 3) ./ (hf_den + lambda)));%找到max(y)得到目标新位置[row, col] = find(response == max(response(:)), 1);% 更新目标位置pos = pos + round((-sz/2 + [row, col]) * currentScaleFactor);%把每个样本resize成固定大小,分别提取31维fhog特征,每个样本的所有fhog再%串联成一个特征向量构成33层金字塔特征,乘以一维hann窗后作为输入F% 用于尺度相关滤波器xs = get_scale_sample(im, pos, base_target_sz, currentScaleFactor * scaleFactors, scale_window, scale_model_sz);%得到尺度变换的响应最大值y=F-1{(A*Z)/(B+lambda)}xsf = fft(xs,[],2);scale_response = real(ifft(sum(sf_num .* xsf, 1) ./ (sf_den + lambda)));%找到max(y)得到当前的尺度recovered_scale = find(scale_response == max(scale_response(:)), 1);% 更新当前尺度currentScaleFactor = currentScaleFactor * scaleFactors(recovered_scale);if currentScaleFactor < min_scale_factorcurrentScaleFactor = min_scale_factor;elseif currentScaleFactor > max_scale_factorcurrentScaleFactor = max_scale_factor;end
总结
DSST算法是一个非常典型且高效的基于相关滤波器的目标跟踪算法,非常值得学习和借鉴其中的思想和方法,尽管跟踪算法迭代很快,在15年的VOT上被深度学习的算法所取代,但是仍然有不少算法基于相关滤波器进行改进,所以学习这类算法是相当有益的。
心得:
两个滤波器位置滤波器和尺度滤波器分别进行跟踪和计算尺度,而且两个滤波器原理相同。
HOG是一个局部特征,如果对一大幅图片直接提取特征,是得不到好的效果,所以把图像分割成很多区块,然后对每个区块计算HOG特征,这也包含了几何(位置)特性
两个滤波器的实现方式很相似。但是有几点也不尽相同:
1、位移相关性滤波器(TF)在获取hog特征图时,是以2倍目标框大小的图像获取的。并且这个候选框只有一个,即上一帧确定的目标框。
而尺度相关性滤波器(SF)在获取hog特征图时,是以当前目标框的大小为基准,以33中不同的尺度获取候选框的hog特征图,即:
ss = (1:nScales) - ceil(nScales/2);
- 1
- 1
其理论依据是:
其中W和H分别代表目标框的宽度和高度,S代表尺度的个数。
SF的实践过程中,FFT(快速傅里叶变换)和IFFT(快速傅里叶反变换)都是一维变换,而TF则是二维空间的变换。
%得到的是样本的HOG特征图,并且用hann窗口减少图像边缘频率对FFT变换的影响
xt = get_translation_sample(im, pos, sz, currentScaleFactor, cos_window);
参考:http://blog.csdn.net/autocyz/article/details/48651013
带sse下载地址:http://www.cvl.isy.liu.se/en/research/objrec/visualtracking/scalvistrack/index.html
arm版本:
https://github.com/TuringKi/fDSST_cpp
目标跟踪学习算法DSST相关推荐
- 计算机视觉中,目标跟踪相关算法论文总结
目标跟踪相关算法&论文总结 作为小白,近期想看一些目标跟踪相关的内容,但又无从下手,花了几天时间,找各种资料,总结了网上大佬们写的文章.(大部分来自CSDN.知乎.微信公众号,均已注明出处) ...
- Jarry的目标跟踪学习笔记一
Jarry的目标跟踪学习笔记一 目标跟踪是计算机视觉中的一个重要方向,已经由来已久,并且有着广泛的应用,如:视频监控,人机交互, 无人驾驶等.在我的想象中,自己研究的内容就是,将来钢铁侠头盔里追踪敌人 ...
- opencv动态目标跟踪学习总结
用opencv实现对视频中动态目标的追踪 第一步,是要建立一个编程环境,然后加载opencv的库路径等等.具体步骤在 http://www.opencv.org.cn/ 的"安装" ...
- 传统目标跟踪——CamShift算法(改进MeanShift)
目录 一.CamShift 1.1 原理 二.流程 三.代码 四.总结 一.CamShift MeanShift的结果有一个问题,检测窗口的大小是固定的,而目标是一个由近到远逐渐变小的过程,固定的窗口 ...
- OpenCV 3 Tracking API目标跟踪学习笔记——定义、物体跟踪常用算法、demo
今天开始接触目标跟踪 本文翻译自https://www.learnopencv.com/object-tracking-using-opencv-cpp-python/#opencv-tracking ...
- 目标跟踪经典算法汇总(持续更新...)
如题,虽然这个问题是经典目标跟踪算法,但事实上,可能我们并不需要那些曾经辉煌但已被拍在沙滩上的tracker(目标跟踪算法),而是那些即将成为经典的,或者就目前来说最好用.速度和性能都看的过去trac ...
- 基于Python和OpenCV的目标跟踪学习教程 Object Tracking using Python and OpenCV
实现12种不同的算法来跟踪视频和网络摄像头中的对象! 你会学到: 使用Python和OpenCV跟踪视频和网络摄像头中的对象 理解跟踪算法的基本直觉 实现12种跟踪算法 了解对象检测和对象跟踪之间的区 ...
- 目标跟踪学习之MDNet
MDNet 一.摘要 二.论文的主要工作 三.Multi-Doamin Network(MDnet) 3.1.网络结构 3.2.学习算法 四.使用MDNet在线(Online)跟踪 4.1.Track ...
- 目标跟踪学习笔记_2(particle filter初探1)
首先提供几篇关于粒子滤波算法的博客: http://www.cnblogs.com/yangyangcv/archive/2010/05/23/1742263.html 这篇博客比较通俗易懂,简单的介 ...
最新文章
- 如何记录2秒内实现1800度转体+翻腾,百度智能云黑科技教你看懂跳水
- 使用HtmlHelper 写自己的 mvc 分页
- polybase配置 sql_Hadoop 的 PolyBase 配置和安全
- python中的计算符号
- Apache Tiles的基本使用
- BAT Java面试完整汇总:面试准备(心态+简历)+面试题目+6条面试经验
- clion 引用dll_用CLion实现本地方法并给java调用
- 【9603】最大整数
- Android 系统(229)---OTA
- 配置F5 负载均衡(转)
- ubuntu安装中文输入法fcitx
- Maya2018安装及激活教程
- 摩根大通从AWS和Azure挖人,云计算人才大战开始
- 华为笔试c语言,华为笔试算法题汇总
- EntityFramworkCore 配置种子数据(seeding data)
- 繁荣国家数学教育,坚持“知识共享”许可原则
- Python 取模运算(取余)%误区及详解
- 15款Java程序员必备的开发工具(转)
- 我想当计算机工程师英语翻译,工程师英语怎么说
- 机器学习基础 LR学习
热门文章
- 里海水位上升的原因_汽轮机真空下降的原因及处理
- python赋值符号前后的空格_191012 python3关于空格打印、赋值、+=符号的小坑
- PLSQL Developer 插入中文 乱码问题,如图 这个是由于oracle服务器端字符编码 和 Oracle 客户端 字符编码不一致引起的。 检查Oracle服务器端字符编码,用 sel
- mysql8.0远程linux_【Linux】【mysql】mysql8.0开启远程访问及常见问题
- html语言剖析,HTML语言剖析(十三) 其他标记
- android富文本图片自适应,Android Span富文本图文混排 - ImageSpan(图文垂直居中)...
- python logging模块使用_python logging模块使用
- 计算机操作系统课设总结,计算机操作系统课程设计
- c语言遇到非法字符,98行的四则计算器.(支持括号)加入了非法字符的检测
- Java 9 - 17 特性解读:Java 9