前言
BOF算法(Bag of Features)和VLAD算法(Vector of Locally Aggregated Descriptors)都是图像检索算法,都使用聚类来将特征描述子分组,进而形成视觉单词表,但又有不同点,下面是两个算法的流程和对比。
BOF算法的流程
1、提取训练集图片的SIFT特征,设N张图片得到共M个128维的特征向量,存入des
2、对des进行K-Means聚类,得到K个聚类中心,即码本
3、计算一个图像的每个特征向量到K个聚类中心的距离,并将其映射到距离最近的聚类中心上(将该聚类中心对应的词频+1),就将这幅图像变成了一个与聚类中心序列相对应的词频矢量,将训练集的所有图片都进行这样的操作,得到了N个词频矢量。
4、输入测试图片,提取测试图片的SIFT特征,然后用第三步的方法得到测试图片的词频矢量。
5、计算测试图片的词频矢量和N个训练集的词频矢量的距离(欧氏距离or余弦距离)
6、得到距离最近的x张图片
VLAD算法流程
1、提取图像的SIFT描述子,设N张图片得到共M个128维的特征向量,存入des
2、对des进行K-Means聚类,得到K个聚类中心,即码本
3、把一副图像所有的SIFT描述子按照最近邻原则分配到聚类中心上,对每个聚类中心做残差和(即属于当前聚类中心的所有SIFT减去聚类中心然后求和),对这个残差和做L2归一化,然后拼接成一个K*128的长向量。128是单条SIFT的长度。对所有图片进行这个操作,共得到N个长向量。
4、输入测试图片,提取测试图片的SIFT特征,然后用第三步的方法得到测试图片的长向量。
5、计算测试图片的向量和N个训练集的向量的距离(欧氏距离or余弦距离)
6、得到距离最近的x张图片
区别
BOF(Bag Of Features):建立码本时采用K-means,在映射时,利用视觉词袋量化图像特征,统计的词频直方图,该词频直方图即为编码后的特征向量,损失的信息较多。
VLAD(vector of locally aggregated descriptors):VLAD像BOF那样,只考虑离特征点最近的聚类中心,VLAD保存了每个特征点到离它最近的聚类中心的距离; 像Fisher vector那样,VLAD考虑了特征点的每一维的值,对图像局部信息有更细致的刻画; 而且VLAD特征没有损失信息。
VLAD算法比BOF算法更加准确,但计算量也更大,需要更多时间。