BoV
BOV解决的是提取SIFT特征之后,特征数据量太多而无法快速计算相似度的问题。如果是用聚类算法对这些SIFT特征矢量数据进行聚类,然后用聚类中的一个簇代表BOV中的一个视觉词,将同一幅图像的SIFT矢量映射到视觉词序列生成码本,这样每一幅图像只用一个码本矢量来描述,这样计算相似度时效率就大大提高了。
具体来说BoV特征编码主要是下面的步骤:
- 对训练集中的M副图像进行预处理并提取SIFT特征,假设一共提取N个特征。
- 用K-means对提取的N个SIFT特征进行聚类, K个聚类的中心词被选为视觉词。
- 计算每一幅图像的每一个SIFT特征到这K个视觉词的距离,并将其映射到距离最近的视觉词中(即将该视觉词的对应词频+1)。
- 3里得到每幅图像与视觉词序列相对应的词频矢量之后,对词频向量进行l1归一化。
Fisher Vector
Fisher Vector(FV)是一种类似于BOV词袋模型的一种编码方式, FV采用混合高斯模型(GMM)构建码本,但是FV不只是存储视觉词典的在一幅图像中出现的频率,并且FV还统计视觉词典与局部特征(如SIFT)的差异。Fisher Vector本质上是用似然函数的梯度vector来表达一幅图像,这个梯度向量的物理意义就是表达了参数往哪个方向修正才能最佳拟合数据。
FV的步骤如下:
- 首先从图片上提取出特征描述子(如SIFT特征),假设每个描述子是D维的。
- 令这些特征描述子符合K个高斯分布的线性组合(即混合高斯分布),并训练出GMM参数,系数wi均值μdi以及方差σdi
- 求出该图片(用其特征描述子表示)在某GMM下的概率函数
- 用似然函数的梯度vector来表达这幅图像,即∂L(X|λ)∂wi, ∂L(X|λ)∂μdi 及 ∂L(X|λ)∂σdi这样就把长度不一的图片特征向量转化为长度相等了。
- 最后一步通过计算fisher matrix的对角线期望[3]来进行特征向量的归一化,归一化的向量也被称为Fisher kernel,可以用来计算两个点在某个空间内的距离,可直接用于SVM分类中。
FisherVector相对于BOV的优势在于,BOV得到的是一个及其稀疏的向量,由于BOV只关注了关键词的数量信息,这是一个0阶的统计信息;FisherVector并不稀疏,同时,除了0阶信息,FisherVector还包含了1阶(期望)信息、2阶(方差信息),因此FisherVector可以更加充分地表示一幅图片