BOF算法+K-Means算法实现图像检索(Matlab实现代码)
2016-04-13 19:37
537 查看
更新:
很多同学告诉我说代码运行有问题,运行的时候缺少文件或者找不到文件,我在这里补充一下:
大家需要把里面的SIFT_features等三个文件夹添加到文件路径,不然matlab运行的时候只会搜索当前文件夹下文件。具体做法是,在matlab里面选中文件夹,右键-》添加到文件路径-》选定的文件夹和子文件夹。然后运行do_demo.m就行了
再补充一下,有同学提醒说k-means算法只迭代了一次,有错误。我检查了一下,我的K-Means算法确实有错误,应该是要计算很多轮,每一轮算完统一迭代类心,知道类心收敛不再改变为止。然后希望不要误导了大家,但是代码里面我就不改了,大家改一下K-means.m的那个function就行了。
![](http://img.blog.csdn.net/20170421132408906?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHJlYW1nY2h1YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
(运行结果)
分割线
———–
最近看到数据挖掘中的K-Means算法,想到它经常和图像分类中的BOF算法结合,恰好自己最近在做图像检索方面的研究,就试着实现了一下,代码资源我会在文后附上链接
BOF(Bag of Features)算法实际上就是BOW(Bag of Words)算法在图像领域的应用。可以参考下图:
![](http://img.blog.csdn.net/20160413181112266)
图片来源 Bag of Features (BOF)图像检索算法
BOF算法的主要操作步骤如下:
视觉单词提取:首先我们先提取图片库中所有图片的图片特征,这里图片特征可以是SIFT,SURF,MSER特征等等,我在实现时使用的SIFT特征. BOW算法中是以“词”为单位形成词袋的,BOF算法中我们以每个特征作为一个patch,相当于一个视觉单词。
视觉词典构建:以一定的算法对所有的图片特征进行分类,K-Means和SVM算法均可,但是K-Means算法最为常用。比如K=500时,我们可以把所有的特征按照相似度量分成500个聚类,每个聚类有一个类心,那么这500个类心就相当于词袋中的500个基本词汇。
图像表示:统计每张图片在每个聚类中的特征个数,这样每个图片就可以由一个分布直方图表示,或者说用一个K维的向量表示,向量第i维的值为该图片在第i个聚类中的特征个数。那么每个图像都可以由基本词汇表示。
图像检索:对于一个待检索的图像,我们先提取该图像的图像特征,并产生该图像的分布直方图,即或者一个K维向量。然后,根据余弦相似定理,计算该向量与图片库中每个图像的余弦夹角。夹角越小,相似度越大,夹角越大,相似度越小。
或者需要详细的BOF讲解可以参考这个链接:Bag of Features (BOF)图像检索算法
![](http://img.blog.csdn.net/20160413193328235)
本实验中采用SIFT特征,K-means聚类算法,初始类心随机选择,图片库图片数量625。
最后实验表明,BOF算法的检索效果确实很不错,好的时候查准率可以达到90%,最差情况下也能满足50%左右的查准率。
在实验中,我总结了一些需要注意的地方:
图片库大有利于特征聚类,当图片数量较少,图像特征不多的情况下,每个聚类的中特征点个数也就几十个。这对于统计分类来说,结果不够可信,误差也较大。
图片库特征点个数(至少20万个)较多情况下,聚类个数多一些检索效果较好,但是也不能太多,不然会出现上面的情况。一般都是成百上千个。
初始类心的选择对结果有一定的影响,不同初始类心的选择可能导致查准率有较大的波动。一般来说图片越多,它的影响就会越小。也可以通过指定初始类心,使得结果更优。
带检索图片的特征点个数太少,检索结果会比较差,但也不是越多越好。
TF-IDF算法是用来在信息检索中确定关键字权值,也常和BOF算法结合使用,用来确定每个类心的权值,理论上会对实验结果有一定的提高。我在实验中没有使用,苦于没有找到合适的参考方法,TF-IDF怎么统计并确定每个类心的权值?以及这种权值对于求余弦相似度的影响是怎样的?如果有明白的同学,希望能够告诉我具体方法,谢谢了。
对K-Means算法和TF-IDF算法不太熟悉的同学可以参考一下这个链接,里面会有说明数据挖掘经典算法概述以及详解链接
这里贴上源码的下载链接:KMeans+BOF实现图像检索(Matlab)Download
下载之后解压,打开后,应该可以得到这样一个目录:
![](http://img.blog.csdn.net/20160413190905103)
文件夹sourcePictures是我采集的图片库,里面有五类图像:飞机,铁塔,游轮,摩天轮,桥。
文件夹testPictures中是用来检索的图片;
需要大家做的就是将sourcePictures文件夹中所有图片的路径都读到img_paths.txt文件中,因为里面的路径是我电脑上的存储路径,所以需要大家再自己操作一遍,使用自己电脑上的存储路径,方法也很简单,这里提供一个链接:
读取指定文件夹中所有文件名以及文件路径
最后运行do_demo.m文件就可以了,大概半个多小时就能出结果。
每个文件的作用里面会有注释,大家也可以按照自己需要更换图片库或者参数等等。
另外,po主在准备保研了,祝福我吧
很多同学告诉我说代码运行有问题,运行的时候缺少文件或者找不到文件,我在这里补充一下:
大家需要把里面的SIFT_features等三个文件夹添加到文件路径,不然matlab运行的时候只会搜索当前文件夹下文件。具体做法是,在matlab里面选中文件夹,右键-》添加到文件路径-》选定的文件夹和子文件夹。然后运行do_demo.m就行了
再补充一下,有同学提醒说k-means算法只迭代了一次,有错误。我检查了一下,我的K-Means算法确实有错误,应该是要计算很多轮,每一轮算完统一迭代类心,知道类心收敛不再改变为止。然后希望不要误导了大家,但是代码里面我就不改了,大家改一下K-means.m的那个function就行了。
(运行结果)
分割线
———–
最近看到数据挖掘中的K-Means算法,想到它经常和图像分类中的BOF算法结合,恰好自己最近在做图像检索方面的研究,就试着实现了一下,代码资源我会在文后附上链接
BOF(Bag of Features)算法实际上就是BOW(Bag of Words)算法在图像领域的应用。可以参考下图:
图片来源 Bag of Features (BOF)图像检索算法
BOF算法的主要操作步骤如下:
视觉单词提取:首先我们先提取图片库中所有图片的图片特征,这里图片特征可以是SIFT,SURF,MSER特征等等,我在实现时使用的SIFT特征. BOW算法中是以“词”为单位形成词袋的,BOF算法中我们以每个特征作为一个patch,相当于一个视觉单词。
视觉词典构建:以一定的算法对所有的图片特征进行分类,K-Means和SVM算法均可,但是K-Means算法最为常用。比如K=500时,我们可以把所有的特征按照相似度量分成500个聚类,每个聚类有一个类心,那么这500个类心就相当于词袋中的500个基本词汇。
图像表示:统计每张图片在每个聚类中的特征个数,这样每个图片就可以由一个分布直方图表示,或者说用一个K维的向量表示,向量第i维的值为该图片在第i个聚类中的特征个数。那么每个图像都可以由基本词汇表示。
图像检索:对于一个待检索的图像,我们先提取该图像的图像特征,并产生该图像的分布直方图,即或者一个K维向量。然后,根据余弦相似定理,计算该向量与图片库中每个图像的余弦夹角。夹角越小,相似度越大,夹角越大,相似度越小。
或者需要详细的BOF讲解可以参考这个链接:Bag of Features (BOF)图像检索算法
本实验中采用SIFT特征,K-means聚类算法,初始类心随机选择,图片库图片数量625。
最后实验表明,BOF算法的检索效果确实很不错,好的时候查准率可以达到90%,最差情况下也能满足50%左右的查准率。
在实验中,我总结了一些需要注意的地方:
图片库大有利于特征聚类,当图片数量较少,图像特征不多的情况下,每个聚类的中特征点个数也就几十个。这对于统计分类来说,结果不够可信,误差也较大。
图片库特征点个数(至少20万个)较多情况下,聚类个数多一些检索效果较好,但是也不能太多,不然会出现上面的情况。一般都是成百上千个。
初始类心的选择对结果有一定的影响,不同初始类心的选择可能导致查准率有较大的波动。一般来说图片越多,它的影响就会越小。也可以通过指定初始类心,使得结果更优。
带检索图片的特征点个数太少,检索结果会比较差,但也不是越多越好。
TF-IDF算法是用来在信息检索中确定关键字权值,也常和BOF算法结合使用,用来确定每个类心的权值,理论上会对实验结果有一定的提高。我在实验中没有使用,苦于没有找到合适的参考方法,TF-IDF怎么统计并确定每个类心的权值?以及这种权值对于求余弦相似度的影响是怎样的?如果有明白的同学,希望能够告诉我具体方法,谢谢了。
对K-Means算法和TF-IDF算法不太熟悉的同学可以参考一下这个链接,里面会有说明数据挖掘经典算法概述以及详解链接
这里贴上源码的下载链接:KMeans+BOF实现图像检索(Matlab)Download
下载之后解压,打开后,应该可以得到这样一个目录:
文件夹sourcePictures是我采集的图片库,里面有五类图像:飞机,铁塔,游轮,摩天轮,桥。
文件夹testPictures中是用来检索的图片;
需要大家做的就是将sourcePictures文件夹中所有图片的路径都读到img_paths.txt文件中,因为里面的路径是我电脑上的存储路径,所以需要大家再自己操作一遍,使用自己电脑上的存储路径,方法也很简单,这里提供一个链接:
读取指定文件夹中所有文件名以及文件路径
最后运行do_demo.m文件就可以了,大概半个多小时就能出结果。
每个文件的作用里面会有注释,大家也可以按照自己需要更换图片库或者参数等等。
另外,po主在准备保研了,祝福我吧
相关文章推荐
- PHP GD 图像处理组件的常用函数总结
- PHP图像处理之imagecreate、imagedestroy函数介绍
- 解析在main函数之前调用函数以及对设计的作用详解
- 关于ASP eof与bof 区别分析
- 详解Matlab中 sort 函数用法
- jsvascript图像处理―(计算机视觉应用)图像金字塔
- Javascript图像处理思路及实现代码
- java和matlab画多边形闭合折线图示例讲解
- PHP图像处理之使用imagecolorallocate()函数设置颜色例子
- java数字图像处理基础使用imageio写图像文件示例
- C#调用Matlab生成的dll方法的详细说明
- 使用Java进行图像处理的一些基础操作
- javascript图像处理―边缘梯度计算函数
- Javascript图像处理―阈值函数实例应用
- Javascript图像处理―虚拟边缘介绍及使用方法
- PHP图像处理类库及演示分享
- php图像处理函数大全(推荐收藏)
- 简述Matlab中size()函数的用法
- Javascript图像处理―图像形态学(膨胀与腐蚀)
- Javascript图像处理―平滑处理实现原理