计算机视觉——Bag Of features图像检索

  • 原理
  • 什么是图像检索
  • 什么是Bag Of Word模型
  • 什么是sift特征提取
  • 什么是视觉词典
  • 什么是TF-IDF
  • 基于BOW的图像检索步骤
  • 结果与分析
  • 10维
  • 100维
  • 1000维
  • 5000维
  • 分析
  • 总结
  • 遇到的问题及解决


原理

什么是图像检索

图像检索就是基于图像的某一特征对其他图片进行匹配检索。从20世纪70年代开始,有关图像检索的研究就已开始,当时主要是基于文本的图像检索技术(Text-based Image Retrieval,简称TBIR),利用文本描述的方式描述图像的特征,如绘画作品的作者、年代、流派、尺寸等。到90年代以后,出现了对图像的内容语义,如图像的颜色、纹理、布局等进行分析和检索的图像检索技术,即基于内容的图像检索(Content-based Image Retrieval,简称CBIR)技术。在这里我们主要讨论的是基于内容的图像检索BOW(bag of words)模型最初应用于文本处理领域,用来对文档进行分类和识别。

什么是Bag Of Word模型

Bagofwords模型,也叫做“词袋”,在信息检索中,Bag of words model假定对于一个文本,忽略其词序和语法、句法,将其仅仅看做是一个词集合,或者说是词的一个组合,文本中每个词的出现都是独立的,不依赖于其他词是否出现,或者说当这篇文章的作者在任意一个位置选择一个词汇都不受前面句子的影响而独立选择的。
这种假设虽然对自然语言进行了简化,便于模型化,但是其假定在有些情况下是不合理的,例如在新闻个性化推荐中,采用Bag of words的模型就会出现问题。例如用户甲对“南京醉酒驾车事故”这个短语很感兴趣,采用bag of words忽略了顺序和句法,则认为用户甲对“南京”、“醉酒”、“驾车”和“事故”感兴趣,因此可能推荐出和“南京”,“公交车”,“事故”相关的新闻,这显然是不合理的。
在图像检索中,将图片分割成若干小块,再聚类成“词袋”中的若干个基础图片单词。

什么是sift特征提取

详见 计算机视觉——SIFT特征提取与检索.

什么是视觉词典

对于已经提取的图像特征进行遍历,并利用聚类方法(本次实验使用K-Means算法)将其投影到词汇上,特征描述子分为K个簇,以使簇内具有较高的相似度,而簇间相似度较低,将词义相近的词汇合并,作为单词表中的基础词汇,聚类类别的数量K即为整个视觉词典的大小基础词汇的个数。提交至数据库,由此产生该图片群的视觉词典。

什么是TF-IDF

TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
在图像检索中,这种方法有利于判断图像特征在一张图像中的占比,对于在很多图像中都存在的特征,将其频率下调以表示该特征是普遍特征,并不能作为检索图像的关键线索。

基于BOW的图像检索步骤

1.构造不小于100张图片的数据集
2.针对数据集,做SIFT特征提取
3.根据SIFT特征提取结果,采用k-means算法学习“视觉词典(visual vocabulary)”,其中维度至少满足4个量级
4.根据IDF原理, 计算每个视觉单词的权重
5.针对数据库中每张图片的特征集,根据视觉词典进行量化以及TF-IDF解算。每张图片转化成特征向量
6.对于输入的检索图像(非数据库中图片),计算SIFT特征,并根据TF-IDF转化成频率直方图/特征向量
7.构造检索图像特征到数据库图像的倒排表,快速索引相关候选匹配图像集
8.针对候选匹配图像集与检索图像进行直方图/特征匹配

结果与分析

利用不同维度计算出的视觉词典来对图像进行索引,即在生成词汇表时修改函数voc.train(featlist,1000,10) 中的第二个参数,得到的结果如下:

待检索的图片:

图像检索 pytorch faiss 图像检索模型_聚类

10维

常规检索:

图像检索 pytorch faiss 图像检索模型_聚类_02


重排后检索:

图像检索 pytorch faiss 图像检索模型_图像检索 pytorch faiss_03

100维

常规检索:

图像检索 pytorch faiss 图像检索模型_数据集_04


重排后检索:

图像检索 pytorch faiss 图像检索模型_图像检索_05

1000维

常规检索:

图像检索 pytorch faiss 图像检索模型_图像检索 pytorch faiss_06


重排后检索:

图像检索 pytorch faiss 图像检索模型_数据集_07

5000维

常规检索:

图像检索 pytorch faiss 图像检索模型_图像检索_08


重排后检索:

图像检索 pytorch faiss 图像检索模型_图像检索 pytorch faiss_09

分析

本次实验数据集有100张图片,在这100张图片中大约有20种左右的物品,每种物品拍摄4-6张图片。上述例子选取的待检索图片在数据集中是拍摄了5张图片,因此我也是将查询返回的图像数设为5.
从上述结果可以看出,k-means聚类算法学习出的视觉词典,当维度不同的时候检索的结果也有很大不同。因为数据集中物品类别比较多,因为若是维度太小(10维)的时候,就会导致聚类不清,很多不同类别的物品有可能因为同有一些非常普遍的特征而被分到了一类中,这就导致了检索的效果十分的不理想,5张搜索的图片里全是与目标图片无关的。随着维度慢慢增加(从10维到100维到1000维),这检索的效果越来越理想,100维时,还尚有一张图片是错误的,1000维时就能正确匹配到所有的图像了。但是维度过大(5000维)也不是绝对的好,这时候几乎每一个物品的每一张图片都被分成一类,过拟合了,也是会使检索的结果不理想的。
在上述例子里,重拍的结果与常规结果没什么差别。但是通过分析原理,我认为,重排时利用ransac算法去除错误的匹配点有可能会去除真正的错误点让结果更加合适,但也有可能去除了正确的匹配点。又试了几组图片后发现本次没有得出重排与常规算法不同的结果有可能是因为准备的数据集不够充分,比如说有些图片特征明显,匹配的点多,检索的正确率就高了,有些图片特征不明显,匹配的点少,自然在去除错误匹配点的时候ransac算法也起不到什么作用,就没有准备那种有可能有错误点供去除的图片。

总结

通过本次实验,我又深刻的认识到聚类算法中聚类中心个数对于聚类的重要性,如果太少,会导致欠拟合,就不能有一个正确的聚类结果,但是太多又会导致过拟合,聚类出来的结果也是不理想的,因此应该根据实际特征数选择合适的聚类中心数。还有就是准备的数据集要充分考虑所有情况的发生,不能为了准确率而故意准备某些类型的图片,每一种情况都要考虑到,所对应的数据也要准备好。

遇到的问题及解决

  1. TypeError: a bytes-like object is required, not ‘str’
    原因是在这里,python3和Python2在套接字返回值解码上有区别。python3需要字节类型对象而不是字符串
    解决:改为pickle.loads(s[0]),不要转换为str
  2. TypeError: ‘cmp’ is an invalid keyword argument for this function
    原因是Python3下的sort函数把cmp参数给取消掉了。
    解决:用functools.cmp_to_key()来代替
  3. NameError: name ‘cmp’ is not defined
    原因是版本中已经没有cmp函数,被operator模块代替,在交互模式下使用时,需要导入模块。
    解决:将cmp改为operator.eq()