Fisher Vector学习笔记

1,背景

现有的模式分类方法主要分为两类,一类是生成式方法,比如GMM,这类方法主要反映同类数据之间的相似度;一类是判别式方法,比如SVM,主要是反映异类数据之间的差异。fisher kernel是想要结合二者的优势(1,生成式方法可以处理长度不一的输入数据,2,判别式方法不能处理长度不一的数据但是分类效果较好。),将生成式模型用于判别式分类器中。

关于处理长度不一的数据,举例说明如下:

我们要对一个图片集I=X1,X2...中的图片做分类,考虑生成式的方法,GMM,是对每一幅图片Xi=x1,...xT的特征xi建模(每个xi是D维特征向量),T代表一幅图片中提取的特征点个数,所以T的大小变化,不影响GMM建模。但是判别式分类器如SVM中是要计算样本X之间的距离,如果每个X的特征点个数T不一样,那么他们的维度也就不一样,无法计算他们之间的距离。

论文《Exploiting generative models in discriminative classifiers》中对fisher kernel进行了理论上的一系列推导和阐述。论文《Fisher Kernel on Visual Vocabularies for Image Categorization》中fisher kernel被应用于图像分类,本文主要参考这篇。论文《Improving the Fisher Kernel for Large-Scale Image Classification》中对fisher vector做改进。

fisher kernel被应用于图像分类的主要思路是,用生成式模型(GMM)对样本输入进行建模,进而得到样本的一种表示(fisher vector),再将这种表示(fisher vector)输入判别式分类器(SVM)得到图像分类结果。fisher vector是fisher kernel中对样本特征的一种表示,它把一幅图片表示成一个向量。

本文主要关注fisher vector。


2,fisher kernel

核方法可以定义一种基于核函数的判别式分类器,可表示如下:

Snew=sign(∑iSiλiK(Xi,Xnew))

Xi,Si 是训练集中样本i的值和它的label值,label值只能取+1和-1,也就是分成两类,λi是样本i在训练集中所占的权重;

Xnew,Snew是一个新来的样本值和分类器预测出得它的label值;

这里的K(Xi,Xnew)是一个核函数,度量新样本Xnew 和训练集样本Xi 之间的相似度。

所以需要确定λ和核函数K(Xi,Xj) 就可以确定一种基于核的分类方法。其中λ可以通过做一些优化得到,而在fisher kernel中,就是利用fisher信息矩阵得到一个核函数来度量样本相似度。

对于一个核函数,有如下的形式:

K(Xi,Xj)=?TXi?Xj.

这里是一个内积的形式,我们将一幅图片的特征们X映射到一个新的特征向量,也就是?X,那么这个内积就是这两个新特征向量?Xi,?Xj的欧式距离,很直观地反映了样本i,j之间的相似度。

这个?X 就是fisher kernel中的样本表示方法,它就是fisher vector,它由fisher score归一化得到,Fλ 是fisher信息矩阵:

?X=F?12λUx.

定义fisher score:

Ux=?λlogp(X|λ).

X服从分布p,p的参数是λ,在fisher kernel中,p是一个GMM,X=x1,...xT 是一幅图片的特征集合(可以用sift特征),λ={wi,μi,∑i,i=1...N},它是GMM的模型参数,wi 是GMM中第i个component的权重,μi,∑i 是均值和协方差,由高斯模型的原理可知这两个都是向量,且和特征向量xt的维度一致,都是D维(如果xt 是一个sift特征向量,那么它们就是128维)。

这个log似然函数对λ 的梯度,描述了参数λ 在p生成特征点集合X的过程中如何作用,所以这个fisher score中也包含了GMM生成X的过程中的一些结构化的信息。

F?12λ是用来对Ux做归一化的,所以Fλ=UXUTX,这里来证明一下这个归一化,记V=UX:

[(VVT)?12V]T[(VVT)?12V]=VT[(VVT)?12]T(VVT)?12V=VT(VVT)?1VVTV=1

所以核函数就有了如下分解形式:

K(Xi,Xj)=UTXiF?1λUXj

这里要求F?1λ 是半正定的,所以给F求期望:Fλ=Ex(UXUTX).

至此,我们就能对一幅图片的特征点集合计算出fisher vector了。


3,计算fisher vector

首先定义:

L(X|λ)=logp(X|λ)=∑t=1Tlogp(xt|λ).

由于一幅图片中的特征点是相互独立的,所以:

p(xt|λ)=∑i=1Nwipi(xt|λ).

pi是GMM中第i个component的pdf,wi是其权值,∑Ni=1wi=1.

component pi 的pdf是多元高斯函数,如下:

再定义特征xt由第i个Gaussian component生成的概率:

首先对参数求偏导可得到:

UX=[?L(X|λ)?wi,?L(X|λ)?μdi,?L(X|λ)σdi]T,i=1...N.

其中

注意这里i是指第i个component,d是指特征xt 的第d维,偏导是对每个component,对特征每个维度都要计算,所以此时UX 的维度是(2D+1)*N,D是xt维度,N是component个数。又由于wi 有约束∑iwi=1,所以会少一个自由变量,所以UX 最终的维度是(2D+1)*N-1.

求得UX后,就可以求Fλ,设F中对角线上的元素可以表示为fwi,fμdi,fσdi, 通过简单的求期望运算就可以得到它们的值:

这里算得的矩阵F两个维度都是(2D+1)*N-1.

所以fisher vector

?X=[Xw,d,i,Xμ,d,i,Xσ,d,i]=[f?1/2wi?L(X|λ)?wi,f?1/2μdi?L(X|λ)?μdi,f?1/2σdi?L(X|λ)?σdi].

维度和UX一样,也是(2D+1)*N-1.


4,总结

fisher vector的结果是对原图像特征升维了(从D到(2D+1)*N-1),它从图像的一种特征向量中挖掘了出更丰富的信息,最终对 ?X我们可以算得对均值和协方差的梯度:

可以看到,D维向量xt 中的每一个值,都与均值和方差做运算,并加上权重,fisher vector中包含了原特征向量每一维的值,并且包含了生成式建模过程的结构性信息,对图片的表达更加细致。

时间: 2024-08-01 17:47:47

Fisher Vector学习笔记的相关文章

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

Fisher Vector的改进

<Fisher vector学习笔记>中介绍了fisher vector相关知识,本文接着这片学习笔记,来记录论文<Improving the Fisher Kernel for Large-Scale Image Classification>中第三部分提出的对fisher vector的3种改进. 1,L2 Normalization 首先假设一幅图像的特征们X=xt,t=1...T服从一个分布p,对于Large-Scale image,根据大数定律,样本数T增大时,样本均值收

C++学习笔记之由文本文件读取数据到vector模板建立的二维数组 并存储为新的文本文件

阅读本文可首先参考: C++学习笔记之输入.输出和文件 测试数据: 1 /*读取txt文件到二维数组*/ 2 #include <iostream> 3 #include <fstream> 4 #include <vector> 5 #include <string> 6 7 using namespace std; 8 9 typedef vector< vector<int> > D2array; //二维数组 10 typed

C++学习笔记:Vector容器

vector v:初始化一个0大小的向量vector v(10):初始化一个10个大小的向量push_back:增加一个元素 pop:删除一个元素,不返回 front:返回第一个元素 back:返回最后一个元素 at:返回特定位置的元素 capacity:vector的容量,会自动扩大  也可以直接通过v[x]操作元素 /*: Test.cpp */ #include <iostream> #include <vector> #include <string> #inc

STL标准容器类学习笔记之(Vector/Deque/List)

STL标准容器类简介 1.顺序性容器 vector相当与数组,从后面快速的插入与删除,直接访问任何元素 deque双队列,从前面或后面快速的插入与删除,直接访问任何元素 list双链表,从任何地方快速插入与删除 2.关联容器 set快速查找,不允许重复值 multiset快速查找,允许重复值 map一对一映射,基于关键字快速查找,不允许重复值 multimap一对多映射,基于关键字快速查找,允许重复值 3.容器适配器 stack后进先出 queue先进先出 priority_queue最高优先级

Fisher Vector 通俗学习

我写东西喜欢五颜六色,也喜欢通俗的来讲!哈哈.... 核心: Fisher vector本质上是用似然函数的梯度vector来表达一幅图像 基础知识的预备: 1. 高斯分布 生活和自然中,很多的事和物的分布都可以近似的看做是高斯分布.比如说:一个班的成绩的优良中差的分布.最优秀的和最差的往往都是少数,一般人是大多数. 高斯分布直观的感受是这样的:这是这种分布的概率情况的表示: 2. 混合高斯分布 问题是:一个班的成绩的分布他也可能是这样的:60分以下以及95分以上很少人,60-75很多人,突然7

【CV知识学习】Fisher Vector

在论文<action recognition with improved trajectories>中看到fisher vector,所以学习一下.但网上很多的资料我觉得都写的不好,查了一遍,按照自己的认识陈述一下,望大牛指正. 核函数: 先来看一下<统计学习方法>里叙述的核函数的概念, 可以看到,核函数其实是一个内积,在SVM的公式可以提炼出内积的部分.数据在低维输入空间可能线性不可分,而在高维希尔伯特空间可能线性可分的,因此会经过一个映射函数.事实上,内积中可以理解为相似性即距

C++ Primer(第五版)学习笔记_3_标准模板库vector(2)

C++ Primer(第五版)学习笔记_3_标准模板库vector(2) 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 6.元素的插入 insert()方法可以在vector对象的任意位置前插入一个新的元素,同时,vector自动扩张一个元素空间,插入位置后的所有元素依次向后挪动一个位置. 要注意的是,insert()方法要求插入的位置,是元素的迭代器位置,而不是元素的下标. #include <iostream> #include <vector> using namespa

C++ Primer(第五版)学习笔记_2_标准模板库vector(1)

C++ Primer(第五版)学习笔记_2_标准模板库vector(1) 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 向量容器vector不但能像数组一样进行随机访问,还能在尾部插入元素,完全可以替代数组. 值得注意的是,vector具有内存自动管理的功能,对于元素的插入和删除,可以动态调整所占的内存空间. 容器vector的下标是从0开始的,如果vector容器的大小是n,则元素下标为0~n-1,这和数组的一样的.不一样的是,vector可以随时调整其大小. vector重要的方法有三个