2DPCA以及增强的双向2DPCA详解

  最近在做目标追踪的过程中用到了2DPCA变换,花了两天时间研究了下2DPCA的起源及其重要改进,在此稍作总结。

  1、一维PCA及其不足之处

  在介绍2DPCA之前,稍微提一下历史悠久的PCA变换,一句话总结PCA变换:“通过求解目标协方差矩阵的前N个最大特征值对应的特征向量来组成特征映射矩阵以实现样本的主成分空间映射。”,可能有点笼统,其余的传统PCA的知识大家可以自行百度吧。

  我们这里主要探讨在图像处理过程中的PCA变换。由于图像本身为一个二维矩阵(以灰度图为例),传统PCA在构造协方差矩阵时需要先将图像转换成行向量的形式,然后将多个样本图片对应的多个行向量组成一个大规模的协方差矩阵,然后求解此协方差矩阵的特征值及特征向量来构建映射矩阵。这里就存在两个问题:(1)每次进行PCA变换前都需要将二维矩阵(图片)转换为一维矩阵(行向量),也就避免不了对图片进行遍历,在图片数量很多、尺寸较大的情况下,这一步是很耗时的。(2)得到的协方差矩阵的尺寸通常情况下也很大。举个例子,有100张样本,每个样本的尺寸均为100*100,那么对应每个行向量为1*10000,则最终的协方差矩阵为100*10000,对于这样大规模的矩阵进行SVD分解,效率可想而知,此时,2DPCA应运而生。

  2、2DPCA的起源以及推导

  首先在这里给出2DPCA的原始文献:《Two-Dimensional PCA:A New Approach to Appearance-Based Face Representation and Recognition》大家可以在EI检索、IEEE检索、谷歌学术、百度文库中下载到这篇文献(我稍后也会上传到CSDN网站),如果大家不介意阅读英文文献的话,建议好好研读一下这篇2004年发表的论文。

  接下里言归正传,对于原始的图片A,尺寸为m*n,需要将其通过映射矩阵X投影到另外一个子空间(主成分空间),即:

  这里Y为投影结果,简单说一下各个变量的尺寸:A为m*n矩阵,X为n*1的列向量,Y为m*1的特征向量。这里我们需要找到最佳的投影矩阵X以保证映射结果能够保留最大程度的信息。理想的投影矩阵应该保证投影后的结果尽量分开,即散度达到最大,因此我们用如下标准作为衡量投影矩阵X性能的目标函数:

  这里的Sx代表的是投影结果(Y)的协方差矩阵,tr(Sx)代表协方差矩阵的迹,用以反映的投影后的样本间的散度,Y的协方差矩阵Sx的定义及简单推导如下:

  然后根据tr(AB)= tr(BA),可得:

  这是我们发现中间那部分正好代表数据矩阵A的协方差矩阵,因此我们将其单独定义为Gt,Gt即代表数据矩阵A的协方差矩阵:

  这里Gt应该是一个n*n的方阵。对于M张训练样本A(j)(j = 1,2,……,M),可得其协方差矩阵为:

  此时,可将之前投影矩阵X的目标函数简化为:

  接下来,就是2DPCA的精华部分了,为了证明权威性,我们先提供作者在论文中的原话:

  文章说的很清楚,投影矩阵X的最优解即是协方差矩阵Gt的前n个最大的特征值对应的特征向量组成的矩阵,这又回到了原始的PCA定义了,正所谓万变不离其宗,既然归根到底都是PCA,最终的核心部分还是相同的。因此所谓的2DPCA,就是先通过样本集得到样本集的协方差矩阵,只不过此时的协方差矩阵不是按照之前的那种先变成行向量然后再堆叠出来,而是直接将所有样本累加再求平均得到的,然后对得到的协方差矩阵进行特征值分解,将对应的特征向量排列起来即得到了最优的投影矩阵。

  简单分析一下2DPCA的优点。首先很明显的一点是其不需要再将图像向量化,节约不少时间;其次就是需要做特征值分解的协方差矩阵现对于传统的PCA尺寸要小很多,同样100张100*100的图片,一维PCA所用到的协方差矩阵尺寸为100*10000,2DPCA的协方差矩阵仍为100*100,差别显而易见。作者在论文中证明了2DPCA在人脸识别等方面性能是优于一维PCA的。

  3、改进的双向2DPCA

  在2DPCA提出的第二年,即有学者对其进行了重大改进,这里暂且称其为双向2DPCA。

  首先给出双向2DPCA的原始文献:《(2D)2PCA: Two-directional two-dimensional PCA for efficient face representation and recognition》,同样可以通过EI检索、IEEE检索、百度学术、谷歌学术来获取这篇文献,这篇文献是在2005年发表的,可以说,今天人们所谈到的2DPCA,几乎都是指经过这篇论文改进的双向2DPCA了。这里所指的双向,是指在行方向和列方向都进行一次2DPCA运算。

  当然无论是哪种2DPCA,训练样本集(M张)的协方差矩阵都是必不可少的:

  为了详细起见,这里给出训练样本集均值模板的表示形式:

  这里我们不妨将矩阵A表示行向量组的形式:

  以及:

  这里Ak(1)等等都代表了元矩阵A的一行元素,矩阵共有m行,则此时训练集的协方差矩阵可以进一步表示为:

  那么重点来了,仔细观察这个协方差矩阵的表示形式就会发现,其实它和之前最原始的2DPCA的协方差矩阵Gt的表示形式本质上是一样的,只不过多了行方向上的叠加而已,因此我们成之前的2DPCA是工作在行方向上的PCA变换。接下来只需要按照之前介绍的方式对协方差矩阵G进行特征值分解等一系列操作,即可得到相应的映射矩阵,不过这里得到的是行映射矩阵X(又称左映射矩阵)。

  以此类推,接下来就应该介绍工作在列方向上的2DPCA了,原理和上面的类似,只不过上面公式总矩阵A采用的是按行排列,接下来我们将其改为按列排列:

  以及:

  注意这里既然是按列排列,则省去了不少的转置操作,相应的,此时的训练集协方差矩阵应该调整为如下形式:

  这里协方差矩阵的尺寸应为m*m,细心的读者应该已经猜到了,接下来我们就是对G进行特征值分解,从而能得到一个新的特征映射矩阵,这个映射矩阵时工作在列方向上的,我们暂时将其命名为Z,即列映射矩阵(右映射矩阵),尺寸为m*d。

  接下里我们将行映射矩阵和列映射矩阵进行简单归纳,对于行映射矩阵,其映射形式为:

  目标函数为:

  协方差矩阵为:

  对于列映射矩阵,其映射形式为:

  这里B为映射结果,Z为投影矩阵。对应目标函数为:

  协方差矩阵为:

  细心观察发现,行映射的协方差矩阵和列映射的协方差矩阵区别就在于转置相乘的顺序上。

  3、重构

  得到行、列方向上的投影矩阵X、Z之后,其联合映射的形式如下:

  对于原矩阵的重构结果如下:

  这里的Z和X都是正交矩阵,与转置相乘结果为一,因此有了这种重构表达式,至此,改进的双向2DPCA推导完成。

  4、一点想法

  双向2DPCA与原始的2DPCA先比最大的优势在于其映射结果C的维数很小,为d*d(d为选取的主成分的数量),一定程度上算是完成了对2DPCA的降维操作。直观上说,要计算双向2DPCA的左右投影矩阵只需进行两次协方差的特征值分解即可,但人们跟倾向于将其与稀疏优化问题放在一起求解。在最近很多2DPCA的应用中,在求解映射矩阵稀疏时都运用了凸优化理论,有兴趣的可以深入研究一下。

  

  

时间: 2024-10-10 06:49:35

2DPCA以及增强的双向2DPCA详解的相关文章

virtualbox centos安装增强工具和问题详解

VirtualBox 大家都习惯性把它简称为 Vbox ,比 VM 的体积小.开源.速 度快.不过在使用 VirtualBox 在虚拟机中安装 CentOS 之后,不能直接运行安装好 VirtualBox 的客户端增强功能,需要简 单地配置一下才能在 CentOS 虚拟机中正常安装 VirtualBox 客户端增强功能.下面就看一下 OwnLinux 为大家提供的 “为 CentOS 5.5 虚拟机安装 VirtualBox 客户端增强功能”图文教程. 1.启动安装在 VirtualBox 中的

减少网站跳转时间,增强网站数据安全——HSTS 详解

近年来随着 Google.Apple.百度等公司不断推动 HTTPS 普及,全网 HTTPS 已是大势所趋.目前多数网站都已经支持 HTTPS 访问,但是在由 HTTP 转向 HTTPS 路程中,不少网站依然会面临很多问题. 通常用户准备访问某个网站时,不会在输入的域名前面加上 http:// 或者 https://,需要浏览器自动填充,而浏览器默认填充的都是 http://,需要网站采用 301/302 跳转的方式,由 HTTP 跳转到 HTTPS.  301 跳转 由于 301/302 跳转

【Hibernate步步为营】--双向关联一对一映射详解(二)

很不好意思,有两天时间没有更新博客文章了,不写文章的日子还真是感觉很空洞啊,养成了写文章的恶习想改也改不掉啊.说点题外话,前两天收到一位朋友的私信,邀请笔者写一篇有关OWS的文章,用来研究图标工具的一种技术,很荣幸收到这位朋友的邀请,但是因为这几天开发的项目着急上线所以暂时没有时间去研究,只能等这周末了,利用周末的时间来研究然后更新类似的技术文章. 回到文章的正题,上篇文章讨论了双向主键关联,它其实是一对一主键关联的一种特殊情况,想要实现双向的关联就必须在映射文件的两端同时配置<one-to-o

【Hibernate步步为营】--双向关联一对一映射详解(一)

摘要:本文以我自己设计植物大战僵尸碰撞检测算法为例进行分析,浅谈游戏开发中碰撞检测算法.本文所提及的碰撞算法与数据结构也可应用于跑酷等游戏中. 关键优化技术1:只检测逻辑上可能存在碰撞关系的物体.比如植物大战僵尸中,植物发射的子弹只能打击其所在行的僵尸,因此子弹只需遍历检测本行的僵尸,而不是存在场景中的全部僵尸.对于地铁跑酷,奔牛跑酷,吃金币的碰撞检测算法亦是如此. 关键优化技术2:子弹检测碰撞僵尸,或是僵尸检测碰撞子弹,谁检测谁碰撞谁的问题,这个可能跟具体项目息息相关.可以从算法效率,以及设计

设计模式之适配器模式 adapter 适配器模式分类概念角色详解 类适配器 对象适配器 接口适配器 双向适配器

现实世界中的适配器模型 先来看下来几个图片,截图自淘宝 上图为港版的插头与港版的插座 上图为插座适配器卖家的描述图 上图为适配后的结果 现实世界中适配器模式 角色分类 这就是适配器模式在电源插座上的应用 我们看下在插座适配器中的几个重要角色 可以看得出来,大陆和港版插座面板,都是作为电源的角色,他们的功能是相似的或者说相近的 插头要使用插座,进而接通电流 现实世界到代码的转换 电源插座代码示例 港版插座面板 package adapter; /**目标角色 Target 接口 * 香港地区使用的

各种音视频编解码学习详解

各种音视频编解码学习详解 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等.最近因为项目的关系,需要理清媒体的codec,比较搞的是,在豆丁网上看运营商的规范 标准,同一运营商同样的业务在不同文档中不同的要求,而且有些要求就我看来应当是历史的延续,也就是现在已经很少采用了.所以豆丁上看不出所以然,从 wiki上查.中文的wiki信息量有限,很短,而wiki的英文内容内多,删减版

JDBC详解(2)

1.加载驱动程序. 注册驱动程序有多方法,Class.forName();是一种显式地加载.当一个驱动程序类被Classloader装载后,在溶解的过程中,DriverManager会注册这个驱动类的实例.这个调用是自动发生的,也就是说DriverManager.registerDriver()方法被自动调用了, Class.forName("oracle.jdbc.driver.OracleDriver"); 当然我们也可以直接调用DriverManager.registerDriv

H.264 基础及 RTP 封包详解

一. h264基础概念 1.NAL.Slice与frame意思及相互关系 1 frame的数据可以分为多个slice.每个slice中的数据,在帧内预测只用到自己slice的数据, 与其他slice 数据没有依赖关系. NAL 是用来将编码的数据进行大包的. 比如,每一个slice 数据可以放在NAL 包中.I frame 是自己独立编码,不依赖于其他frame 数据.P frame 依赖 I frame 数据. B frame 依赖 I frame, P frame 或其他 B frame 数

hibernate 详解

 Hibernate 1 Hibernate的配置文件 1.1 cfg 该文件的后缀为*.cfg.xml hibernate配置文件,该文件中主要存放了 数据的url地址 数据库用户信息 缓存 mapping文件的配置路径 <session-factory > <property name="connection.url">jdbc:oracle:thin:@192.168.8.62:1521:orcl</property> <proper