关于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可以通用,就不细看了~
- 关于ALSA算法代码的学习与修正
- 关于《基于汉明距离的LSH图像检索算法》代码的一些bug修正
- 【ALSA】关于alsa的总结
- L-BFGS算法的JAVA实现,,部分代码!(修正)
- 关于ALSA的小结
- 关于ALSA的小结
- 关于ALSA的小结
- 关于ALSA的小结
- 关于ALSA的小结
- 关于ALSA的小结
- 关于ALSA的小结
- 关于ALSA的小结
- 关于getElementsByClassName的修正
- 修正的KMP算法
- 对网上流传的水波算法的补充与修正
- 算法思想:假设与修正
- alsa学习--3.alsa的demo
- alsa-lib与alsa-driver的关系
- Inotify测试(2):inotifywait 与 PyInotify 监控层级比较
- hdu1069 Monkey and Banana
- 一些任务调度情况
- stty命令使用
- nginx proxy_next_upstream导致的一个重复提交错误
- 关于ALSA算法代码的学习与修正
- 编译原理课设之简单编译器实现
- Java NIO学习总结三(Selector)
- solr发布到tomcat下
- JMeter一次简单的接口测试
- Linux命令之stty - 显示和修改终端行设置
- uva10245
- Toast的显示需要的环境
- Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法