声明:本人属于绝对的新手,刚刚接触“稀疏表示”这个领域。之所以写下以下的若干个连载,是鼓励自己不要急功近利,而要步步为赢!所以下文肯定有所纰漏,敬请指出,我们共同进步!
踏入“稀疏表达”(Sparse
本文固定链接:
-----------------------------------------------------
稀疏表示step by step(2)
压缩感知(CS),或许你最近听说的比较多,不错,CS最近比较火,什么问题不管三七二十一就往上粘连,先试试能不能解决遇到的问题,能的话就把文章发出来忽悠大家,这就是中国学术浮躁的表现…我们没有时间去思考的更多,因为你一思考,别人可能就把“你的东西”抢先发表了…不扯了,反正也干预不了…稀疏表示的现状有点像CS,能做很多事,也不能做很多事…但是它确实是解决一些棘手问题的方法,至少能提供一种思路…目前用稀疏表示解决的问题主要集中在图像去噪(Denoise),代表性paper:Image Denoise Via Sparse and Redundant Representations Over Learned Dictionaries(Elad M. and Aharon M. IEEE Trans. on Image Processing,Dec,2006);Image Sequence Denoising Via Sparse and Redundant Representations(Protter M. and Elad M.IEEE Trans. on Image Processing,Jan,2009), 还有超分辨率(Super-Resolution OR Scale-Up),代表性paper:Image Super-Resolution via Sparse Representation(Jianchao Yang, John Wright, Thomas Huang, and Yi Ma,IEEE Transactions on Image Processing, Nov,2010),A Shrinkage Learning Approach for Single Image Super-Resolution with Overcomplete Representations( A. Adler, Y. Hel-Or, and M. Elad,ECCV,Sep,2010)…. 另外还有inpait,deblur,Face Recognition,compression等等..更多应用参考Elad M的书,google能找到电子档,这里不提供下载地址
当然Elad M.和Yi Ma的团队不仅仅在应用上大做文章,在理论上也是不断革新…就拿字典学习为例,一开始将固定字典(如过完备 DCT,Contourlet,Wavelet字典)用在去噪,超分辨率上,效果不明显,可能某些情况下还不如空域或者频域的去噪效果好(我拿Lena图像和DCT实验了,以PSNR为标准,比时域的去噪方法要好,但是比小波去噪相比,稍稍逊色),但是速度快是它的优点。于是他们开始研究自适应的字典学习算法,开始使用很多图像进行学习,后来采用单幅图像进行学习来提高运算速度(使用很多图像进行学习属于半自适应的学习,对于自然图像的处理需要学习自然图像,对遥感图像的处理需要学习遥感图像,但是对自然图像或遥感图像的去噪,超分辨率处理,都可以使用已经训练好的相应的字典);同时学习的方法也不尽相同,开始使用MOD,后来就是一直比较流行的K-SVD,最近又出来了Online,总体而言Online比较快。下面是我提到的几种字典的例子,所有的字典都是64×256大小的,依次为DCT,globally(训练图像是:标准图像 lena,boat,house,barbara,perppers),K-SVD(单幅含躁lena,噪声标准差为25),online(单幅含躁 lena,噪声标准差为25),其中globally的训练方法是将训练图像分成8×8的overlap patch,平均取,共取10000块,K-SVD和online也是分成相同的重叠块,取所有可能的块。
总之,Elad M.和Yi Ma为稀疏表示这个领域作出了很大的贡献…向大牛们致敬!!最后稍微说一下国内的研究现状,国内的很多研究还没浮出水面,不知道是不是我想的的这样(我比较疑惑的是,为什么国外研究了十几年,国内还没大动静?),至少从google学术以及IEEE的文章搜索上来看是这样的…不过还是有几位教授在这方面作出了很大的贡献的…
-------------------------------------------------
稀疏表示step by step(3)
我们来考虑信号的稀疏表示问题,假如我们有了过完备字典D,如何求出信号x在这个过完备字典上的稀疏表示?先来回顾一下在压缩感知中常常会遇到的问题,信号x在经过测量矩阵A后得到测量值y,即y=A*x,其中测量矩阵A_mxn(m远小于n),那么怎样从y中精确的恢复出x呢?
由于m远小于n,用m个方程求解n个未知数,因此y=A*x是个欠定方程,有无穷多个解。就像我们解优化问题一样,如果我们加上适当的限定条件,或者叫正则项,问题的解会变得明朗一些!这里我们加上的正则项是norm(x,0),即使重构出的信号 x尽可能的稀疏(零范数:值为0的元素个数),后来Donoho和Elad这对师徒证明了如果A满足某些条件,那么argmin norm(x,0) s.t.y=A*x 这个优化问题即有唯一解!唯一性确定了,仍然不能求解出该问题,后来就尝试使用l1和l2范数来替代l0范数,华裔科学家陶哲轩和candes合作证明了在A满足UUP原则这样一个条件下,l0范数可以使用l1范数替代,所以优化问题变成argmin norm(x,1) s.t.y=A*x这样一个凸优化问题,可以通过线性优化的问题来解决!(参考文献:Stable signal recovery from incomplete and inaccurate measurements(E. J. Candès, J. Romberg and T. Tao))至此,稀疏表示的理论已经初步成型。至于之后的优化问题,都是一些变形,像lasso模型,TV模型等….这里推荐一本stanford的凸优化教材convex optimization,我准备抽个时间好好看一看,搞稀疏表达这一块的,优化问题少不了…最近一直在感叹:数学不好的人哪伤不起啊!!有木有!![break]
function
%
%
%L
%
if
end
P=size(X,2);
K=size(D,2);
for
end;
return;
end
----------------------------------------------------
稀疏表示step by step(4)
回顾一下前面所说的OMP算法,前提条件是字典D已知,求一个信号在这个字典上的稀疏表示…那假如我们不想使用过完备
Sparse
Dictinary
[break]我们主要通过实例介绍三种方法:MOD,K-SVD,Online…
初始化:
主循环:
function
%==============================
%input
%
%
%output
%
%
%==============================
if(size(y,2)<codebook_size)
end
%
[rows,cols]=size(y);
r=randperm(cols);
A=y(:,r(1:codebook_size));
A=A./repmat(sqrt(sum(A.^2,1)),rows,1);
mod_iter=10;
%
for
end
----------------------------------------------------
稀疏表示step by step(5)
回忆一下前面提到字典学习的方法之一MOD,其分为两个步骤:Sparse
下面是K-SVD的matlab代码,由于是深化对原理的理解,所以没有经过任何的优化和改进,优化的代码可以参考K-SVD
function
%==============================
%input
%
%
%output
%
%
%reference:K-SVD:An
%==============================
if(size(y,2)<codebook_size)
end
%
[rows,cols]=size(y);
r=randperm(cols);
A=y(:,r(1:codebook_size));
A=A./repmat(sqrt(sum(A.^2,1)),rows,1);
ksvd_iter=10;
for
end