VLAD算法是BOW算法的改进版。
论文为Aggregating local descriptors into a compact image representation 。
与BOW算法不同之处在于, BOW是计算各个聚类中心所属的SIFT特征子的个数, 根据所属的个数进行编码。 VLAD算法则是计算各个聚类中心所属的SIFT特征子距离聚类中心的距离和并进行编码。 VLAD算法编码出的特征向量不仅包含了特征子的数量信息,还包含了特征子到聚类中心的距离信息。 比BOW算法反映更多的信息。 简单的例为下图。


下面使用 OpenCV 结合sklearn 中的 KMeans 聚类实现VLAD算法。
因为 SIFT 是长度为128的向量, 对两张图像进行kmeans聚类时计算量非常大,很耗时。
这里面用到了一个叫 AFK-mc2 的种子生成算法,对Kmeans 聚类加速的效果非常明显。 作者已经把它做成了python的库了(kmc2), 安装直接调用就可以。
这里面得到2张图像的特征向量后,通过余弦距离计算相似度, 越接近1说明越相似。

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*
import numpy as np
import cv2
from sklearn.cluster import KMeans
from sklearn.cluster import MiniBatchKMeans
import kmc2def kmc2_seed(m, num):seeding = kmc2.kmc2(m, num, afkmc2 = True)model = MiniBatchKMeans(num, init = seeding).fit(m)new_centers = model.cluster_centers_return new_centersdef Coslength(p,q, alpha):# 幂归一 + L2归一p = np.power(p, alpha)q = np.power(q, alpha)p = [i / np.sqrt(np.sum(np.power(p,2))) for i in p]q = [i / np.sqrt(np.sum(np.power(q,2))) for i in q]r = np.dot(p,q)/(np.linalg.norm(p)*(np.linalg.norm(q)))return rdef VLAD(img1, img2, SeedNum): sift = cv2.xfeatures2d.SIFT_create()gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)kp1 = sift.detect(gray1, None)kp2 = sift.detect(gray2, None)sift_val_back1 = sift.compute(gray1, kp1)[1]sift_val_back2 = sift.compute(gray2, kp2)[1][r1, c1] = sift_val_back1.shape[r2, c2] = sift_val_back2.shapecombine = np.vstack((sift_val_back1, sift_val_back2))afk_seed = kmc2_seed(combine, SeedNum)    # kmeans 聚类, bow[i] 为每个特征属于哪个组的, cord[i] 为各个中心组分别是第几号的 #  distance[i] 为各个特征与所属的中心点的距离差distance = KMeans(n_clusters = SeedNum, init = afk_seed).fit_transform(combine)bow = KMeans(n_clusters = SeedNum, init = afk_seed).fit(combine).predict(combine)cord = KMeans(n_clusters = SeedNum, init = afk_seed).fit(combine).cluster_centers_point_num = len(bow)center_num = len(cord)L1 = [0 for i in range(center_num)]L2 = [0 for i in range(center_num)]for i in range(0, point_num):for j in range(center_num):if i < r1:L1[bow[i]] += distance[i,j]else:L2[bow[i]] += distance[i,j]return Coslength(L1, L2, 0.8)if __name__ == "__main__":im1 = cv2.imread('/home/result2/a1.png')im2 = cv2.imread('/home/result2/a5.png')similarity = VLAD(im1,im2, 50)print(similarity)

做个实验


相似度: 0.867


相似度: 0.838


相似度: 0.660

VLAD算法比较2张图片相似度相关推荐

  1. 广告行业中那些趣事系列26:基于PoseNet算法的人体姿势相似度识别

    摘要:本篇从理论到实践分享了基于PoseNet算法的人体姿势相似度识别项目.首先介绍了项目背景,因为部门搞活动需要大家去模仿夸张搞笑的表情和姿势来提升活动的可玩性,所以需要利用CV算法对图片进行相似度 ...

  2. 如何计算两幅图像的相似度,计算两张图片相似度

    怎么对比两张图片的相似度 1.首先打开微信,选择底部"发现".如图所示.2.然后在点击进入"小程序".如图所示.3.然后输入"腾讯AI体验中心&quo ...

  3. vlad用python实现_「vlad」VLAD算法简介 - seo实验室

    vlad 1.1  vlad基础概念 VLAD是vector of locally aggregated descriptors的简称,是由Jegou et al.在2010年提出,其核心思想是agg ...

  4. VLAD算法简介 图像检索

    1.1  vlad基础概念 VLAD是vector of locally aggregated descriptors的简称,是由Jegou et al.在2010年提出,其核心思想是aggregat ...

  5. 怎么检测两张照片的相似度,两张图片相似度测试

    计算图像相似度的算法有哪些 SIM=StructuralSIMilarity(结构相似性),这是一种用来评测图像质量的一种方法. 由于人类视觉很容易从图像中抽取出结构信息,因此计算两幅图像结构信息的相 ...

  6. js 冒泡排序_JS 里的简易算法和数据结构之复杂度

    原文:https://www.freecodecamp.org/news/the-complexity-of-simple-algorithms-and-data-structures-in-java ...

  7. 详解利用基于gensim的TF-IDF算法实现基于文本相似度的推荐算法

    详解利用基于gensim的TF-IDF算法实现基于文本相似度的推荐算法 TF-IDF的基本原理 算法思想 计算公式 相似度计算原理 微型图书推荐案例 案例背景 开发工具 数据预处理 TF-IDF模型建 ...

  8. java 图片相似搜索_JAVA比较两张图片相似度的方法

    本文实例讲述了JAVA比较两张图片相似度的方法.分享给大家供大家参考.具体如下: 摘要: importjava.awt.image.BufferedImage; importjava.io.File; ...

  9. ML之KG:基于MovieLens电影评分数据集利用基于知识图谱的推荐算法(networkx+基于路径相似度的方法)实现对用户进行Top电影推荐案例

    ML之KG:基于MovieLens电影评分数据集利用基于知识图谱的推荐算法(networkx+基于路径相似度的方法)实现对用户进行Top电影推荐案例 目录 基于MovieLens电影评分数据集利用基于 ...

最新文章

  1. Rocksdb DeleteRange实现原理
  2. 操作主机 RID matser[为企业维护windows server 2008系列七]
  3. matlab 最小二乘法拟合_机器学习十大经典算法之最小二乘法
  4. python web-Web开发
  5. linux文件系统挂载磁盘,linux – 无法挂载磁盘(VFS:找不到ext4文件系统)
  6. python制作射击游戏_用python3从零开始开发一款烧脑射击游戏#2
  7. pyqt5讲解10:布局管理讲解大全
  8. python怎么打开程序管理器_Python 进程管理工具 Supervisor 使用教程
  9. 纸质书,电子书,你会选择通过哪一种途径学习?
  10. Entity Framework 学习初级篇7--基本操作:增加、更新、删除、事务(转)
  11. C语言编程:如何计算二叉树叶子结点数目?
  12. python制作日历并保存成excel_python台历代码--涉及知识点为Excel表格合并等操作
  13. html里面输出大于号和小于号
  14. 这几个插件,让你的 vscode 更牛逼!
  15. 电脑准考证登录不上去
  16. office 所有后缀对应的 content-type
  17. 电影记忆之16(人工智能)
  18. 单片机的停车场计数系统c51_基于51单片机的停车场车位管理系统
  19. linux系统装fluent没有界面,Linux上安装ANSYS后的一些坑(未完待续)
  20. 模块学习(四)——超声波测距

热门文章

  1. CentOS7防火墙firewalld开放指定端口
  2. You asked to pull from the remote ‘origin‘, but did not specify a branch. Because this is not the de
  3. 初始化Direct3D的基本概念
  4. Linux系统管理---centos软件安装方式
  5. 可解释性研究(一)- GNNExplainer
  6. json graphql_使用json-graphql-server模拟GraphQL API
  7. 小白天堂之编写词法语法分析器何其简单(一)
  8. Unity之图片轮播组件实现
  9. SDU创新实训 9.创建各类文件数据汇总整理
  10. if x 和 if x is not None的区别(python)