最近把以前的几篇关于Low-rank的文章重新看了一遍,由于之前的一些积累,重新看一遍感觉收获颇多。写这篇博文的时候也参考了一些网上的博客,其中数这篇博文最为经典http://blog.csdn.net/abcjennifer/article/details/8572994。Rachel-zhang这个博客牛人,相信搞CV的都不陌生吧,研究生期间能有这么多积累确实难得,能把自己所学一点一滴的记录下来,这就更不容易了。科研无止境,希望以后我的博客也能像各位前辈一样,越写越好。如有人读了我的博客感觉受益匪浅,那就更是我莫大的荣幸了。好了闲话不说,还是来摆摆今天的几篇文章吧。

第一篇:RASL: Robust Alignment by Sparse and Low-rank Decomposition for Linearly Correlated Images ,这是我接触Low-rank的第一篇文章,文章利用Low-rank的算法进行图片的对齐(Alignment)同时还可以有效的去遮挡,从实验的效果来看,算法的对齐效果和去遮挡效果还是很好的。不过这种算法只能对批量的图片进行处理,不能对单张图片处理,这也局限了它的应用场景,下面我来简单的介绍下文章的实现过程。

首先矩阵里面秩的概念相信大家都很熟悉,假设给定我们同一个人的10张图片,如果这10张图片表情,光照,人脸的偏斜角度都是一模一样的,并且没有受到任何噪声的干扰没有任何的遮挡。那么把这10张图片拉成列构成一个矩阵,理想的角度来讲,这个矩阵的秩应该是1,我们可以认为这10张图片是完全对齐的的。如果这10张图片中只有少数图片不是对齐的,被遮挡了,位置偏移了或者受到了光照的影响,那么把这10张图片放在一起构成的矩阵,矩阵的秩肯定就不为1。如果这10张人脸的图片,相互的差异都非常大,那么把它们放在一起构成的矩阵,秩就可能是满纸的。从这个角度来说,我们可以认为low-rank是图片对齐的一种数学上的表示。由于实际情况中,对齐的图片不可能完全一样,所以不可能为1,但是我们可以放宽条件,当样本所组成的矩阵,秩比较小时,可以认为样本对齐的效果是比较好的。这就是文章的主要数学思想,貌似很简单是吧,不过要实现却不是那么容易,其中涉及到了大量的数学运算。

由于实际情况中,我们处理的样本都会引入噪声,样本本身也可能有一些遮挡,所以这里我们引入一个误差E。

其中是一个low-rank的矩阵,也就是说A可视化的样本是对齐好的,

, 矩阵E是误差,由于图片中噪声或者遮挡区域只占很少一部分,所以我们可以认为矩阵E是稀疏的。也就是说对于一类训练样本,我们拉成列组成矩阵D后,D可以分解为一个low-rank的矩阵A和误差矩阵E。这样我们可以认为A是对齐好了的矩阵,E是一个稀疏的误差矩阵。那么接下来的问题就是,怎么才能完成这样的一个分解,得到我们想要的对齐矩阵A呢?

首先我们把矩阵D到A+E看成是通过一种变换得到的,那么上式就可以写成这样:。其中是一种变换,通过这种变换,D可以转换为A+E,使得A的秩非常小,E非常稀疏。于是问题就转化为求解这样一个最小化问题:

矩阵D是已经给定的了,需要找到这样的一个变换,使得rank(A)足够小,误差矩阵E足够稀疏。试验中的初始值我们可以给定,通过不断的迭代来修正,从而求出A和E。但是问题就来了,这个式子是“非凸的”,我们找不到其求解办法。于是我们采用近似求解,也就是所谓的“凸松弛”。利用求nuclear norm代替求rank(A),利用求1-norm来代替求0-norm,并且引入parameter来均衡A的低秩性和E的稀疏性,至于参数的取值大小可以参考马毅的那篇文章:Robust Principal Component Analysis。于是问题就变成了下面这样:

这个式子的求解难点在于限制条件的非线性。但是如果每次的增加都非常的小,我们就可以认为限制条件是线性的,上式就可以写成这样:

其中是一个雅克比行列式,上式的得来其实就是泰勒级数展开的前两项。那么我们最终的优化式子就变成了这样:

剩下的工作就是如何来求解这样的一个公式,找出最好的A和E了。文中介绍了两种种算法,以及完整的数学证明(证明去看原文),这里我就直接粘贴下来:

Algorithm 1 是针对的,Algorithm 2是针对的。用这两种算法,我们就可以找到想要求解的A和E了。下面我们来看一下利用这样的低秩算法处理图片对齐的效果:

从图中可以看出对于x和y方向偏离0~0.4距离内,算法能很好的对齐,对偏移角度0~60°内,算法也能很好的对齐。

下面是对没有遮挡,关照角度变化较大情况的处理情况:

下面是对dummy head的处理效果,可以看出对去遮挡的效果还是很好的

下面是对自然图片的处理情况:

可以看出算法的实验效果是非常好的,其应用场景也是非常的广泛,可用于图像矫正与去噪,图像标签精华,文本分析,音乐词曲分离等场景。

第二篇:TILT: Transform Invariant Low-rank Texture,这篇文章的主要贡献是提出了一种从2D图像中提取3D结构的方法从而对图片进行矫正。其主要思想是:对于未加旋转的图像,由于图像的对称性与自相似性,我们可以将其看做是一个带噪声的低秩矩阵。当图像由端正发生旋转时,图像的对称性和规律性就会被破坏,也就是说各行像素间的线性相关性被破坏,因此矩阵的秩就会增加。低秩纹理映射算法(TILT)是一种用低秩性与噪声的稀疏性进行低秩纹理恢复的算法。它的思想是通过几何变换τ把D所代表的图像区域校正成正则的区域,如具有横平竖直、对称等特性,这些特性可以通过低秩性来进行刻画。

对于单张图片,比如说一张歪了的人脸,怎样才能矫正它让它左右对称,变得规整(也就是我要说的“正则”)呢。传统的方法是提取一种invariant feature(如SIFT),然后利用特征找出图中突出的地方(如人眼,鼻子,嘴角),然后利用这些points/regions来矫正图片,但是这种方法很不鲁棒,对光照,遮挡比较敏感。并且,严格来说,并不曾存在invariant feature under projective transformations or homographies。于是本文提出了一种,不经过任何仿射变换或者投影变换从2D图片中提取一种3D结构的方法,对图片进行“正则化”。上一篇文章提出的RASL算法能很好的对图片进行矫正对齐,去遮挡,去光照。但是这种算法的局限在于只能对批量的同类图片进行处理,对于单独的一张非“正则”的图片,RASL算法是无法处理的。那么有没有算法能解决这个问题,对单张“非正则”的图片进行对齐矫正呢?本文的出现就是要解决这样的一个问题,首先文章提出来一种“Low-rank Textures”的概念。

在这种“Low-rank Textures”的概念下,如果一张图片是“正则”的,那么这张图片的矩阵就具备“Low-rank Textures”性质,否则就不具备“Low-rank Textures”的性质。确定了这点,我们只需利用凸优化算法,是给定的图片具备Low-rank Textures,我们便完成了对这正图片的矫正了。那么这种概率是什么样的呢,这里我还没看懂,直接贴出原文:

在这种“Low-rank Textures”概念下,vertical和horizontal和slope可以看成秩1texture,corner可以看成秩2的texture,如下图所示:

a图是input image,处理前rank = 11, 处理后rank = 1. b和f一样,处理后变成了一个Corner,rank = 2。那么给定一张“非正则”的图片,怎么才能recovery the Low-rank Texture呢? 给定一张图片,我们可以把它看成是它的“Low-rank Textures”图片经过变换得到的。在文中,我们可以认为变换是仿射变换或者单应性变换。也就是说我们所看到的非“非正则”图片,可以看成是“正则”图经过这两种变化得到的,所以非低秩。由于噪声和遮挡的影响,我们引入误差矩阵E,于是

   求解这样的“Low-rank Textures”矩阵就变成了解下面这个式子:

剩下的就和文章一如出一辙了,在此我就不多讲了,本文和上文最大的不同就是提出来一种“Low-rank Textures”概念,对单张图片进行低秩处理,进行矫正。算法直接贴下:

下面展示实验的效果:

从图中可以看出,此算法能很好的矫正单张图片,文章也提供的代码。本人跑过代码,效果还是可以的,但有时候矫正效果也不如传统的方法,如人脸对齐中的仿射变换。

     第三篇:Robust Principal Component Analysis? 这篇文章仅在此提一下,文章中设计大量的数学公式实在看不下去,大家可以去看这个微博:http://blog.csdn.net/abcjennifer/article/details/8572994

最新文章

  1. SQL服务器在执行这条语句时会先进行运算然后执行
  2. ubuntu自定义分辨率
  3. Angular常用功能
  4. Unsupported configuration attributes: [FILE_UPLOAD]
  5. Intent flag 与启动模式的对应关系
  6. SU Demos-05Sorting Traces-03susorty
  7. [BZOJ2659][WC2012]算不出的算式(几何)
  8. ACM题目————The Blocks Problem
  9. C/C++常用头文件及函数汇总
  10. Fast Intro To Java Programming (2)
  11. 那些年被我坑过的Python——不得不知(第二章)
  12. <经验杂谈>C#中一种最简单、最基本的反射(Reflection):通过反射获取方法函数
  13. [HNOI2012]集合选数
  14. java自带dom工具使用实例
  15. NOIP2000普及组 T1计算器的改良
  16. WPF中如何调整TabControl的大小,使其跟随Window的大小而改变?
  17. SALALchemy Session与scoped_session的源码分析
  18. Ajax 访问 或 获取 IIS 虚拟目录
  19. delphi手动创建dataset并插入值
  20. Gitlab Issue Tracker and Wiki(一)

热门文章

  1. 2017 济南综合班 Day 3
  2. vijos 1655 萌萌的糖果博弈 博弈
  3. jenkins修改job默认名字
  4. CentOS7 搭建Apache环境
  5. java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver 找不到jar包的问题,路径问题
  6. linux系统引导流程
  7. Android日历开发之右上角标注红点事件
  8. Django 1.10中文文档-第一个应用Part5-测试
  9. linux下pthread_cancel无法取消线程的原因【转】
  10. shellcheck 帮助你写出更好的脚本