关于ALSA算法代码的学习与修正

来源:互联网 发布:oracle数据库发展历史 编辑:程序博客网 时间:2024/06/08 01:19

       文章读完开始读code,感谢大大们慷慨的开源~下载的初始版本跑下来,有很严重的漂移问题,所以研读代码的过程也兼并找错的任务,也算是深入学习了ALSA,开始喽。

2016/3/24更新:近来跑这个程序,有一个很奇怪的发现,前段时间我对这个code的修正似乎并没有起作用,因为初始版本里已经包含我增加的步骤,也就是说并没有问题……囧 为什么我会说存在漂移问题呢?是因为这个算法在不同时间去运行,结果都不一定一样?clear all似乎也没有用。。。救命,简直太费脑子了。



1. 初始化阶段

局部块的尺寸patch_size:16*16;步长:8;  模板尺寸pzise:32*32

1). setTrackParam.m

①. 对不同的序列设置相应的第一帧的ground_truth,即p:第一帧的bounding box的位置(中心点像素坐标、宽、长)、仿射参数affsig、粒子采样数等等;

注:我在测试自己的序列时,时间关系,没研究仿射参数,而是直接copy的已有的序列的affsig,比如测试行人,我copy的是woman_sequence的affsig,效果也很不错。

②. 对原始的参数向量p进行处理,得到几何意义上的参数param0。

affparam2mat/affparam2geom,参看函数的说明,具体的参数转换没有细看……

2). img2patch.m(对img进行结构化处理→局部patches)

输入为32*32,根据patch_size和step_size得到9个互有重叠的局部块(16*16)

patch_idx:存储的是像素标签,16x16x9维的列向量

patch_num:局部块的个数,9。

3). 通过前10帧的跟踪,生成最初的模板集合

>>调用  intial_tracking.m(for循环对前10帧进行简单的跟踪)

①. imread:若是RGB则转换成灰度图像;

②. sampling.m:根据初始的仿射参数affsig采样得到当前帧的600个粒子;

③. warpimg+reshape:对粒子进行常规处理→尺寸为32*32的候选,结果为candi_data(每个列向量是一个候选*600);

④. KNN算法:调用vlfeat工具包实现K近邻算法,每次循环result得到一个模板(600→1),循环结束exemplars_stack共10个未归一化的模板32*32;

>> 返回initial tracking

归一化10个模板,结构化采样→10*9个大小为16*16的局部块,按列排列,归一化。即为字典D——patch_dict

4). 计算特征基向量,用于模板更新

调用sklm.m,增量SVD算法,求解加入新的观测之后的均值与特征值,用于后面的模板更新。#来自David Ross等人的IVT算法#


>>>>>>>>>>for循环对第11帧至最后一帧进行跟踪&模板更新&结果保存<<<<<<<<<<<<<<<

2. 正式跟踪

【原理】粒子滤波+稀疏表示

1). 粒子滤波部分:对新的一帧采样得到600个粒子,再进行预处理(重叠块采样)

①. imread:若是RGB则转换成灰度图像;

②. sampling.m:根据初始的仿射参数affsig采样得到当前帧的600个粒子;  !!不更新仿射参数!!

③. warpimg+reshape:对粒子进行常规处理→尺寸为32*32的候选,结果为candidates(每个列向量是一个候选*600);

④. cropping patches:把③得到的候选(600个),进行块采样,得到9*600个局部块(列),再归一化。

2). 稀疏编码部分:对每个块进行稀疏编码

借用文章中的图,第2)部分就是完成如下工作:


①. sparse coding. 调用了SPAMS工具包,求解如下稀疏问题,得到每个块的稀疏系数patch_coef(90*5400):


②. Weight&Alignment-pooling.  原理:可靠候选的i_th局部块可以由10个模板对应的局部块稀疏表达,所以对应块的系数可以作为判别候选与目标相似性依据。

将候选的i_th个局部块对应的10个模板中的i_th局部块稀疏系数相加,并归一化,具体操作就是将90*5400的矩阵提取1~9/10~18/.../82~90行,叠加得到9*4500的矩阵;

reshape得到81*600的patch_longfeatures,每一列表示一个候选系数:


③. MAP inference:相似性度量找出最可靠的候选

这里的具体是将对齐池化后的系数平方了一下,再降序排列(为什么要平方处理还没有想明白……)。

对角(池化特征)的值越大,越可靠。


小结:对系数做如上处理可以保留局部块之间的空间结构信息;因为以块为单位了,所以当发生局部遮挡时,未被遮挡的可靠候选块仍然可以由对应模板候选块稀疏表示。


3. 模板更新

【原理】子空间学习+稀疏表示

①.子空间学习部分:参考文献[16][18]中,目标可以由PCA基向量和额外的trivial templates(琐碎模板)的线性组合表示。


上式,p是被跟踪的目标,即观测向量;U是基向量矩阵;q是系数;e是trivial templates,表示被遮挡或被腐蚀的像素。

②. 稀疏表示部分:由遮挡和噪声带来的误差是任意且稀疏的?(这里没明白……)


上式,H=[U I],c=[q e]‘。

1). 计算加入了跟踪结果后的观测基向量

①. 每处理完一帧便将跟踪结果纳入观测集tmpl.warpimg中;

②. 只有当观测大于5个时,才计算基向量,即模板更新从第15帧以后开始:

      调用sklm函数,计算当前观测集的基向量、特征值U、均值等等;当计算得到的基向量大于10个,特征值和向量都只取前10个;

      清空观测集temp.warpimg;

③. 调用SPAMS工具包求解上述稀疏问题,得到稀疏系数c,recon_coef(这一步的数据处理:candidates(:,best_idx)-tmpl.mean 减去均值 不是很懂……)

④. 计算好新的模板,recon备用:

⑤. 找到要删除的旧模板并替换:

      产生累加概率序列,概率从小到大表示模板从旧到新。原理是:越旧的模板越可靠;

      产生随机数random_num,用于选择要被替换的模板;(居然随机替换……也是醉了(⊙﹏⊙)b);

      根据该随机数定位到权值区间,该区间右边对应的模板则被删除,并将新模板recon放在最大概率的位置(即第10);

⑥. 重新reshape整理模板字典,并归一化;


4. 结果保存

每处理一帧,保存一帧结果。这部分的几行code可以通用,就不细看了~


0 0