目标跟踪:相关滤波算法MOSSE理解与python实现

论文地址:http://static.tongtianta.site/paper_pdf/5289ac92-dfd9-11e8-8368-00163e08bb86.pdf

在学习该算法的过程中我搜索了不少的资料,其中下面两位前辈的内容给了我很大的帮助:

博文:https://blog.csdn.net/Perfect_Accepted/article/details/84636319 (非常详细的讲解,把理解该算法所需的相关知识也囊括其中)

Matlab代码讲解:https://www.bilibili.com/video/BV1qE411t76u?from=search&seid=12629263508389420802 (up主的讲解形象生动,对我这种小白帮助很大)

本文代码是参考自fengyang95大神的:https://github.com/fengyang95/pyCFTrackers  

为了便于仅对Mosse算法的学习和测试,我在fengyang95代码的基础上做了一些删减和修改,并在代码中加入了详细的注释,但是基本上源于他的思路实现。

本文代码和数据:https://gitee.com/asddongmen/MyCFTrackers

效果展示如下:

mosse_cup_tracking

 

下面是我对该算法实现过程的一些总结:

首先说明,本文的记号方式与论文一致,使用小写来表示时域下的图片如fi,使用大写来表示经过傅里叶变换后频域下的图片如Fi。

  1. 读取第一帧图片,若是RGB图像则转化成灰度图像,接着对图片矩阵进行归一化处理
  2. 手工框出 / 用目标检测算法检测出 / 使用数据集中的ground truth来标定出视频第一帧图片中的需要跟踪的目标(x, y, w, h)
  3. 根据第2步得到的框,截取出目标区域图片_fi
  4. 生成一个(w*h)大小的高斯核,并对其进行傅里叶变换,得到_G
  5. 初始化_Ai, _Bi, 大小都为 (w*h)
  6. 对_fi进行随机重定位(rand_wrap)
  7. 对_fi进行preprocessing(取对数,标准化,通过窗函数)
  8. 对_fi进行傅里叶变换得到Fi,并根据Fi和_G计算出_Ai和_Bi,到此处第一帧处理结束。
  9. 根据_Ai和_Bi计算出当前帧的Hi
  10. 根据上一帧目标框,获取当前帧的fi,并对其进行预处理和fft,得到Fi
  11. 根据Hi和Fi更新Gi,然后Gi进行逆傅里叶变换得到gi
  12. gi中最大值位置即为第二帧图像目标所在位置,经过计算之后得到当前帧目标框的中心(x_c, y_c)
  13. 根据(x_c, y_c)更新当前帧的fi,并对其进行预处理和fft,得到Fi
  14. 根据论文中的公式,使用Fi,_G, 和_Ai, _Bi来更新 _Ai, _Bi
  15. 回到第九步,直到计算结束。

注意:

1.在论文中每次更新Ai和Bi时用的都是Gi,但是实际上Gi就是初始的_G,_G是不用进行更新的 (根据我的理解,如果不对请指正,非常欢迎讨论!!)

 

 

你可能感兴趣的:(目标跟踪,计算机视觉)