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

article/2025/9/29 21:19:51

一些自己的见解,如有不同观点,可以一起讨论。

github地址:https://github.com/Ronales/Mosse_Tracking_matlab

补充:说一下mosse的更新策略:

1. "论文目标就是找到一个滤波器h,使其在输入图像上,跟踪的目标上的位置响应值最大。f表示训练图像,g表示响应输出,h表示滤波器,F,G,H对应其频域值(均为傅里叶变换后的值)。"这句话谁都能懂,落到实处就是:

(1)初始状态(第一帧),我们首先框选一副图像的某一个人的位置,则按照人体目标框选位置裁剪出来的局部图像就是f有了。

(2)由于mosse是一个在线更新的阶段,即响应输出g得到的坐标位置应当作为下一帧更新的输入提供位置裁切参考。这样一来初始状态没有同时具有f和g的条件。(初值状态只有手动框选的一个目标位置),则就无法初始化滤波器h。

这里需要将裁剪出来的局部图像f进行仿射变换,得到128张图像fi。模拟不稳定状态下的请情况,此时这128次仿射变化得到的响应图g最终结果应当为手动框选的那一张局部图f产生的响应值。这样在初始状态下,就能极大情况的模拟各种情况滤波器的情况,构造一个较强的h,以便后续帧进行在线更新。

############################## 响应图的解释:##############################

(3)按照公式,我们还需要一个响应输出G(傅里叶变换g后得到)。这个G怎么来呢。在作者的代码中的实现为:

center = [rect(2)+rect(4)/2 rect(1)+rect(3)/2];%获得矩形框的中心点纵,横坐标(高 宽)即第一帧图像的中心点
sigma = 100;gsize = size(im);   %获取第一帧图片的尺寸:高 宽 3通道
[R,C] = ndgrid(1:gsize(1), 1:gsize(2)); %ndgrid 生成gsize(1)xgsize(2)的高维矩阵,参数1代表纵向/参数二代表横向
%ndgrid用法:https://blog.csdn.net/u012183487/article/details/76149279
%产生高斯形状的理想响应g
g = gaussC(R,C, sigma, center);  %调用高斯函数,得到高斯图

怎么解释呢?我们得到的第一帧的图片尺寸,先建立起一个二维矩阵,这个二维矩阵的R和C分别代表横坐标和纵坐标。通过左右两个矩阵的值(比如R矩阵取2,C矩阵取10).则映射到这一帧图像每个坐标点的“候选样本”的目标中心点坐标)。(相当于R,C提供索引值确定数组对应位置的值一样。)

(4)于是我们就按照R,C的索引,将得到的第一帧图像输入到高斯函数中,而center作为目标中心点,也传入进去。最终得到了当前帧所有坐标点的一个响应值输出g(因为一张图里有很多个坐标点,所有坐标点得到的响应值即组成了一张响应值图,多个目标则有多个峰值)。(顶峰就代表那一个坐标点对应的其实就是目标中心点的响应值输出g)

############################## 响应图的解释:##############################

(5)根据第一帧初始状态的仿射变换与相关计算,,通过最小化该函数,求得初始化后的H。此外,大写字母(F H G)均为傅里叶变化后的对应(f h g),目的是为了加速运算。

所以我们就得到了当前帧求得的滤波器H。这样也就方便该滤波器和下一帧图片进行计算,最终得出最大响应值。即为下一帧的目标中心点。获得了下一帧的目标中心点后,我们则可按照上述求解滤波器的方法对H进行更新。依次循环(这是对G/F=H这个公式的理解;它的目的是找到一个滤波器可以通过上一帧找到这一帧的目标中心点)

TIPS:

按照这个思想,mosse算法提出的和这个大同小异。也用到了响应图输出G和F。因为Ai-1和Bi-1在第一帧没有数值,所以就设为0,以此来初始化Ai和Bi。

(6)在后续在线更新过程中,则会根据前一帧的响应值输出g将会求出对应的坐标值(响应值即为目标中心点,宽高不变,通过中心点的变化,动态求的bbox坐标),这也将作为下一帧的输入,用于裁减对应区域的对应图像。持续更新滤波器h。在整个跟踪过程中,通过不断更新滤波器h,不断调整局部区域内目标的中心点位置,进而持续调整下一帧裁切的局部区域,从而达到跟踪的目的。这里需要注意的是,mosse相关滤波并不是在全图进行处理,而是基于宽高不变的初始框选区域,在不断迭代更新的该区域进行目标中心点峰值点的一个查找。

Mosse.m主代码:

% get images from source directory
datadir = '../data/';
dataset = 'Surfer';
path = [datadir dataset];
img_path = [path '/img/'];
D = dir([img_path, '*.jpg']);
seq_len = length(D(not([D.isdir])));                   %获取图片序列长度
if exist([img_path num2str(1, '%04i.jpg')], 'file'),   %num2str将数字转换为字符数组/img_files = num2str((1:seq_len)', [img_path '%04i.jpg']);   %得到所有对应的图片%disp(img_files);
elseerror('No image files found in the directory.');
end% select target from first frame
im = imread(img_files(1,:));    %读取第一帧的图片
%[X,map]=imread('forest.png')  则代表X为图像颜色值,map代表色素(通道)
f = figure('Name', 'Select object to track'); imshow(im);   
%figure表示弹出框名称/imshow表示在弹出窗口显示第一帧图片
rect = getrect; %getrect函数即用鼠标指定矩形
%其中rect返回值为选定矩形以此为:左下角的坐标,宽度,高度
close(f); clear f;
center = [rect(2)+rect(4)/2 rect(1)+rect(3)/2];%获得矩形框的中心点纵,横坐标(高 宽)即第一帧图像的中心点% plot gaussian
sigma = 100;
gsize = size(im);   %获取第一帧图片的尺寸:高 宽 3通道
[R,C] = ndgrid(1:gsize(1), 1:gsize(2)); %ndgrid 生成gsize(1)xgsize(2)的高维矩阵,参数1代表纵向/参数二代表横向
%ndgrid用法:https://blog.csdn.net/u012183487/article/details/76149279
%产生高斯形状的理想响应g
g = gaussC(R,C, sigma, center);  %调用高斯函数
g = mat2gray(g);%把一个double类的任意数组转换成值范围在[0,1]的归一化double类数组% randomly warp original image to create training set
if (size(im,3) == 3) %size(A,n),size将返回矩阵的行数或列数img = rgb2gray(im);  %将RGB图像或彩色图转换为灰度图像
end
%imcrop表示按第一帧选择的矩形大小裁剪图片
img = imcrop(img, rect); %按选定的矩形框裁剪第一帧灰度图大小
%imcrop : https://blog.csdn.net/llxue0925/article/details/80431508
g = imcrop(g, rect); %
G = fft2(g);   %二维快速傅里叶变换,将响应输出g变成G
height = size(g,1);   %height=179
width = size(g,2);    %width=130
%f表示输入图像
fi = preprocess(imresize(img, [height width])); 
%重新设置裁剪后的图片尺寸,再调用preprocess函数对图像数据进行标准化处理
Ai = (G.*conj(fft2(fi))); %conj函数用于计算"复数"x的共轭值。即F*--》F的共轭
Bi = (fft2(fi).*conj(fft2(fi)));
%按照求和公式计算第一个H
N = 128;
for i = 1:Nfi = preprocess(rand_warp(img));Ai = Ai + (G.*conj(fft2(fi)));Bi = Bi + (fft2(fi).*conj(fft2(fi)));
end% % MOSSE online training regimen
eta = 0.125;   %官方推荐的eta值0.125
fig = figure('Name', 'MOSSE');
mkdir(['results_' dataset]);
for i = 1:size(img_files, 1)  %遍历所有图片%size(img_files, 1) 表示图片总数量img = imread(img_files(i,:));   %读取第i张图片im = img;if (size(img,3) == 3)  %若通道为3img = rgb2gray(img);  %转成灰度图endif (i == 1)      %当为第一张图时Ai = eta.*Ai;Bi = eta.*Bi;elseHi = Ai./Bi;   %不是第一张图的时候,求解滤波H*fi = imcrop(img, rect);   %再按指定矩形大小进行裁剪2-376的对应图片fi = preprocess(imresize(fi, [height width]));  %预处理得到输出gi = uint8(255*mat2gray(ifft2(Hi.*fft2(fi))));  %得到响应值输出 转换成值范围在[0,1]的归一化double类数组 maxval = max(gi(:));  %得到最大响应值[P, Q] = find(gi == maxval);  %找到最大响应值所对应的gidx = mean(P)-height/2;dy = mean(Q)-width/2;rect = [rect(1)+dy rect(2)+dx width height];  %更新中心点坐标fi = imcrop(img, rect);     %按新更新的rect目标点进行裁剪图片 fi = preprocess(imresize(fi, [height width]));%最后更新Ai和BiAi = eta.*(G.*conj(fft2(fi))) + (1-eta).*Ai;Bi = eta.*(fft2(fi).*conj(fft2(fi))) + (1-eta).*Bi;end% visualizationtext_str = ['Frame: ' num2str(i)];   %每一张图片代表一帧box_color = 'green';position=[1 1];result = insertText(im, position,text_str,'FontSize',15,'BoxColor',...box_color,'BoxOpacity',0.4,'TextColor','white');result = insertShape(result, 'Rectangle', rect, 'LineWidth', 3); %绘制矩形 宽为3%imwrite(result, ['results_' dataset num2str(i, '/%04i.jpg')]);%imwrite(result, ['results_temp' dataset num2str(i, '/%04i.jpg')]);imshow(result);
end


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

相关文章

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元左右。 金融业平均工资排…

你的工资是怎样被平均的?终于有人把平均数、中位数和众数讲明白了

导读:我们在数据处理时,要小心各种陷阱!人们习惯使用统计数据来简化事物描述,但错误的统计方法不仅不能反映事实,还会让数据变得毫无意义。 作者:徐晟 来源:大数据DT(ID:…

计算机软件集成项目工程师上海,上海系统集成项目管理工程师积分政策,可以加多少分?...

系统集成项目管理工程师是计算机技术与软件专业技术资格(水平)考试中级资格里的一项考试,获得系统集成项目管理工程师证书在上海市办理居住证时可以获得100分的积分,具体依据如下: 系统集成项目管理工程师是计算机软件资格(水平)考试里中级的…

23省份2011年平均工资排行 北京最高甘肃垫底

2019独角兽企业重金招聘Python工程师标准>>> 23省份2011年平均工资排行 统计发现,目前全国已有北京等23个省区公布了2011年城镇单位在岗职工平均工资。数据显示,在这23省区中,北京职工月平均工资最高,为4672元/月&…

再见,工资!2020年6月程序员工资统计,平均14404元,网友:又跌了!

Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨有数可据 来源丨 https://blog.csdn.net/juwikuang/article/details/106503404 见了鬼! 工资竟然又跌了 #平均工资 2…

上海落户说明

 当前位置:合肥家园网—楼市资讯—家园看房 上海最新户口政策 新闻来源:合肥家园网 2012-02-24 width"100" height"24" src"http://news.hfhome.cn/hits.aspx?NewsID77154" frameborder"0…

2020年6月程序员工资统计,平均14404元,网友:又跌了!

见了鬼! 工资竟然又跌了 #平均工资 2020年6月全国招收程序员313739人。2020年6月全国程序员平均工资14404元,工资中位数12500元,其中95%的人的工资介于5250元到35000元。 虽然收入又下降了,但是岗位比上个月多了起来,随…

上海市职称计算机证明补办,职称证书丢了还能补办吗?上海落户政策详解。

很多朋友们在准备积分申请的时候,由于时间过去太久,等找材料的时候发现,职称证书不见了,这可怎么办呢?别急,职称证书是可以补发的!只需要个人提供以下材料: 1、原《专业技术职务任职…

python一个月工资多少钱_python工资收入

13.9K / 月平均工资 数据统计来自近一年 13903 份样本,截至 2020-11-21 全国python一个月多少钱?平均工资 ¥13.9K/月 其中拿10K-15K工资的人占比最多,达 30.5% 其次拿15K-20K工资的占 20.3%,20K-30K占 19.3% 对比…

2021年全国平均工资出炉,你达标了吗?

我国人的收入是个谜,如果你去各大论坛,就会发现各个都是富人。比如“刚下飞机,人在漂亮国,年入刚过百万”。人均法拉利、劳斯莱斯,以至于中国的法拉利、劳斯莱斯、兰博基尼等豪车的拥有量已经超过了其全球销量。 那么大…

java开发深圳平均工资_深圳2017平均工资100173元!!这次你又又又拖后腿了吗!?...

原标题:深圳2017平均工资100173元!!这次你又又又拖后腿了吗!? 最近深圳的天气 我和烤肉之间真的只差一撮孜然 简直热到原地爆炸 虽然未来的几天即将开启雨雨雨的模式 但是依然湿热 不过大家也不要灰心 毕竟有位名人曾经…

海口java工资水平2017,2019年海口平均工资公布,海口平均工资水平最新数据

海口市平均工资是什么?2017年海口市的平均工资是多少,下面现代语文网小编就关于2017年海口市平均工资相关信息给大家整理下! 平均工资,是一项反映工资总体水平的指标,指企业、事业、机关单位的职工在一定时期内平均每人…

济宁java平均工资,2019年济宁平均工资公布,济宁平均工资水平最新数据

济宁市平均工资是什么?2017年济宁市的平均工资是多少,下面现代语文网小编就关于2017年济宁市平均工资相关信息给大家整理下! 平均工资,是一项反映工资总体水平的指标,指企业、事业、机关单位的职工在一定时期内平均每人…