【目标跟踪】相关滤波算法之MOSSE
简要
2010年David S. Bolme等人在CVPR上发表了《Visual Object Tracking using Adaptive Correlation Filters》一文,首次将相关滤波器引入到目标跟踪当中。该算法大幅提高了目标跟踪的性能,论文实验结果可达到669FPS的速度。这相比同期间的跟踪算法可以算是一个极大的飞跃。本文将以该论文作为分析一类基于相关滤波的目标检测算法的引子。
基于相关滤波的跟踪
MOSSE算法的创新的在于,它是第一篇将相关滤波引入到目标跟踪的领域的论文。其思想是构造一个滤波模板 \(h\),使用该模板与图像序列帧 \(f\) (此处解释下,f指的是输入图像中框定的目标区域,也称为目标窗口,并非整个图像帧)做卷积运算,根据得到的响应输出\(g\)来确定目标在新的一帧图像中的位置。
\[g=f \ast h\]
上式的符号\(\ast\)表示卷积运算。对于输入图像的2维快速傅里叶变换有\(F=\mathcal{F}(f)\),而对模板\(h\)的变换为\(H=\mathcal{F}(h)\)
根据傅里叶变换的性质,时空域\(f\)和\(h\)的卷积运算可以转换为傅里叶频域的点乘运算,有如下式子:
\[G=F\bigodot H^\ast\]
上式 \(H^\ast\) 表示为\(H\)的共轭复,\(\bigodot\)表示为点乘运算。
由此时空域的卷积运算转化为频域的点乘运算,将有助于提高运算速度,事实上后来的大部分改进算法也是基于这个性质进行的。
MOSSE滤波器
前面可知,基于相关滤波的目标跟踪算法核心是用滤波模板与图像序列做卷积运算来确定目标的位置,那么对与滤波模板的求解是算法的核心。
MOSSE全称是Minimum Output Sum of Squared Error ,算法开始需要有一组训练图像\(f{_i}\)和期望的训练输出\(g{_i}\)。\(g{_i}\)通常是以目标为中心,\(\sigma\)为方差生成的一个高斯矩阵。由此滤波模板\(H\)的计算如下:
\[H{_i^\ast} = \frac{G{_i}}{F{_i}}\]
上式是对单独一帧图像计算滤波模板的,但是在实际情况下滤波模板需要能够适应整个图像序列。MOSSE的滤波其要求对于视频序列的所有实际输出和期望输出的平方误差最小,即:
\[\underset{H^\ast}{min} \underset{i} {\sum} \begin{vmatrix} F_i \bigodot H^\ast - G_i \end{vmatrix}^{2}\]
该式的求解非本文重点,有兴趣的读者可以翻阅原论文的附录。该式子的求解结果如下:
\[H^\ast = \frac{\sum_i G_i \bigodot F^\ast_i}{\sum_i F_i \bigodot F^\ast_i}\]
分子是输入图像与期望的输入图像的卷积,而分母则是输入图像的能量谱图。
UMACE和ASEF滤波器
该论文虽然叫做MOSSE算法,不仅使用了Minimum Output Sum of Squared Error滤波器,其算法框架可以简单的将MOSSE滤波其替换为UMACE和ASEF等滤波器。
文中给出了UMACE和ASEF滤波其的求解形式。
UMACE滤波器形式如下:
\[H^\ast = \frac{\sum_i F^\ast_i}{\sum_i F_i \bigodot F^\ast_i}\]
可以看出其与MOSSE区别在于分子部分。
ASEF滤波器如下:
\[H^\ast = \frac{1}{N} \sum_i \frac{ G_i \bigodot F^\ast_i}{F_i \bigodot F^\ast_i}\]
对于ASEF滤波器因为输入图像的能量谱图\({F_i \bigodot F^\ast_i}\)在某些情况下可能接近与零,于是使用\({F_i \bigodot F^\ast_i + \varepsilon }\)替代。
滤波器初始化与更新
初始化
上诉的三个滤波其公式可以看到下标i,其表示的是多帧图像帧。MOSSE算法在初始化的时候需要一组训练图像和期望输出。那么这些训练数据是如何获得的?
作者给出的方案是,对第一个目标窗口\(f_i\)进行八个仿射变换得到一组训练图像,而\(g_i\)则以目标中心生成高斯矩阵。
更新
因为一个视频序列会有关照、旋转、尺度等变换,所以需要滤波器进行更新以便滤波器适应环境的变化。该论文使用了滑动平均值作为更新策略,这是很常用的更新方式。
对于ASEF和MOSSE的更新方式有稍许不同。ASEF滤波其的更新方式如下:
\[H_i^\ast = \eta \frac{G_i \bigodot F_i^\ast}{F_i \bigodot F_i^\ast} + (1-\eta)H_{i-1}^\ast\]
其中\(\eta\)为学习因子。而MOSSE更新方式如下。
\[H_i^\ast = \frac{A_i}{B_i}\]
\[A_i=\eta G_i \bigodot F_i^\ast+(1-\eta)A_{i-1}\]
\[B_i=\eta F_i \bigodot F_i^\ast+(1-\eta)B_{i-1}\]
从ASEF和MOSSE滤波其的形式不难看何其更新方式的不同。
其他
到这里,MOSSE算法的主要思想其实已经解释完了,但是还存在几个要点需要提及
检测
前文说目标的位置通过响应输出\(g\)来确定,其实就是通过频域计算出\(G=F\bigodot H^\ast\),再进行逆傅里叶变换求出\(g\),\(g\)矩阵的最大值就是目标的位置
\(G_i\)究竟指的是啥?
原文论文中对与\(g_i\)和\(G_i\)的阐述不够清晰,可能大部分读者会疑惑,哪个是响应输出?哪个是期望的响应输出?
- 期望的响应输出指的是,期望经过滤波模板卷积后得到的输出,该输出是符合高斯分布的。MOSSE的平方误差中,\(F_i \bigodot H^\ast\)指的是目标窗口和滤波模板卷积后的响应输出的傅里叶变换,而\(G_i\)指的是期望得到的输出的傅里叶变换,这个输出要符合高斯分布。
- 初始化过程中生成了一组期望的响应输出\(g_i\),这组训练数据通过更新滤波器的公式,初始化了滤波器。而在随后的检测更新过程中,\(g_i\)是以\[g=f_{i} \ast h_{i-1}\]响应输出的最大值坐标作为目标中心点而生成的高斯矩阵。
听着很绕口,其实简单的说,在检测过程中,更新滤波器公式使用的\(G_i\)是以当前目标位置作为中心的。
预处理
对图像和滤波器进行卷积操作会将其映射到拓扑空间中,形成圆环性,即左边与右边相连,上边与下边相连。这样可能会影响到检测的正确性。其原因是因为当左边和右边连接,在傅里叶域中计算时候,可能在边界上会产生高的响应值,而使目标位置定位到边界上。故预先对图像乘上一个\(\cos\)窗口,以减小影响。这个方法在随后改进的算法中经常使用到。
【目标跟踪】相关滤波算法之MOSSE的更多相关文章
- ICCV2013 录用论文(目标跟踪相关部分)(转)
单目标(表观模型): 1. Seunghoon Hong, BohyungHan. Orderless Trackingthrough Model-Averaged Density Estimatio ...
- 挑战目标跟踪算法极限,SiamRPN系列算法解读
商汤科技智能视频团队首次开源其目标跟踪研究平台 PySOT.PySOT 包含了商汤科技 SiamRPN 系列算法,以及刚被 CVPR2019 收录为 Oral 的 SiamRPN++.此篇文章将解读目 ...
- 基于MeanShift的目标跟踪算法及实现
这次将介绍基于MeanShift的目标跟踪算法,首先谈谈简介,然后给出算法实现流程,最后实现了一个单目标跟踪的MeanShift算法[matlab/c两个版本] csdn贴公式比较烦,原谅我直接截图了 ...
- 目标跟踪之ECO:Efficient Convolution Operators for Tracking
一. 相关滤波算法总结 作者首先分析了 影响相关滤波算法效率 和 导致过拟合 的几个原因: 1)Model Size (模型大小) 包括两个方面: - 模型层数,对应多分辨率 Sample,比如多层 ...
- 目标跟踪之相关滤波:CF及后续改进篇
一. 何为相关滤波? Correlation Filter 最早应用于信号处理,用来描述两个信号之间的相关性,或者说相似性(有点像早期的概率密度),先来看定义: 对于两个数据 f 和 g,则两个信号的 ...
- 目标跟踪之粒子滤波---Opencv实现粒子滤波算法
目标跟踪学习笔记_2(particle filter初探1) 目标跟踪学习笔记_3(particle filter初探2) 前面2篇博客已经提到当粒子数增加时会内存报错,后面又仔细查了下程序,是代码方 ...
- 视觉目标跟踪算法——SRDCF算法解读
首先看下MD大神2015年ICCV论文:Martin Danelljan, Gustav Häger, Fahad Khan, Michael Felsberg. "Learning Spa ...
- Video Target Tracking Based on Online Learning—TLD单目标跟踪算法详解
视频目标跟踪问题分析 视频跟踪技术的主要目的是从复杂多变的的背景环境中准确提取相关的目标特征,准确地识别出跟踪目标,并且对目标的位置和姿态等信息精确地定位,为后续目标物体行为分析提供足 ...
- TLD目标跟踪算法
1. 简介 TLD目标跟踪算法是Tracking-Learning-Detection算法的简称.这个视频跟踪算法框架由英国萨里大学的一个捷克籍博士生Zdenek Kalal提出.TLD将传统的视频跟 ...
随机推荐
- 搜索插入位置的golang实现
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 输入: [,,,], 输出: 输入: [,,,] ...
- visual studio code前端插件及常用快捷键【转】
通用插件 HTML Snippets 超级实用且初级的 H5代码片段以及提示 HTML CSS Support 让 html 标签上写class 智能提示当前项目所支持的样式新版已经支持scss文件检 ...
- PostgreSQL 空间处理函数
PostGIS中的常用函数 以下内容包括比较多的尖括号,发布到blogger的时候会显示不正常,内容太多我也无暇一个个手动改代码,因此如有问题就去参考PostGIS官方文档. 首先需要说明一下,这里许 ...
- jQuery.form 的最新版本是 3.14
http://www.oschina.net/news/32628/jquery-form-3-14 有日子没跟进 jQuery.form 插件了,该插件已经从 2.xx 更新到 3.xx 了,目前最 ...
- attachBaseContext
at android.content.ContextWrapper.attachBaseContext(ContextWrapper.java:66) at android.view.ContextT ...
- android 布局文件中xmlns:android="http://schemas.android.com/apk/res/android"
http://blog.163.com/benben_long/blog/static/199458243201411394624170/ xmlns:android="http://sch ...
- UVA806-Spatial Structures(四分树)
Problem UVA806-Spatial Structures Accept:329 Submit:2778 Time Limit: 3000 mSec Problem Description ...
- Qt Creator中如何选择某个子项目为启动项目
Qt Creator中的子目录项目类似于Visual Studio中的Solution(解决方案),可以用来管理多个子项目.但是在Qt Creator IDE中由不能像Visual Studio中那样 ...
- java 二维数组和对象数组
1.二维数组:二维数组就是存储一维数组(内存地址/引用)的数组 2.二维数组的初始化 1) int intA[][]={{1,2},{2,3},{3,4,5}}; 2) int [][] intB=n ...
- odoo系统之产品表
# 输入产品带出它默认的包装方式\单位\品名\规格 def get_product_unit(self, cr, uid,ids,product_id,pcust_order_no,pdate_pla ...