视觉跟踪的难点
1 目标怎么表示
一般用一个矩形框将目标所在区域标出来,但是目标一般不是矩形的,所以经常会包含非目标框
,要想完美解决这个问题,可能的方案有两个:
- 1.1 利用显著性,显著性的任务就是给每个像素打标签,是物体标签接近1,是背景,标签接近于0,一般是基于超像素进行的标签打分。这个在质量好的图片上,效果还好,但是还不够。但是如果显著性能完美的解决,每个超像素是不是一个物体的话,那么跟踪就化简很多步骤了。
- 1.2 前景背景分割,这个东西就是分割出物体来,具体做到什么程度不太了解。
2 目标的更新
目标在跟踪过程中,会发生改变,如何来“形容”这种改变,将这些变化记录下来,以达到对目标的“学习”呢?
- 2.1 模板库方式:我刚接触的跟踪算法TLD,号称可以,tracking learning detection,其目标学习方法,是将目标每帧的特征矩阵(是一个叫做局部二值特征的东西吧,记不清了,反正是一种简单高效的特征),和之前存的模版对比,将那么没那么相似的块,保存下来,形成一个模板库,这是一种非常直观,好理解的学习方式。
- 2.2 子空间学习,了解子空间的人可能比较好理解,一个人的外表,尽管会发生改变,但是应该都在同一个子空间里,如果能学习到这个子空间的基底,就可以比较方便的表达目标了。
- 2.3 稀疏表示,稀疏性其实本身比较简单,就是向量或矩阵里,0的个数越多,就越稀疏,但是稀疏表示是另外一个意思,我看的文章里说是,同一类目标可以由该类的其他实例的线性加权叠加的到,就是说,小明在t时刻的脸,可以通过其他时刻的脸,线性加权得到,但是不能通过,小天的脸线性加权得到,在人脸检测里,如果将一万个人脸图像向量化
D
,其中每行是一个人脸,假如我们设置,一个人采样10张图片,那么一万人的话,
D
就是10万行,现在来一个新的人脸,
y ,我们不知道这个是谁,那用 D 表示y 的话,
x0^=argmin||x||0subjecttoDx=y(1)
那么x里面除了y对应类的10行外,其他系数基本都是0,这样就可以知道y是哪个人。这种情况,就是要学习和更新这个 D <script type="math/tex" id="MathJax-Element-7">D</script>了,就是字典学习与更新。 - 2.4 pca或spca 数据压缩,一般用pca的情况是降维,比如100组数据,每个数据是1万维,这时候减少变量的个数,降低到10维什么的吧,但是pca,其实是基于svd,是可以用来压缩数据的,比如将100组数据压缩到10组,每个数据还是1万维,spca,也一样。因为我们每跟踪一帧都得到一个数据,但是相邻两个图像是很相似的,是可以进行压缩的,压缩后的几个数据,是互补,最紧致的。
- 2.5 基于块patch的更新,将目标化分为多个小块,这个思路可以用稀疏也可以用别的方法做。每个块分别更新。
以上所有方法还要考虑,场景的变化,目标是否被遮挡,光照变化,尺度变化,还没有什么方法可以完美的解决这些问题。
3 搜索策略
从t帧到t+1帧,目标的位置,也许不会发生大的改变,也许发生的改变比较大,这是两种假设,都有一定的道理,那么去哪找目标,就是搜索问题,常用的方法是多尺度滑动窗口,比如物体是10*10大小,那么找的时候,尺度可以定为 8*8 到14*14 因为,物体跟摄像头的位置可能发生改变,每个尺度下,从图像左上角到又下角(假设目标出现的位置随机的),或者从上次的位置往周围扩散(mean shift 思路)。
最近基于correlation filter的方法,可以计算出所有搜索区域内的response,等于说一次性计算出所有位置可能是目标的概率(当时不一定是0到1之间)。但是很多方法是不会计算出所有位置是目标的概率的,尤其是基于粒子滤波的,它的计算复杂度非常高。
以上言论只代表本人现在的水平,如有问题请批评指出!