BOF算法原理

BOF介绍

BOF(Bag of features),即图像特征词典。
Bag of Feature 是一种图像特征提取方法,它借鉴了文本分类的思路(Bag of Words),从图像抽象出很多具有代表性的「关键词」,形成一个字典,再统计每张图片中出现的「关键词」数量,得到图片的特征向量。
「Bag of Feature」的本质是提出一种图像的特征表示方法。
根据「Bag of Feature」算法的思想,首先我们要找到图像中的关键词,而且这些关键词必须具备较高的区分度。实际过程中,通常会采用「SIFT」特征。

Bag of Feature 算法过程

「Bag of Feature」大概分为四步:
1、 提取图像特征
2、 对特征进行聚类,得到一部字典( visual vocabulary );
3、 根据字典将图片表示成向量(直方图);
4、 训练分类器或者用 KNN 进行检索(这一步严格来讲不属于「Bag of Feature」的范畴)。

BOF过程浅析

1、提取图像特征
首先特征提取。前文提到了,是要利用sift特征提取方法。
2、学习“视觉词典”
得到图像特征后进行聚类,得到视觉词典

3、根据特征集进行量化
针对输入特征集,根据视觉词典进行量化

BOF算法测试

测试数据集1

首先第一步,就是提取每一个图片的sift特征。

# -*- coding: utf-8 -*-
import pickle
from PCV.imagesearch import vocabulary
from PCV.tools.imtools import get_imlist
from PCV.localdescriptors import sift#获取图像列表
imlist = get_imlist('first1000/')
nbr_images = len(imlist)
#获取特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]#提取文件夹下图像的sift特征
for i in range(nbr_images):sift.process_image(imlist[i], featlist[i])#生成词汇
voc = vocabulary.Vocabulary('ukbenchtest')
voc.train(featlist, 1000, 10)
#保存词汇
# saving vocabulary
with open('first1000/vocabulary.pkl', 'wb') as f:pickle.dump(voc, f)
print ('vocabulary is:', voc.name, voc.nbr_words)


会得到一个.pkl文件,即视觉词典。
第二步就是将得到的特征集导入数据库中。
其中,PCV中imagesearch.py第三行的pysqlite2,在Python3中是不需要的,因为Python3自带数据库包sqlite3.所以改成

from sqlite3 import dbapi2 as sqlite

即可。

# -*- coding: utf-8 -*-
import pickle
from PCV.imagesearch import imagesearch
from PCV.localdescriptors import sift
from sqlite3 import dbapi2 as sqlite
from PCV.tools.imtools import get_imlist#获取图像列表
imlist = get_imlist('first1000/')
nbr_images = len(imlist)
#获取特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]# load vocabulary
#载入词汇
with open('first1000/vocabulary.pkl', 'rb') as f:voc = pickle.load(f)
#创建索引
indx = imagesearch.Indexer('testImaAdd.db',voc)
indx.create_tables()
# go through all images, project features on vocabulary and insert
#遍历所有的图像,并将它们的特征投影到词汇上
for i in range(nbr_images)[:1000]:locs,descr = sift.read_features_from_file(featlist[i])indx.add_to_index(imlist[i],descr)
# commit to database
#提交到数据库
indx.db_commit()con = sqlite.connect('testImaAdd.db')
print (con.execute('select count (filename) from imlist').fetchone())
print (con.execute('select * from imlist').fetchone())

然后得到

一个数据库文件。

第三步就是测试数据库文件,进行图像检索。
其中是因为没有配置好,所以在这一行代码

出现错误,OperationError:no such table:imlist
所以利用配置好的包进行测试

# -*- coding: utf-8 -*-
import pickle
from PCV.localdescriptors import sift
from PCV.imagesearch import imagesearch
from PCV.geometry import homography
from PCV.tools.imtools import get_imlist# load image list and vocabulary
#载入图像列表
imlist = get_imlist('first1000/')
nbr_images = len(imlist)
#载入特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]#载入词汇
with open('first1000/vocabulary.pkl', 'rb') as f:voc = pickle.load(f)src = imagesearch.Searcher('testImaAdd.db',voc)# index of query image and number of results to return
#查询图像索引和查询返回的图像数
q_ind = 0
nbr_results = 20# regular query
# 常规查询(按欧式距离对结果排序)
res_reg = [w[1] for w in src.query(imlist[q_ind])[:nbr_results]]
print ('top matches (regular):', res_reg)# load image features for query image
#载入查询图像特征
q_locs,q_descr = sift.read_features_from_file(featlist[q_ind])
fp = homography.make_homog(q_locs[:,:2].T)# RANSAC model for homography fitting
#用单应性进行拟合建立RANSAC模型
model = homography.RansacModel()
rank = {}# load image features for result
#载入候选图像的特征
for ndx in res_reg[1:]:locs,descr = sift.read_features_from_file(featlist[ndx])  # because 'ndx' is a rowid of the DB that starts at 1# get matchesmatches = sift.match(q_descr,descr)ind = matches.nonzero()[0]ind2 = matches[ind]tp = homography.make_homog(locs[:,:2].T)# compute homography, count inliers. if not enough matches return empty listtry:H,inliers = homography.H_from_ransac(fp[:,ind],tp[:,ind2],model,match_theshold=4)except:inliers = []# store inlier countrank[ndx] = len(inliers)# sort dictionary to get the most inliers first
sorted_rank = sorted(rank.items(), key=lambda t: t[1], reverse=True)
res_geom = [res_reg[0]]+[s[0] for s in sorted_rank]
print ('top matches (homography):', res_geom)# 显示查询结果
imagesearch.plot_results(src,res_reg[:8]) #常规查询
imagesearch.plot_results(src,res_geom[:8]) #重排后的结果

得到结果

两种查询方式
1.常规查询
2.用单应性进行拟合建立RANSAC模型
都找到了相同的第一张图片内容数据集。

测试数据集2

我在网上找到了一个图像检索的测试数据集来测试代码。

因为原数据包中的照片数量多达四千九百多张,所以我删除了大部分,只保留了近两百五十几张图片。
运行结果:

这里只得到了常规查询的数据集。第二中查询方式出现了错误。

根据原因分析是因为特征值量化后所得的数据集超出了范围。

BOF图像特征词典的原理以及实际测试相关推荐

  1. 控件获取图像可从几方面取得?_基于图像特征与布局刻画的移动测试脚本跨平台录制回放...

    一. 引言 移动应用在全球范围内有着越发举足轻重的地位,因此移动应用的快速迭代和频繁的需求变更的特点引发了对应用质量保障的要求不断提高.在大型设备集群上迁移测试脚本是移动应用质量保障的关键技术之一,因 ...

  2. 图像特征:SIFT特征

    建议看->转自:  SIFT特征点提取:https://blog.csdn.net/lingyunxianhe/article/details/79063547 计算机视觉中的特征点提取算法比较 ...

  3. 遥感成像原理与遥感图像特征

    遥感平台分为航天平台.航空平台和地面平台.航天平台在150km以上,最高的是地球同步卫星36000km.航空平台在100m~10km不等. 垂直投影与中心投影 常用大比例尺地形图属于垂直投影:摄影相片 ...

  4. CS131-专题7:图像特征(SIFT算法)

    速记要点: SIFT是什么:全称Scale Invariant Feature Transform尺度不变特征转换,2004年的论文.可以检测出图像中的局部特征点. SIFT算法特点: 稳定性:SIF ...

  5. 【图像算法】图像特征:GLCM灰度共生矩阵纹理特征

    [图像算法]图像特征:GLCM SkySeraph Aug 27th 2011  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modifie ...

  6. 深度学习-CNN提取图像特征

    一.卷积层 1.卷积操作 2.特征提取-"X" or "O"? 二.池化(Pooling) 三.Relu 层 四.全连接层(Fully connected la ...

  7. 【OpenCV应用】python处理行李图像匹配项目——图像特征点

    OpenCV--图像角点检测应用记录 图像特征 Harris角点检测 Shi-Tomasi 角点检测 SIFT (尺度不变特征变换)原理 SURF (加速鲁棒性特征)原理 FAST角点检测 BRIEF ...

  8. image.merge图像有什么变化_图像特征工程:HOG特征描述子介绍

    介绍 在机器学习算法的世界里,特征工程是非常重要的.实际上,作为一名数据科学家,这是我最喜欢的方面之一!从现有特征中设计新特征并改进模型的性能,这就是我们进行最多实验的地方. 世界上一些顶级数据科学家 ...

  9. 图像特征之傅里叶描述子

    使用C++.opencv获取轮廓的傅里叶描述子 傅里叶描述子是一种图像特征,具体来说,是一个用来描述轮廓的特征参数.其基本思想是用物体边界信息的傅里叶变换作为形状特征,将轮廓特征从空间域变换到频域内, ...

  10. 图像特征(一)——颜色特征(颜色直方图,颜色矩,颜色集,颜色聚合向量和颜色相关图)

    本文主要是为了更好地理解图像特征,理解各方法的原理. 转载请注明出处 https://mp.csdn.net/console/editor/html/105090183 图像模式识别的一般步骤为:输入 ...

最新文章

  1. hdu 3652 B-number(数位DP)
  2. python supervisor_python之supervisor进程管理工具
  3. mysql主从数据丢失_故障分析 | 记一次 MySQL 主从双写导致的数据丢失问题
  4. AndroidStudio创建jinLibs文件夹
  5. Jeecg-Uniapp 移动框架开发环境搭建—— APP解决方案
  6. Vmware虚拟机不能使用键盘的解决方法
  7. 韩国拟监管加密相关国际汇款,以限制资金流向海外
  8. 百度地图服务器不显示本地运行,百度地图定位成功,但地图不显示
  9. [导入]表单确认按钮——Javascript函数
  10. python比对excel表数据中的差异_Python比对EXCEL数据
  11. 处理debian7下Juk导入音乐乱码
  12. Swift3.0学习笔记-Error Handling
  13. cf596B. Wilbur and Array
  14. 传真百科:传真通讯技术的发展历史
  15. 《数据结构课程设计》实验报告
  16. tyjl一2型计算机联锁引言,TYJL-II型计算机联锁.ppt
  17. shell 变量中间有空格 如何传入整个变量
  18. SNS(社会性网络服务)
  19. 华为云重大变革:CloudAI 升至华为第四大 BG ,火力全开
  20. Prometheus监控系部署配置过程

热门文章

  1. 最小生成树的第三种求法-Borůvka (Sollin) 算法
  2. Objectdock stacks docklet 无法启动程序快捷方式
  3. PDF怎么在线免费转换成WORD,亲测可用
  4. DICOM医学图像读取涉及到的医学坐标体系
  5. kubernetes Auditing 实战
  6. 【SIGIR2017满分论文】IRGAN:大一统信息检索模型的博弈竞争
  7. Linux进阶_加密和安全
  8. 单目标跟踪——常用数据集和指标
  9. “我,从油漆工开始的80后,曾经靠副业的收入买车买房”
  10. U盘安装Windows 11正式版绕过TPM检查