词袋模型笔记

在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/dorian3d/DBoW2,而bag of words 又运用了数据挖掘的K-means聚类算法,笔者只通过bag of words 模型用在图像处理中进行形象讲解,并没有涉及太多对SLAM的闭环检测的应用。

1.Bag-of-words模型简介

Bag-of-words模型是信息检索领域常用的文档表示方法。在信息检索中,BOW模型假定对于一个文档,忽略它的单词顺序和语法、句法等要素,将其仅仅看作是若干个词汇的集合,文档中每个单词的出现都是独立的,不依赖于其它单词是否出现。 也就是说,文档中任意一个位置出现的任何单词,都不受该文档语意影响而独立选择的。举个例子就好理解:

例如有如下两个文档:

1:Bob likes to play basketball, Jim likes too.

2:Bob also likes to play football games.

基于这两个文本文档,构造一个词典:

Dictionary = {1:”Bob”, 2. “likes”, 3. “to”, 4. “play”, 5. “basketball”, 6. “also”, 7. “football”, 8. “games”, 9. “Jim”, 10. “too”}。

这个词典一共包含10个不同的单词,利用词典的索引号,上面两个文档每一个都可以用一个10维向量表示(用整数数字0~n(n为正整数)表示某个单词在文档中出现的次数):

1:[1, 2, 1, 1, 1, 0, 0, 0, 1, 1]

2:[1, 1, 1, 1 ,0, 1, 1, 1, 0, 0]

向量中每个元素表示词典中相关元素在文档中出现的次数。不过,在构造文档向量的过程中可以看到,我们并没有表达单词在原来句子中出现的次序。

 

Bag-of-words模型应用于图像表示:

为了表示一幅图像,我们可以将图像看作文档,即若干个“视觉词汇”的集合,同样的,视觉词汇相互之间没有顺序。

 

 

视觉词典的生成流程:

 

 

由于图像中的词汇不像文本文档中的那样是现成的,我们需要首先从图像中提取出相互独立的视觉词汇,这通常需要经过三个步骤:(1)特征检测,(2)特征表示,(3)单词本的生成。  下图是从图像中提取出相互独立的视觉词汇:

利用sift方法,每一个图片提取出来的特征不是只有一个,是很多特征向量,也就是特征集

下面就是一个图片的特征,这些特征实际是向量,向量表示的就是图片上这些部分,可视化就是下图这些部分

 

 

 

通过观察会发现,同一类目标的不同实例之间虽然存在差异,但我们仍然可以找到它们之间的一些共同的地方,比如说人脸,虽然说不同人的脸差别比较大,但眼睛, 嘴,鼻子等一些比较细小的部位,却观察不到太大差别,我们可以把这些不同实例之间共同的部位提取出来,作为识别这一类目标的视觉词汇。

构建BOW码本步骤:

利用K-Means算法构造单词表。用K-means对第二步中提取的N个SIFT特征进行聚类,K-Means算法是一种基于样本间相似性度量的间接聚类方法,此算法以K为参数,把N个对象分为K个簇,以使簇内具有较高的相似度,而簇间相似度较低。聚类中心有k个(在BOW模型中聚类中心我们称它们为视觉词),码本的长度也就为k,计算每一幅图像的每一个SIFT特征到这k个视觉词的距离,并将其映射到距离最近的视觉词中(即将该视觉词的对应词频+1)(离那个最近,我们就认为他是这一类,离鼻子最近就认为他是鼻子的一种)。完成这一步后,每一幅图像就变成了一个与视觉词序列相对应的词频矢量。

假定我们将K设为4,那么单词表的构造过程如下图所示:

利用k-means聚类,生成的类其实就是相似的特征(各种各样的鼻子,但是都是鼻子)(对应的就是类似文本中apple,banana这种单词)

 

 

 

第三步:

利用单词表的中词汇表示图像。利用SIFT算法,可以从每幅图像中提取很多个特征点,这些特征点都可以用单词表中的单词近似代替,通过统计单词表中每个单词在图像中出现的次数,可以将图像表示成为一个K=4维数值向量。将这些特征映射到为码本矢量,码本矢量归一化,最后计算其与训练码本的距离,对应最近距离的训练图像认为与测试图像匹配。请看下图:

下图说明聚了4类,每个特征按照聚类可以归为这四类,这样每个图的sift特征,就可以归为这四类,这样就可以有一个词袋模型的向量出来了

 

 

 

我们从人脸、自行车和吉他三个目标类图像中提取出的不同视觉词汇,而构造的词汇表中,会把词义相近的视觉词汇合并为同一类,经过合并,词汇表中只包含了四个视觉单词,分别按索引值标记为1,2,3,4。通过观察可以看到,它们分别属于自行车、人脸、吉他、人脸类。统计这些词汇在不同目标类中出现的次数可以得到每幅图像的直方图表示:

人脸:  [3,30,3,20]
自行车:[20,3,3,2]
吉他:  [8,12,32,7]

其实这个过程非常简单,就是针对人脸、自行车和吉他这三个文档,抽取出相似的部分(或者词义相近的视觉词汇合并为同一类),构造一个词典,词典中包含4个视觉单词,即Dictionary = {1:”自行车”, 2. “人脸”, 3. “吉他”, 4. “人脸类”},最终人脸、自行车和吉他这三个文档皆可以用一个4维向量表示,最后根据三个文档相应部分出现的次数画成了上面对应的直方图。一般情况下,K的取值在几百到上千,在这里取K=4仅仅是为了方便说明。

总结一下步骤:

第一步:利用SIFT算法从不同类别的图像中提取视觉词汇向量,这些向量代表的是图像中局部不变的特征点;

第二步:将所有特征点向量集合到一块,利用K-Means算法合并词义相近的视觉词汇,构造一个包含K个词汇的单词表;

第三步:统计单词表中每个单词在图像中出现的次数,从而将图像表示成为一个K维数值向量。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Jupyter是一个开源的交互式笔记本,它支持种编程语言,包括Python。词袋模型是一种常用的文本表示方法,用于将文本转换为数值特征向量。下面是在Jupyter中实现词袋模型的一般步骤: 1. 导入所需的库:在Jupyter中,首先需要导入所需的库,包括`numpy`和`sklearn`。 2. 准备数据:将文本数据准备成一个列表,每个元素代表一篇文档或一段文本。 3. 文本预处理:对文本进行预处理,包括去除标点符号、转换为小写字母等。 4. 构建词汇表:将所有文本中出现的单词构建成一个词汇表,可以使用`CountVectorizer`类来实现。 5. 转换为词袋向量:使用`CountVectorizer`类的`fit_transform`方法将文本数据转换为词袋向量表示。 6. 分析结果:可以通过查看词汇表和词袋向量来分析结果。 下面是一个示例代码: ```python import numpy as np from sklearn.feature_extraction.text import CountVectorizer # 准备数据 texts = ["I love coding", "Coding is fun", "Python is awesome"] # 文本预处理 processed_texts = [text.lower() for text in texts] # 构建词汇表 vectorizer = CountVectorizer() vectorizer.fit(processed_texts) vocabulary = vectorizer.get_feature_names() # 转换为词袋向量 bag_of_words = vectorizer.transform(processed_texts).toarray() # 分析结果 print("词汇表:", vocabulary) print("词袋向量:", bag_of_words) ``` 这段代码演示了如何使用Jupyter实现词袋模型。你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值