基于fDSST算法的运动目标跟踪系统(一)

一.概述

    毕业设计是做的目标跟踪的项目,整个完成的流程也花费了自己的大量心血和时间,所以想要在论坛上记录一下自己完成的过程。总的来说,毕业所设计的内容是用python语言完成对fDSST目标跟踪算法原理的理解,以及对代码部分进行改进,最后移植到树莓派上。现在回头看自己的工作量其实并不大,但是刚开始接触这个项目的时候自己实在太菜了,连python语言都一窍不通,所以花费了很多时间摸索学习。

    总的来说完成的核心工作有:1.收集阅读相关文献,入门目标跟踪,同时阅读代码,理解原理。 2.相关环境搭建。3.在原来代码的基础上进行改进。4.对改进后的算法进行数据集的测试。5.将改进后的算法移植到树莓派上。

二.算法原理部分

    关于DSST算法的原理目前网络上能搜索到非常的多,但是大部分文章仅仅摆几个公式,比较的抽象不好理解,所以我就直接去读代码了。这里由于我毕设要求的是用python,所以我没有去读原版的Matlab版本的代码,而是去github上面找了一个大佬复现成python后的版本,连接如下:https://github.com/fengyang95/pyCFTrackers

    我要跪谢这个大佬,他把相关滤波中许多经典的算法都复现到了python上,并且还整合了商汤(SenseTime视频智能研究团队)的pysot-toolkit工具箱,完成了算法复现和跑分一条龙服务,真是个大好人啊!不拿来当baseline都对不起人家我只能说。

    上图是作者在项目主页上放上的VOT2018的跑分数据,可以看到作者复现了很多非常经典的相关滤波算法,跑分的结果按照EAO的数值大小进行了排序。对于原版的DSST算法的主体部分我进行了标注,有需要的可以自取。链接:https://pan.baidu.com/s/12Syi_9C9A4RxNJgjsBYd-A。提取码:1702 。

    接下来说一下在阅读代码中的一些个人的理解,如果有不对的地方希望大家对我多多批评和指正:

   (1)关于特征提取。特征提取是一开始很让我头疼的一个部分,作者在fDSST算法中用到的特征是fHOG特征和灰度特征进行拼接而得到的特征,有别于一般的HOG特征,fHOG特征运用上了截断和PCA降维等等的操作,具体的原理建议看这两篇文章:HOG特征原理分析fHOG原理分析

    特征提取的原理仔细阅读上面的文章之后其实并不难理解,真正让我头疼的地方是作者将特征在代码中的运用,也就是说如何让特征运用到具体的算法实现当中去。阅读代码可以看到,作者在平移滤波方面仅仅提取了fhog特征的前27维,并且在最后加上了灰度特征,至于为什么不用上最后四个维度特征的原因我也不太清楚。值得一提的是,作者将cell设置为了1,也就是把一个像素当作一个cell,方便和灰度特征进行拼接,这样每个像素都能获得28维度特征(通常来说cell值不为1,比如cell为4时,那么这4个像素组成的一个cell能够提取一个31维度的特征)。当明白了上面的点之后,最关键的部分来了,提取之后将会产生一个m*n*28的矩阵,m和n是目标区域的像素大小而28就代表了28维度的特征向量,简单可以理解为一个m*n大小有着28个通道的图像,这一点非常的重要,之后矩阵的点乘需要利用这里的特性。

   上图是把特诊矩阵可视化之后的效果,可以看到这是一个(52,84,28)大小的特征矩阵,并且矩阵的边缘都是0,原因是作者用了一个二维的汉明窗(hanning window)来削弱特征边缘突出中心特征。

    至于尺度滤波部分,不同于平移滤波,作者提取了31维度的fHOG特征,并且将cell的值设置为了4。但是由于需要提取33个尺度因子下的样本特征,如果还像平移滤波器那样进行相同的操作,那么计算量会非常的巨大,所以作者采取了两个操作来简化计算:1.线性插值法将33个的尺度因子转化为17个的内插尺度因子。2.特殊的特征拼接、QR分解等降维的方法简化计算。对于第一点的线性插值,看了代码后发现作者好像仅仅只是舍弃了33个尺度因子的中间16个,把17个内插尺度因子下获得的样本特征分8个插到头部,分9个插到尾部,不知道这样做的意义是什么。。。希望有大神能帮忙解答。对于第二点的特征降维,作者把17个内插尺度因子下的样本特征拼接成一个特征矩阵:

    上图中的868代表了每一个尺度因子下提取的目标区域样本特征的维度,17代表17个内插尺度因子。接下来再进行QR分解降维,作者用的是scipy.linalg.qr中的economic模式,得到的正交矩阵(这里的正交矩阵不是一个17*17的而是和原来的868*17一样大小的矩阵)与自身的转置相乘,得到17*17的降维后的特征矩阵,最后再和一个一维的汉明窗进行相乘

    至此,fDSST算法的平移和尺度特征提取部分我认为需要注意的点都讲完了。

   (2)关于相关滤波部分。相关滤波是算法的核心部分,fDSST算法的滤波器更新机制其实和MOSSE算法大体上相似,所以相对来说这一部分其实并不是很难,但是有几个点也挺让我头疼的。首先需要注意的是矩阵的点乘问题,众所周知算法的计算过程大部分都是通过矩阵的点乘来计算的,那么相乘的两个矩阵需要有什么样的特点呢?从网上搜索你会看到很多人说矩阵点乘的要求是两个矩阵的大小完全相同,然而通过测试我发现并不是。举一个例子,比如上面的(52,84,28)的矩阵,算法开始时会生成一个(52,84)大小的汉明窗,很明显这两个矩阵的大小不一样,但是却仍然可以进行点乘。同理在尺度滤波器部分,提取的特征是(17,17)的,然而点乘的汉明窗是(,17)的,所以矩阵点乘并不需要两个矩阵大小完全相同,只需要部分匹配的上,点乘后的结果大小与大小较大的矩阵保持一致。

    还有一点需要注意的是滤波器的更新。一开始的时候我很不解,明明:

    已经生成了一个滤波器了,为什么还要用:

    和:

    来生成滤波器。后来发现原因其实并不复杂,上面第一个公式是生成当前这一帧的滤波器模板,然而咱们总不能有了新人就忘了旧人吧,新的一帧的滤波器固然好,但是前面的滤波器咱们也不能就抛弃了。所以作者用了一个学习因子η把新的滤波器加到旧的滤波器当中,进行融合,这样能极大程度上增加滤波器的学习效率和鲁棒性。

    上面就是我总结的一些我认为需要注意的点,剩下的一些细节可以看下我对代码做的注释。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

友情还是错过的爱情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值