相关滤波之开篇Mosse原理及代码详解

article/2025/9/29 20:50:18

相关滤波之开篇Mosse原理及代码详解

  • 相关滤波(Correlation Filter )介绍
  • 代码解读
  • 程序框图

本文主要介绍相关滤波算法开篇——mosse具体原理及其python代码实现流程

相关滤波(Correlation Filter )介绍

相关滤波(CF)源于信号处理领域,有这么一句话“两个信号越相似,其相关值越高。在跟踪,就是找到与跟踪目标响应最大的项” 贯穿了整个相关滤波算法的根本。

2010年CVPR,David S.Bolme在文章《visual object tracking using adaptive correlation filters》中首次将相关滤波用在了跟踪领域,在其文章的基础之上,很多改进的算法相继出现,跟踪的效果也越来越好。

两个信号之间的相关为,
( f ⊗ g ) ( τ ) = ∫ ∞ − ∞ f ∗ ( t ) g ( t + τ ) d t (f\otimes g)(\tau)=\int_\infty^{-\infty}f^*(t)g(t+\tau)dt (fg)(τ)=f(t)g(t+τ)dt ( f ⊗ g ) ( n ) = ∑ − ∞ ∞ f ∗ [ m ] g ( m + n ) (f\otimes g)(n)=\sum_{-\infty}^\infty f^*[m]g(m+n) (fg)(n)=f[m]g(m+n) 其中f表示f的复共轭。correlation的直观解释就是衡量两个函数在某个时刻相似程度。
在图像中相关滤波意思就是输入图像(框选的目标)跟滤波器之间做一个相关操作,相关操作类似卷积操作(卷积需要反转,相关不用),相关操作如下图所示。
在这里插入图片描述
这里要注意输入图像f,滤波器h,及相应输出g的大小是完全一样的。

在这里插入图片描述
相关滤波意思就是现在在第一帧图像中框选了一个目标,然后对这个目标训练一个滤波器(大小相同)使得其输出响应g(大小相同)在中间值最大。其中输入图像给定,响应图也是可以直接生成的。一般都是用高斯函数,中间值最大,旁边逐渐降低。

然后滤波器的值推导过程类似于机器学习的线性回归
m i n H ∗ = ∑ i = 1 m ∣ H ∗ F i − G i ∣ 2 min_{H^*}=\sum _{i=1}^m|H^*F_i-G_i|^2 minH=i=1mHFiGi2
就是要找一个滤波器H*使得其上式的结果最小,其实也就是找到一个滤波器,使得其响应在中间的值最大,这就是利用了相关滤波器的原理。
然后根据数学求导,各种计算规则(有兴趣的可以看下原来论文,步骤很详细,这里就不展示了),最终可以得到
H w v = ∑ i F i w v G i w v ∗ ∑ i F i w v F i w v ∗ H_{wv}={\sum _i F_{iwv}G^*_{iwv}\over \sum _i F_{iwv}F^*_{iwv} } Hwv=iFiwvFiwviFiwvGiwv上面得到是H中每个元素的值,最后得到H为:
H = ∑ i F i ⋅ G i ∗ ∑ i F i ⋅ F i ∗ H={\sum _iF_i\cdot G^*_i \over \sum _iF_i\cdot F^*_i } H=iFiFiiFiGi上式就是滤波器的模型公式。
其中的G为高斯函数矩阵的傅里叶变换,F为输入目标图矩阵的傅里叶变换,都是用的快速傅里叶变换(FFT),这块不懂的可以查看快速傅里叶变换

然后为了具有更好的鲁棒性,滤波器采用迭代的方法 H t = A t B t H_t={A_t\over B_t} Ht=BtAt A t = η F t ⋅ G t ∗ + ( 1 − η ) A t − 1 A_t=\eta F_t \cdot G^*_t +(1-\eta)A_{t-1} At=ηFtGt+(1η)At1 B t = η F t ⋅ F t ∗ + ( 1 − η ) B t − 1 B_t=\eta F_t \cdot F^*_t +(1-\eta)B_{t-1} Bt=ηFtFt+(1η)Bt1更新参数为η,每一帧的滤波器都与上一帧的取值有关。
至此,第一帧图像目标框选之后就得到了一个设计好的滤波器,然后对第二帧图像提取目标区域对其与刚才的滤波器先进行傅里叶变换进行卷积之后逆向傅里叶变换找最大响应值,这个响应值的位置就是第二帧图像的待追踪目标的中心。

每一步目标图像在傅里叶变换前还要进行一些预处理
(1)FFT卷积算法需要将图像和滤波器映射到拓扑结构上,边界采用循环图像的方式填充,即将图像的左边缘连接到右侧边缘,将顶部连接到底部。
(2)采用点乘余弦窗处理,使图像边缘慢慢变成零。
在代码中都有所体现

接下来讲代码,附上GitHub链接
是python代码(因为对python比较熟悉)
项目根目录下主要有
datasets文件夹(用于存放跟踪图片集)
examples文件夹(用于存放gif动图,可不用)
demo.py (主程序,用于初始化参数,及运行各个函数)
mosse.py(跟踪算法的实现)
utils.py(一些图像处理操作)

代码解读

接下来分别介绍下各个具体模块的代码首先是主程序demo.py

from mosse import mosse
import argparseparse = argparse.ArgumentParser()
parse.add_argument('--lr', type=float, default=0.125, help='the learning rate')
parse.add_argument('--sigma', type=float, default=100, help='the sigma')
parse.add_argument('--num_pretrain', type=int, default=128, help='the number of pretrain')
parse.add_argument('--rotate', action='store_true', help='if rotate image during pre-training.')
parse.add_argument('--record', action='store_true', help='record the frames')if __name__ == '__main__':args = parse.parse_args()img_path = 'datasets/surfer/'tracker = mosse(args, img_path)tracker.start_tracking()

其中下半部分为主程序,进行参数的赋值,图像路径的赋值,跟踪器的设计,开始跟踪
上半部分为参数的赋值,为python自带模块argparse 的使用。

其次是
mosse.py
这里定义了一个mosse类 用于mosse算法的实现
主要就是一个方法

    def start_tracking(self):# 得到图像的第一帧init_img = cv2.imread(self.frame_lists[0])init_frame = cv2.cvtColor(init_img, cv2.COLOR_BGR2GRAY)init_frame = init_frame.astype(np.float32)# 在第一帧中框选中需要的目标区域init_gt = cv2.selectROI('demo', init_img, False, False)init_gt = np.array(init_gt).astype(np.int64)# 得到当前的高斯响应response_map = self._get_gauss_response(init_frame, init_gt)# 得到目标图像大小的高斯响应图g = response_map[init_gt[1]:init_gt[1]+init_gt[3], init_gt[0]:init_gt[0]+init_gt[2]]#原始图像fi = init_frame[init_gt[1]:init_gt[1]+init_gt[3], init_gt[0]:init_gt[0]+init_gt[2]]#进行傅里叶变换G = np.fft.fft2(g)# 预处理Ai, Bi = self._pre_training(fi, G)# 开始跟踪for idx in range(len(self.frame_lists)):current_frame = cv2.imread(self.frame_lists[idx])frame_gray = cv2.cvtColor(current_frame, cv2.COLOR_BGR2GRAY)frame_gray = frame_gray.astype(np.float32)if idx == 0:Ai = self.args.lr * AiBi = self.args.lr * Bipos = init_gt.copy()clip_pos = np.array([pos[0], pos[1], pos[0]+pos[2], pos[1]+pos[3]]).astype(np.int64)else:Hi = Ai / Bifi = frame_gray[clip_pos[1]:clip_pos[3], clip_pos[0]:clip_pos[2]]fi = pre_process(cv2.resize(fi, (init_gt[2], init_gt[3])))Gi = Hi * np.fft.fft2(fi)gi = linear_mapping(np.fft.ifft2(Gi))# 找到最大的响应点,这就是第二帧的目标位置max_value = np.max(gi)max_pos = np.where(gi == max_value)dy = int(np.mean(max_pos[0]) - gi.shape[0] / 2)dx = int(np.mean(max_pos[1]) - gi.shape[1] / 2)# 更新位置信息pos[0] = pos[0] + dxpos[1] = pos[1] + dy# trying to get the clipped position [xmin, ymin, xmax, ymax]clip_pos[0] = np.clip(pos[0], 0, current_frame.shape[1])clip_pos[1] = np.clip(pos[1], 0, current_frame.shape[0])clip_pos[2] = np.clip(pos[0]+pos[2], 0, current_frame.shape[1])clip_pos[3] = np.clip(pos[1]+pos[3], 0, current_frame.shape[0])clip_pos = clip_pos.astype(np.int64)# get the current fi..fi = frame_gray[clip_pos[1]:clip_pos[3], clip_pos[0]:clip_pos[2]]fi = pre_process(cv2.resize(fi, (init_gt[2], init_gt[3])))# online update...Ai = self.args.lr * (G * np.conjugate(np.fft.fft2(fi))) + (1 - self.args.lr) * AiBi = self.args.lr * (np.fft.fft2(fi) * np.conjugate(np.fft.fft2(fi))) + (1 - self.args.lr) * Bi#可视化跟踪序列图像cv2.rectangle(current_frame, (pos[0], pos[1]), (pos[0]+pos[2], pos[1]+pos[3]), (255, 0, 0), 2)cv2.imshow('demo', current_frame)cv2.waitKey(100)# if record... save the frames..if self.args.record:frame_path = 'record_frames/' + self.img_path.split('/')[1] + '/'if not os.path.exists(frame_path):os.mkdir(frame_path)cv2.imwrite(frame_path + str(idx).zfill(5) + '.png', current_frame)

整个流程基本与mosse算法原理一致,对照着原理,把这个推导一遍,会更加好理解这个算法基本原理

utils.py里面主要就是对图像进行一些预处理比如图像线性映射,进行点乘余弦窗处理,使图像边缘慢慢变成零,图像反转操作等。

程序框图

以上就是整个mosse算法的原理及代码流程,最后附上一张流程框图,结合去看,会理解的更加深入。
mosse代码流程图
先写到这里,第一次写博客,很多不是很完善,之后慢慢改。。


http://chatgpt.dhexx.cn/article/bD4H0Jqo.shtml

相关文章

目标跟踪 MOSSE(Visual Object Tracking using Adaptive Correlation Filters)

文章标题:《Visual Object Tracking using Adaptive Correlation Filters》 文章地址:http://citeseerx.ist.psu.edu/viewdoc/download?doi10.1.1.294.4992&reprep1&typepdf 文章代码:(python)https://github…

MOSSE相关滤波跟踪算法

参考博客: MOSSE算法的理解 MOSSE MOSSE代码 0 基础知识: 接上一篇 单目标跟踪综述,本文主要从MOSSE算法开始追溯相关滤波算法的起源(ps.这里让我想到了刺客信条里的起源)。 1. 先理解 相关操作和卷积操作&#x…

MOSSE 目标跟踪 解析

MOSS (Minimum Output Sum of Squared Error filter)(2010) 这篇文章是最早将相关的思想用到目标跟踪领域的。 相关滤波的思想:越是相关的两个目标相关值越大,也就是视频帧中与初始化目标越相似&#xff…

MOSSE相关滤波跟踪算法(二)

参考博客: 图像卷积与滤波 0 基础知识 接上一篇MOSSE相关滤波跟踪算法 线性滤波与卷积的基本概念 线性滤波过程:使用一个二维的滤波器矩阵(卷积核)在一副二维图像上滑动,对图像上每一个像素点,计算它的领…

Moss~

今年 2 月份,机器之心报道了复旦大学推出中国版 ChatGPT 的消息(参见《复旦发布中国版 ChatGPT:MOSS 开启测试冲上热搜,服务器挤爆》),引起了广泛关注。当时,邱锡鹏教授就曾表示将于四月份开源 …

目标跟踪经典论文阅读(1)MOSSE

摘要 虽然不常用,但相关滤波器可以通过旋转、遮挡和其他干扰来跟踪复杂的物体,其速度是目前最先进技术的20倍以上。最古老和最简单的相关滤波器使用简单的模板,通常在应用于跟踪时失败。更现代的方法,如ASEF和UMACE表现更好&…

CVPR2010跟踪算法MOSSE原理及代码解析

文章和代码下载地址: MOSSE: David S. Bolme, J. Ross Beveridge, Bruce A. Draper, Yui Man Lui. "Visual Object Tracking using Adaptive Correlation Filters." GitHub - xingqing45678/Mosse_CF(代码和文章都在里面) 看了…

相关滤波跟踪·MOSSE算法的梳理

相关滤波跟踪是当前目标检测与跟踪领域的一个研究热点,ICCV2010的这篇MOSSE算法可以说是入门必看,镇圈神作了。 一、目的:跟踪 一开始分不清跟踪和目标检测有什么不同,所以查了一些资料,以下只是我自己的理解&#x…

《MOSSE》简述

引言 近些年来,目标追踪备受关注。一系列较鲁棒的追踪策略被提出,来适应目标外观的变化。最近的算法有增量目标追踪 IVT,鲁棒的基于目标分块的跟踪 Frag Track,甄别学习 GBDL 以及多实例学习。这些技术是有效的,但是技…

MOSSE算法推导

引言 MOSSE是在Visual Object Tracking using Adaptive Correlation Filters这篇文章中提出来的,MOSSE的全称是Minimum Output Sum of Squared Error,令平方误差和最小来计算得到滤波器。 算法流程 相关滤波很容易理解,一帧图像经过相关运算…

相关滤波目标追踪一:鼻祖Mosse算法的matlab解析

一些自己的见解,如有不同观点,可以一起讨论。 github地址:https://github.com/Ronales/Mosse_Tracking_matlab 补充:说一下mosse的更新策略: 1. "论文目标就是找到一个滤波器h,使其在输入图像上&am…

CV应用领域-目标跟踪-MOSSE

MOSSE(Minimum Output Sum of Squared Error) MOSSE是在Visual Object Tracking using Adaptive Correlation Filters这篇文章中提出来的,MOSSE的全称是Minimum Output Sum of Squared Error,令平方误差和最小来计算得到滤波器。…

mosse

MOSSE MOSSE(Minimum Output Sum of Squared Error) 是2010年 的CVPR,它的全名叫做Visual Object Tracking using Adaptive Correlation Filters。 MOSSE 是第一篇将correlation filter(CF) 引入object tracking 的论文,它也是CSK和KCF/DCF等算法的基础。…

【目标跟踪】|MOSSE原理及对应代码解释 matlab C

1原理 https://www.bilibili.com/video/av74302620/?spm_id_from333.788.videocard.0 https://blog.csdn.net/fzp95/article/details/78385795?utm_mediumdistribute.pc_relevant.none-task-blog-baidujs_title-4&spm1001.2101.3001.4242 相关和卷积操作》 https://bl…

单目标跟踪MOSSE详细算法步骤+理论说明

单目标跟踪MOSSE详细算法步骤理论推导 算法概述详细步骤候选框处理初始滤波器生成滤波器更新 理论说明对数变换(log函数)窗函数的理解 更新中 为了理解傅里叶变换,花了一周时间,可惜还是没有搞很清楚原理,暂且将其看作是数学家从浩瀚的知识海…

MOSSE相关滤波目标跟踪论文

论文全名:Visual Object Tracking using Adaptive Correlation Filters 论文摘自CVPR 2010,由David S. Bolme、J.Ross Beveridge、Bruce A. Draper与Yui Man Lui撰写,简称MOSSE。 摘要 虽然不常用,但相关滤波器可以通过旋转&…

上海2022年平均工资为12184,涨幅只有6.9%

大家好!我是韩老师。 到了每年的7月份,就是上海调整社保和公积金基数的时候了。 今天,上海人社局发布了有关民生保障待遇及社会救助待遇调整,其中最重要的信息透露了上海市2022年度职工月平均工资,即上海市2023年度社保…

上海市人才引进落户条件有哪些

在沪工作稳定,专业(业绩)与岗位相符,一般应能在本单位工作五年以上,且符合下列条件之一: 1、具有博士研究生学历并取得相应学位或者具有高级专业技术职务任职资格并受聘相应职务的专业技术人员和管理人员。 2、获得省部级及以上政府奖励的人员。 3、国家重大科技专项项…

全国平均工资水平排序 北京上海西藏居前三名

全国工资排序 你的工资涨了吗?省统计局昨日发布的数据显示,今年三季度末,江苏省城镇单位在岗职工平均工资达到21999元,比上年同期增加3211元,增长17.1%。这意味着1-9月份平均每月同比增收356元左右。 金融业平均工资排…