在模式分类领域,结合了生成和判别模式的 Fisher kernel 方法是一个非常有效的框架。该策略是使用来自生成模型的梯度向量来表示信号,然后再将这种表示送入到判别模型的分类器中。论文中将该框架应用到图像分类领域,其中输入信号是图像,并将视觉词汇作为前在的生成模型——混合高斯模型,用来表示图像中底层特征的近似分布。Fisher kernel 可以看做是 Bag-of-visterms 的一种扩展,同时它具有比较少的计算量,在一种类别上训练出来的词典可以应用到其他类别上,同时不会产生很严重的损失。
图像分类是根据图像的内容对给图像分配单个或多个标签的问题,该问题常常因为视角,光照以及场景的变化而具有挑战性。因此虽然再过去几年一些优秀的方法不断被提出,但该问题仍值得探究。有些方法直接对图像的低层次特征分布进行建模,而不考虑它们在图像内的绝对位置或是相对位置。尽管这些方法比较简单,但是却在最近的评估中得到了最佳表现。
这其中最流行的方法,受到文本分类中使用的 bag-of-words(词袋) 算法,被称为 bag-of-keypatches 或 bag-of-visterm(BOV)。在下面的介绍中,文中使用的是后一种更为通用的描述。给定视觉词汇(码本,codebook),该算法的思路是用每个视觉词的出现次数来表示图像。然后可以使用任何分类器来对该频数直方图表示的图像进行分类。视觉词汇包(码本)的大部分工作都集中在视觉词汇的估计上。通常可以使用诸如 k-means,高斯混合模型(GMM)或 mean-shift 来聚类底层特征向量来完成。
目前已经观察到,即使在包含有限数量的类别(<10) 的数据库中,通常都会使用包含数百到数千个视觉单词的大词汇表来获得最佳的性能。由于频数直方图计算的成本直接取决于视觉词汇的数量。在文献[17]中提出了一种基于信息瓶颈原理的方法。使最初包含数千个单词的词汇表(码本)减少到大约 200 个而没有任何性能上的损失。降低计算成本的另一种方法是以树结构组织词汇表,例如文献[12]中使用的 Extremely Randomized Clustering Forests。但是上述两种情况的码本都是不通用的,它们是为当前的特定类别所设计的,因此对于新的类别,需要重新进行学习。所以对于想要不完全重新训练系统的情况下将新类别逐渐添加到训练集时会出现问题。在处理大量类别的时可能会出现这种情况,因为事先可能不知道完整的类别集。
由于视觉词袋的两个看似矛盾的要求。即普适性和紧凑性(计算量小),因此很多研究人员放弃寻找那些独一无二的视觉词袋,转而提出对每一幅图像给出一个很小的词袋,但是这种方法并不会降低计算开销。
为了克服上述问题,本文提出了使用 Fisher kernel 来实现对目标的分类任务。Fisher kernel 的思想是使用一个概率密度函数的梯度向量来描述一个信号,也就是将信号产生的过程进行模型化,即一种生成模型方法。然后再将使用这种方法表示的图像向量输入到分类器中进行处理。考虑到输入信号是图像,因此本文提出生成视觉词袋时使用高斯混合模型这种生成式模型,该模型能够近似的给出图像底层特征的分布。需要注意的是, Fisher kernel 已经应用在了图像分类问题上,但是使用的是一种另一种不同的模型,即星座模型,文献[14]。同样的, Fisher kernel 也已成功应用在了诸如声音检索以及音频识别任务上。
使用 Fisher kernel 的梯度与 BOV 模型的频率直方图相比的一个主要优点是: Fisher kernel 所表示的图像向量的维度比 BOV 表示的图像向量维度高很多。因此并不需要使用计算量非常大的核函数来将特征映射到高维空间中去。所以使用 Fisher kernel 表示的图像向量仅使用线性分类器就能获得很好的结果。
在使用 Fisher kernel 的生成模型时一个关键的选择是 是否将类别标记作为潜变量来处理。当生成模型将类标作为潜变量时, Fisher kernel 的效果和 MAP 解码器效果一样好,但是这样产生的视觉词袋是一种有监督学习得到的,不容易应用在新的数据集上。
模式分类可以分为生成式方法和判别式方法。生成模型是按照类别的概率密度函数模型化的过程,也就是尝试找出生成当前数据的机制,而判别模型直接针对分类问题设计模型。而这也就说明了判别模型在理论上的优势,当然,生成模型也有很多优点,如能够处理变长数据。
Fisher kernel 融合了生成模型和判别模型的方法。令 p p p 为图像特征点的概率密度函数,其参数记为 λ \lambda λ,则一幅图像的样本 X = { x t , t = 1 , . . . , T } X=\{x_t,t=1,...,T\} X={xt,t=1,...,T} ,该图像共有 T T T 个特征点(图像已经完成预处理以及特征提取过程),可以使用如下梯度向量来描述:
∇ λ l o g p ( X ∣ λ ) \nabla_{\lambda}log_p(X|\lambda) ∇λlogp(X∣λ)
从公式(1)直观来看,这幅图像的概率密度函数的 log 似然函数梯度描述了应该修改参数的方向以最佳的拟合数据。上述公式将可变长度样本 X X X 转换为固定长度的向量,其大小仅取决于模型中的参数数量。
然后可以使用任何判别模型的分类器来对该梯度向量进行分类。对于那些通过计算一个内积关系来找到最优分类平面的分类器来说,将输入向量归一化是很重要的。在文献[5]中,给出的 Fisher 信息矩阵如下所示:
F λ = E X [ ∇ λ l o g p ( X ∣ λ ) ∇ λ l o g p ( X ∣ λ ) ′ ] F_{\lambda}=E_X[\nabla_{\lambda}log\ p(X|\lambda)\nabla_{\lambda}log\ p(X|\lambda)'] Fλ=EX[∇λlog p(X∣λ)∇λlog p(X∣λ)′]
使用Fisher 信息矩阵标准化的梯度向量表示如下:
F λ − 1 / 2 ∇ λ l o g p ( X ∣ λ ) F_{\lambda}^{-1/2}\nabla_{\lambda}log\ p(X|\lambda) Fλ−1/2∇λlog p(X∣λ)
由于上面公式的计算开销比较大,因此 F λ F_{\lambda} Fλ 通常近似为单位矩阵且不执行标准化操作,下一节将会给出一个 F λ F_{\lambda} Fλ 的近似对角矩阵。
为什么对图像特征的概率密度函数求偏导能够作为图像的特征向量呢?
一幅图像的概率密度函数表示的是由图像中所有 SIFT 特征描述子的概率密度函数组成的,而每个 SIFT 特征描述子的概率密度函数又是由 K 个高斯模型加权表示的,也就是说整幅图像间接地由 K 个高斯模型表示。分别对每个高斯模型参数求偏导,其偏导值反应了该高斯模型在这幅图像中的分布情况,从而可以作为该幅图像的特征向量。
本文提出在视觉词汇表中应用 Fisher kernel ,其中视觉词汇通过 GMM(混合高斯模型)来表示。 X = { x t , t = 1 , . . . , T } X=\{x_t,t=1,...,T\} X={xt,t=1,...,T} 为从一张图像中提取到的底层特征集合, λ \lambda λ 表示 GMM 的参数,其中, λ i = { w i , μ i , Σ i , i = 1... N } \lambda_i=\{w_i,\mu_i,\Sigma_i,i=1...N\} λi={wi,μi,Σi,i=1...N},其中 w i , μ i , Σ i w_i,\mu_i,\Sigma_i wi,μi,Σi 分别表示权重,均值向量和第 i i i 个高斯分布的协方差矩阵, N N N 表示该混合高斯模型一共有 N N N 个高斯模型组成。组成混合高斯模型的单个高斯模型表示了当前的视觉词汇信息, w i w_i wi 表示词汇 i i i 的频率, μ i \mu_i μi 为词汇的均值而 Σ i \Sigma_i Σi 表示围绕均值的方差情况。
令一幅图像特征点的概率密度函数的似然函数为 L ( X ∣ λ ) = l o g p ( X ∣ λ ) \mathcal{L}(X|\lambda)=log\ p(X|\lambda) L(X∣λ)=log p(X∣λ),假设每个 SIFT 特征描述子之间相互独立,则有:
L ( X ∣ λ ) = ∑ t = 1 T l o g p ( x t ∣ λ ) \mathcal{L}(X|\lambda)=\sum_{t=1}^Tlog\ p(x_t|\lambda) L(X∣λ)=t=1∑Tlog p(xt∣λ)
这幅图像中任意的一个变量 x t x_t xt 的似然函数都可以通过 GMM 产生的 N 个高斯模型表示,具体可以表示为:
p ( x t ∣ λ ) = ∑ i = 1 N w i p i ( x t ∣ λ ) p(x_t|\lambda)=\sum_{i=1}^Nw_ip_i(x_t|\lambda) p(xt∣λ)=i=1∑Nwipi(xt∣λ)
其中权重的约束条件为:
∑ i = 1 N w i = 1 \sum_{i=1}^Nw_i=1 i=1∑Nwi=1
而 p i p_i pi 可以由下式给出:
p i ( x ∣ λ ) = e x p { − 1 2 ( x − μ i ) ′ Σ i − 1 ( x − μ i ) } ( 2 π ) D / 2 ∣ Σ i ∣ 1 / 2 p_i(x|\lambda)=\frac{exp\{-\frac1 2(x-\mu_i)'\Sigma_i^{-1}(x-\mu_i)\}}{(2\pi)^{D/2}|\Sigma_i|^{1/2}} pi(x∣λ)=(2π)D/2∣Σi∣1/2exp{−21(x−μi)′Σi−1(x−μi)}
其中 D D D 是特征向量 x i x_i xi 的维数, ∣ ⋅ ∣ |\cdot| ∣⋅∣ 表示矩阵的行列式。这里假设协方差矩阵是对角阵,因为:
γ t ( i ) \gamma_t(i) γt(i) 表示特征 x t x_t xt 是由第 i i i 个高斯分布生成的概率,其使用贝叶斯公式计算公式如下所示:
γ t ( i ) = p ( i ∣ x t , λ ) = w i p i ( x t ∣ λ ) ∑ j = 1 N w j p j ( x t ∣ λ ) \gamma_t(i)=p(i|x_t,\lambda)=\frac{w_ip_i(x_t|\lambda)}{\sum_{j=1}^Nw_jp_j(x_t|\lambda)} γt(i)=p(i∣xt,λ)=∑j=1Nwjpj(xt∣λ)wipi(xt∣λ)
对每幅图像,可以通过对 L ( X ∣ λ ) = l o g p ( X ∣ λ ) \mathcal{L}(X|\lambda)=log\ p(X|\lambda) L(X∣λ)=log p(X∣λ) 的**每个视觉单词的三个参数求偏导,来表示每个视觉单词在该图像中的分布情况。**串联每个视觉单词的三个参数的偏导作为特征向量来表示这幅图像,然后再输入到分类器中进行处理。对于三个参数的偏导结果如下所示:
∂ L ( X ∣ λ ) ∂ w i = ∑ t = 1 T [ γ t ( i ) w i − γ t ( 1 ) w 1 ] f o r i ≥ 2 \frac{\partial\mathcal{L}(X|\lambda)}{\partial w_i}=\sum_{t=1}^T\left[\frac{\gamma_t(i)}{w_i}-\frac{\gamma_t(1)}{w_1}\right]\ \ for\ \ i\geq2 ∂wi∂L(X∣λ)=t=1∑T[wiγt(i)−w1γt(1)] for i≥2
∂ L ( X ∣ λ ) ∂ w i = ∑ t = 1 T γ t ( i ) [ x t d − μ i d ( σ i d ) 2 ] \frac{\partial\mathcal L(X|\lambda)}{\partial w_i}=\sum_{t=1}^T\gamma_t(i)\left[\frac{x_t^d-\mu_i^d}{(\sigma_i^d)^2}\right] ∂wi∂L(X∣λ)=t=1∑Tγt(i)[(σid)2xtd−μid]
∂ L ( X ∣ λ ) ∂ σ i d = ∑ t = 1 T γ t ( i ) [ ( x t d − μ i d ) 2 ( σ t d ) 3 − 1 σ i d ] \frac{\partial\mathcal L(X|\lambda)}{\partial\sigma_i^d}=\sum_{t=1}^T\gamma_t(i)\left[\frac{(x_t^d-\mu_i^d)^2}{(\sigma_t^d)^3}-\frac{1}{\sigma_i^d}\right] ∂σid∂L(X∣λ)=t=1∑Tγt(i)[(σtd)3(xtd−μid)2−σid1]
其中,上标 d d d 表示向量的第 d d d 维。将整幅图像中所有的特征点(视觉词汇)分别对上述三个参数求偏导并串联起来,得到的就是整幅图像的梯度向量表示。其中,公式(9)中定义 i > 2 i>2 i>2,因为存在约束(6)使得只有 ( N − 1 ) (N-1) (N−1) 个自由权重。
为了归一化梯度向量的不同维数的变化,需要计算 Fisher 信息矩阵 F F F 的对角阵,文中令 f w i , f μ i d , f σ i d f_{w_i},f_{\mu_i^d},f_{\sigma_i^d} fwi,fμid,fσid 分别表示矩阵 F F F 对角线上的 ∂ L ( X ∣ λ ) / ∂ w i \partial\mathcal L(X|\lambda)/\partial w_i ∂L(X∣λ)/∂wi, ∂ L ( X ∣ λ ) / ∂ μ i d \partial\mathcal L(X|\lambda)/\partial \mu_i^d ∂L(X∣λ)/∂μid, ∂ L ( X ∣ λ ) / ∂ σ i d \partial\mathcal L(X|\lambda)/\partial \sigma^d_i ∂L(X∣λ)/∂σid。因此归一化后的相应的偏导数为 f w i − 1 / 2 ∂ L ( X ∣ λ ) / ∂ w i f_{w_i}^{-1/2}\partial\mathcal L(X|\lambda)/\partial w_i fwi−1/2∂L(X∣λ)/∂wi, f μ i d − 1 / 2 ∂ L ( X ∣ λ ) / ∂ μ i d f_{\mu_i^d}^{-1/2}\partial\mathcal L(X|\lambda)/\partial \mu_i^d fμid−1/2∂L(X∣λ)/∂μid, f σ i d − 1 / 2 ∂ L ( X ∣ λ ) / ∂ σ i d f_{\sigma_i^d}^{-1/2}\partial\mathcal L(X|\lambda)/\partial \sigma^d_i fσid−1/2∂L(X∣λ)/∂σid。可以证明有:
f w i = T ( 1 w i + 1 w 1 ) f_{w_i}=T\left(\frac{1}{w_i}+\frac{1}{w_1}\right) fwi=T(wi1+w11)
f μ i d = T w i ( σ i d ) 2 f_{\mu_i^d}=\frac{Tw_i}{(\sigma^d_i)^2} fμid=(σid)2Twi
f s i g m a i d = 2 T w i ( σ i d ) 2 f_{sigma_i^d}=\frac{2Tw_i}{(\sigma_i^d)^2} fsigmaid=(σid)22Twi
上述公式是第一次针对 GMM 的 Fisher 信息矩阵提出的闭式近似,有关这些推导的更多详细信息可以参考本文的附录。
下面来比较一下本文提出的 Fisher kernel 模型和传统的 BOV 模型,在 BOV 模型中,第 i i i 个视觉单词出现的频率表示如下:
1 T ∑ γ t ( i ) \frac{1}{T}\sum\gamma_t(i) T1∑γt(i)
从公式(9)个公式(15)中可以清楚的看到,当仅考虑相对于权重参数的梯度时,则 BOV 与 Fisher kernel 是直接相关的:它们均考虑了 0-阶统计量(字数统计,即单词出现的频数)。然而,当得到关于均值和标准差的导数时,Fisher kernel 同时考虑了1阶和2阶统计量。对于大小为 N N N 的词汇表,BOV 会给出一个 N N N 维的直方图,而使用 Fisher kernel 得到特征向量是 ( 2 ∗ D + 1 ) ∗ N − 1 (2*D+1)*N-1 (2∗D+1)∗N−1,在本文的实验中, D = 50 D=50 D=50,使用 Fisher kernel 得到的特征维度是使用 BOV 得到的特征维度的 100 倍左右。而这也就使得能够使用非常高维度的向量来表示图像,即使是仅包含大约 100 个视觉词汇的相当小的词汇表。
使用 Fisher kernel 处理视觉词袋过程为:
从一幅图像中提取出 SIFT 特征描述子,再对所有图像的所有 SIFT 特征描述子利用 GMM 模型处理得到视觉词袋,通过这些 SIFT 特征描述子以及视觉词袋构造每幅图像的概率密度函数表示,对图像的概率密度函数表示给每个视觉单词在三个参数上求偏导,串联起所有图像的所有偏导来形成该图像的特征向量,从而可以直接应用在分类器中。
这一节讨论使用 Fisher kernel 的生成模型的视觉词汇表的设计。这里最简单的思想就是使用所有来自所有类别或单一数据集上的底层特征向量上以无监督的方式来训练 GMM。然而,在文献[5]中,作者有如下描述:
A kernel classifier employing the Fisher kernel derived from a model that contains the label as latent variable is, asymptotically, at least as good a classifier as the MAP labeling based on the model
当生成模型将类标作为潜变量时, Fisher kernel 的效果和 MAP 解码器效果一样好
以 GMM 为例,对于一个 K 分类问题,类别表示为 w k w_k wk,将类标信息作为潜变量意味着概率密度函数具有以下形式:
p ( x ) = ∑ k = 1 K p ( w k ) p ( x ∣ w k ) p(x)=\sum_{k=1}^Kp(w_k)p(x|w_k) p(x)=k=1∑Kp(wk)p(x∣wk)
上面的公式中,每个类别的条件概率 p ( x ∣ w k ) p(x|w_k) p(x∣wk) 本身就是一个 GMM,因此必须使用相应类别的训练数据以有监督的方式来学习这类类别条件概率密度函数。在这种情况下,相同的词汇表不能夸人物使用,并且必须针对每个不同的类别集分别进行学习。
GMM 的有监督学习已经在 BOV 框架中有所应用,再文献[3]中,作者提出了通过将所有的高斯分布折叠在一起(folding)来训练每个类别的每个词汇 p ( x ∣ w k ) p(x|w_k) p(x∣wk) 以及创建单个词汇。与无监督方式相比,这种方法有了显著的改进。然而不幸的是,这种方法对于大量类别的数据来说是不切实际的,因为词汇量的大小随着类别数目的增加而线性增加。为了领这种方法更加实用,文献[14]中提出了将k类问题转换为 k 个2分类问题。他们使用通用词汇表来描述所有考虑的类别的视觉内容,以及相应的类别词汇表。对于每个类别,通过合并通用词汇和相应类别词汇表来创建新的组合词汇表。对于给定的图像,计算组合词汇表中每个类别的一个直方图。则这些直方图中的每一个数量都描述了图像内容是否有通用词汇表或相应的类别词汇表来最好的建模。由于 BOV 和 Fisher kernel 之间的紧密联系,文献[14]和文献[3]的模型将标签作为潜标量的实时可以解释为什么它们优于那些以无人监督的方式训练词汇的方法。
因此, 我们将在非监督方式训练的词汇表上测试 Fisher kernel (即在模型不包含标签作为潜在变量的情况下), 也在受监督的方式 (即在模型包含标签作为潜在变量的情况下)。对于后一种情况, 本文倾向于 使用文献[14] 而不是文献 [3]中的方法, 因为它的实用性和更好的性能。这意味着, 对于给定的图像, 我们将为每个类别导出一个梯度的表示形式。
下面部分讨论如何使用 GMM 来生成视觉词袋:
利用 GMM 模型产生视觉词袋和 K-means 聚类方法产生视觉词袋类似,都是对图像的底层特征向量,如 SIFT 特征描述子,进行处理,K-means 聚类是通过计算欧式距离,然后找出 K 个聚类中心,而 GMM 模型是通过 EM 算法训练 SIFT 特征描述子,从而得到每个视觉关键词在 K 个高斯分布上的权重,均值和协方差矩阵,本文实验提到应用论文 “Adapted Vocabularies for Generic Visual Categorization” 中的方法来利用 GMM 模型训练得到视觉词袋,下面主要介绍这篇文章中如何训练 GMM 得到视觉词袋。
GMM 聚类数据统计学习中的概率模型类,即要学习的模型的形式为 P ( Y ∣ X ) P(Y|X) P(Y∣X),也就是训练模型得到的是一系列值的概率,而不是具体的值。这样就可以知道 Y Y Y 在样本数据 X X X 中的分布情况。GMM 聚类过程就是训练出 K K K 个概率模型 p i ( x ∣ λ ) p_i(x|\lambda) pi(x∣λ) 来作为视觉单词,即对样本的概率密度分布进行估计。
如果多维变量 x x x 服从高斯分布,则其概率密度函数为:
p ( x , μ , Σ ) = e x p [ − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ] 2 π ∣ Σ ∣ p(x,\mu,\Sigma)=\frac{exp[-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)]}{\sqrt{2\pi|\Sigma|}} p(x,μ,Σ)=2π∣Σ∣exp[−21(x−μ)TΣ−1(x−μ)]
这里记 λ \lambda λ 为高斯混合模型的参数,则有 λ = { w i , μ i , Σ i , i = 1 , . . . , N } \lambda=\{w_i,\mu_i,\Sigma_i,i=1,...,N\} λ={wi,μi,Σi,i=1,...,N},其中 w i w_i wi 表示第 i i i 个高斯模型的权重, μ i \mu_i μi 表示第 i i i 个高斯模型的均值向量, Σ i \Sigma_i Σi 表示第 i i i 个高斯模型的协方差矩阵, N N N 表示所使用的高斯模型的数量。每个高斯模型表示视觉词袋中的一个单词: w i w_i wi 表示模型 i i i 的频率, μ i \mu_i μi 表示模型 i i i 的平均值, Σ i \Sigma_i Σi 表示模型 i i i 围绕均值的变化情况。这里假设协方差矩阵是对角阵,因此可以记为: σ i 2 = d i a g ( Σ i ) \sigma_i^2=diag(\Sigma_i) σi2=diag(Σi)。因为 GMM 产生的每个视觉单词是由所有观察量 x x x 训练得到的,因此每个观察量 x x x 就可以用这些视觉单词来表示,具体表示如下:
p ( x t ∣ λ ) = ∑ i = 1 N w i p i ( x t ∣ λ ) s . t . ∑ i = 1 N w i = 1 p i ( x ∣ λ ) = e x p { − 1 2 ( x − μ i ) ′ Σ i − 1 ( x − μ i ) } ( 2 π ) D / 2 ∣ Σ i ∣ 1 / 2 p(x_t|\lambda)=\sum_{i=1}^Nw_ip_i(x_t|\lambda)\\ s.t.\ \sum_{i=1}^Nw_i=1\\ p_i(x|\lambda)=\frac{exp\left\{-\frac1 2(x-\mu_i)'\Sigma_i^{-1}(x-\mu_i)\right\}}{(2\pi)^{D/2}|\Sigma_i|^{1/2}} p(xt∣λ)=i=1∑Nwipi(xt∣λ)s.t. i=1∑Nwi=1pi(x∣λ)=(2π)D/2∣Σi∣1/2exp{−21(x−μi)′Σi−1(x−μi)}
这里记 L ( X ∣ λ ) = l o g p ( X ∣ λ ) \mathcal L(X|\lambda)=log\ p(X|\lambda) L(X∣λ)=log p(X∣λ),该概率密度函数的似然函数从本质上就可以表示一幅图像 X X X,这里假设每个 SIFT 特征描述子之间是相互独立的,则一幅图像可以表示为:
L ( X ∣ λ ) = ∑ t = 1 T l o g p ( x t ∣ λ ) \mathcal L(X|\lambda)=\sum_{t=1}^Tlog\ p(x_t|\lambda) L(X∣λ)=t=1∑Tlog p(xt∣λ)
接下来需要确定如何训练得到视觉词典。视觉词典是通过**最大似然估计(MLE)**得到。假设 X = { x t , t = 1 , . . . , T } X=\{x_t,t=1,...,T\} X={xt,t=1,...,T} 表示从所有图像的 SIFT 特征描述子中随机取出的底层特征向量集合,也就是 x t x_t xt 表示第 t t t 个SIFT 特征描述子。参数 λ \lambda λ 的估计是通过最大化似然函数 L ( X ∣ λ ) \mathcal L(X|\lambda) L(X∣λ) 得到的,这里可以通过 EM 算法进行计算得到。EM 算法分为两步:
首先随机给出视觉单词 i i i 的初始值 λ i = { w i , μ i , Σ i } \lambda_i=\{w_i,\mu_i,\Sigma_i\} λi={wi,μi,Σi},然后:
E-step:计算
γ t ( i ) = p ( i ∣ x t , λ ) = w i p i ( x t ∣ λ ) ∑ j = 1 N w j p j ( x t ∣ λ ) , t = 1 , . . . , T \gamma_t(i)=p(i|x_t,\lambda)=\frac{w_ip_i(x_t|\lambda)}{\sum\limits_{j=1}^Nw_jp_j(x_t|\lambda)},\ t=1,...,T\\ γt(i)=p(i∣xt,λ)=j=1∑Nwjpj(xt∣λ)wipi(xt∣λ), t=1,...,T
γ t ( i ) \gamma_t(i) γt(i) 表示了观察量 x x x 是由第 i i i 个视觉单词产生的概率。M-step:调整参数 λ i \lambda_i λi:
w ^ i u = 1 T ∑ t = 1 T γ t ( i ) \hat w_i^u=\frac1 T\sum_{t=1}^T\gamma_t(i) w^iu=T1t=1∑Tγt(i)
μ ^ i u = ∑ t = 1 T γ t ( i ) x t ∑ t = 1 T γ t ( i ) \hat \mu _i^u = \frac{{\sum\nolimits_{t = 1}^T {{\gamma _t}(i){x_t}} }}{{\sum\nolimits_{t = 1}^T {{\gamma _t}(i)} }} μ^iu=∑t=1Tγt(i)∑t=1Tγt(i)xt
( σ ^ i u ) 2 = ∑ t = 1 T γ t ( i ) x t 2 ∑ t = 1 T γ t ( i ) − ( μ ^ i u ) 2 {\left( {\hat \sigma _i^u} \right)^2} = \frac{{\sum\nolimits_{t = 1}^T {{\gamma _t}(i)x_t^2} }}{{\sum\nolimits_{t = 1}^T {{\gamma _t}(i)} }} - {\left( {\hat \mu _i^u} \right)^2} (σ^iu)2=∑t=1Tγt(i)∑t=1Tγt(i)xt2−(μ^iu)2
计算 L ( X ∣ λ ) \mathcal L(X|\lambda) L(X∣λ) 前后两次差值是否小于某个阈值,也就是看 L ( X ∣ λ ) \mathcal L(X|\lambda) L(X∣λ) 是否收敛。如果收敛,则此时的 λ i \lambda_i λi 即求出。而这也就是第 i i i 个高斯函数,也就是第 i i i 个视觉单词;如果不收敛,则继续迭代 EM 算法中的两步。
重新随机选样得到 X = { x t , t = 1 , . . . , T } X=\{x_t,t=1,...,T\} X={xt,t=1,...,T} ,重复上面的步骤,直到给出 K 个视觉词汇为止。
高斯混合模型得到的视觉词汇,并不想 K-means 方法那样得到的是 K 个真正的词汇描述,而是 K 组高斯模型参数,用来当做这个视觉单词。因为高斯模型的参数可以反应每个观察量 x x x 属于视觉单词 k k k 的概率,从而也就反应了这个参数(视觉单词)在这幅图像中的分布情况。
因此主要思想就是,首先提出所有训练图像的所有 SIFT 特征描述子,利用 GMM 模型训练得到 K 个视觉单词(K 个高斯模型参数)。然后对于每幅图像利用其所有的 SIFT 特征描述子及所有视觉单词得到该幅图像的概率密度函数的似然函数表示(得到 K 个视觉单词,即 K 个高斯模型后,对图像中任意一个 SIFT 特征描述子都可以用 K 个视觉单词的所属概率加权和表示,最后将所有 SIFT 特征描述子的概率相加就可以表示这幅图像),然后对这个似然函数应用 Fisher kernel 进行处理,也就是对所有视觉关键词的所有参数求骗到处理,最后得到一个 ( 2 ∗ D + 1 ) ∗ N − 1 (2*D+1)*N-1 (2∗D+1)∗N−1 为维的向量来表示这幅图像。然后这个向量可以直接送入到后面的分类器中进行处理。
由于刚刚接触图像检索领域,这里对 BOW 也做一些补充:
构建针对计算机视觉的 BOW 码本的基本步骤:
- 假设训练集有 M 幅图像,对训练图像集进行预处理。包括图像增强,分割,图像同一格式,同一规格等;
- 提取 SIFT 特征。对每一幅图像提取 SIFT 特征(每一幅图像提取多少个 SIFT 特征不确定)。每一个 SIFT 特征使用一个 128 维的矢量描述子来表示,这里假设 M 幅图像一共提取出 N 个 SIFT 特征;
- 使用 k-means 对上述 N 个 SIFT 特征进行聚类,k-means 算法是一种基于样本间相似性度量的间接聚类算法,该算法以 k 为参数,将 N 个对象分为 k 个簇。且簇内具有比较高的相似度,而簇间具则具有比较低的相似度。聚类完成后,得到 k 个聚类中心(在 BOW 中称之为 “视觉词“)。也就是码本的长度就是 k,计算每一幅图像的每一个 SIFT 特征到这 k 个视觉词汇的距离,并将其映射到距离最近的视觉词汇中。
在完成上述三步后,每张图像也就变成了一个与视觉词序列相对应的词频矢量。
此外,在构造码本的过程中,码本矢量需要进行归一化。因为每一幅图像的 SIFT 特征数量不确定,所以需要进行相应的归一化。比如第一幅图像的词频矢量为 [ 1 , 0 , 0 ] [1,0,0] [1,0,0],第二幅图像的词频矢量为 [ 5 , 3 , 4 ] [5,3,4] [5,3,4],则进行归一化后相应的词频矢量为: [ 1 , 0 , 0 ] , 1 12 ∗ [ 5 , 3 , 4 ] [1,0,0],\frac1 {12}*[5,3,4] [1,0,0],121∗[5,3,4]。
最后生成相应的分类器,利用所有训练图像归一化后的词频矢量来训练一个分类器。该分类器可以使用 SVM,朴素贝叶斯等相应的判别模型分类器。但通常使用 SVM 的情况比较多。
在训练好相应的分类器后,对于测试样本,同样首先提取 SIFT 特征,然后将 SIFT 特征映射到码本中,生成相应的词频矢量。然后对该矢量进行归一化处理,再交给训练好的分类器进行分类即可。