Bagofwords模型Word文档下载推荐.docx
- 文档编号:454607
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:24
- 大小:254.19KB
Bagofwords模型Word文档下载推荐.docx
《Bagofwords模型Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Bagofwords模型Word文档下载推荐.docx(24页珍藏版)》请在冰点文库上搜索。
4.
“play”,
5.
“basketball”,
6.
“also”,
7.
“football”,
8.
“games”,
9.
“Jim”,
10.
“too”}。
这个词典一共包含10个不同的单词,利用词典的索引号,上面两个文档每一个都可以用一个10维向量表示(用整数数字0~n(n为正整数)表示某个单词在文档中出现的次数):
[1,
2,
1,
0,
1]
1
0,
0]
向量中每个元素表示词典中相关元素在文档中出现的次数(下文中,将用单词的直方图表示)。
不过,在构造文档向量的过程中可以看到,我们并没有表达单词在原来句子中出现的次序(这是本Bag-of-words模型的缺点之一,不过瑕不掩瑜甚至在此处无关紧要)。
∙Bag-of-words模型的应用
Bag-of-words模型的适用场合
现在想象在一个巨大的文档集合D,里面一共有M个文档,而文档里面的所有单词提取出来后,一起构成一个包含N个单词的词典,利用Bag-of-words模型,每个文档都可以被表示成为一个N维向量,计算机非常擅长于处理数值向量。
这样,就可以利用计算机来完成海量文档的分类过程。
考虑将Bag-of-words模型应用于图像表示。
为了表示一幅图像,我们可以将图像看作文档,即若干个“视觉词汇”的集合,同样的,视觉词汇相互之间没有顺序。
图1
将Bag-of-words模型应用于图像表示
由于图像中的词汇不像文本文档中的那样是现成的,我们需要首先从图像中提取出相互独立的视觉词汇,这通常需要经过三个步骤:
(1)特征检测,
(2)特征表示,(3)单词本的生成,请看下图2:
图2
从图像中提取出相互独立的视觉词汇
通过观察会发现,同一类目标的不同实例之间虽然存在差异,但我们仍然可以找到它们之间的一些共同的地方,比如说人脸,虽然说不同人的脸差别比较大,但眼睛,嘴,鼻子等一些比较细小的部位,却观察不到太大差别,我们可以把这些不同实例之间共同的部位提取出来,作为识别这一类目标的视觉词汇。
而SIFT算法是提取图像中局部不变特征的应用最广泛的算法,因此我们可以用SIFT算法从图像中提取不变特征点,作为视觉词汇,并构造单词表,用单词表中的单词表示一幅图像。
Bag-of-words模型应用三步
接下来,我们通过上述图像展示如何通过Bag-of-words模型,将图像表示成数值向量。
现在有三个目标类,分别是人脸、自行车和吉他。
Bag-of-words模型的第一步是利用SIFT算法,从每类图像中提取视觉词汇,将所有的视觉词汇集合在一起,如下图3所示:
图3
从每类图像中提取视觉词汇
第二步是利用K-Means算法构造单词表。
K-Means算法是一种基于样本间相似性度量的间接聚类方法,此算法以K为参数,把N个对象分为K个簇,以使簇内具有较高的相似度,而簇间相似度较低。
SIFT提取的视觉词汇向量之间根据距离的远近,可以利用K-Means算法将词义相近的词汇合并,作为单词表中的基础词汇,假定我们将K设为4,那么单词表的构造过程如下图4所示:
图4
利用K-Means算法构造单词表
第三步是利用单词表的中词汇表示图像。
利用SIFT算法,可以从每幅图像中提取很多个特征点,这些特征点都可以用单词表中的单词近似代替,通过统计单词表中每个单词在图像中出现的次数,可以将图像表示成为一个K=4维数值向量。
请看下图5:
图5
每幅图像的直方图表示
上图5中,我们从人脸、自行车和吉他三个目标类图像中提取出的不同视觉词汇,而构造的词汇表中,会把词义相近的视觉词汇合并为同一类,经过合并,词汇表中只包含了四个视觉单词,分别按索引值标记为1,2,3,4。
通过观察可以看到,它们分别属于自行车、人脸、吉他、人脸类。
统计这些词汇在不同目标类中出现的次数可以得到每幅图像的直方图表示(我们假定存在误差,实际情况亦不外如此):
人脸:
[3,30,3,20]
自行车:
[20,3,3,2]
吉他:
[8,12,32,7]
其实这个过程非常简单,就是针对人脸、自行车和吉他这三个文档,抽取出相似的部分(或者词义相近的视觉词汇合并为同一类),构造一个词典,词典中包含4个视觉单词,即Dictionary
”自行车”,
“人脸”,
“吉他”,
“人脸类”},最终人脸、自行车和吉他这三个文档皆可以用一个4维向量表示,最后根据三个文档相应部分出现的次数画成了上面对应的直方图。
需要说明的是,以上过程只是针对三个目标类非常简单的一个示例,实际应用中,为了达到较好的效果,单词表中的词汇数量K往往非常庞大,并且目标类数目越多,对应的K值也越大,一般情况下,K的取值在几百到上千,在这里取K=4仅仅是为了方便说明。
下面,我们再来总结一下如何利用Bag-of-words模型将一幅图像表示成为数值向量:
∙第一步:
利用SIFT算法从不同类别的图像中提取视觉词汇向量,这些向量代表的是图像中局部不变的特征点;
∙第二步:
将所有特征点向量集合到一块,利用K-Means算法合并词义相近的视觉词汇,构造一个包含K个词汇的单词表;
∙第三步:
统计单词表中每个单词在图像中出现的次数,从而将图像表示成为一个K维数值向量。
下面我们按照以上步骤,用C++一步步实现上述过程。
∙C++逐步实现:
Bag-of-words模型表示一幅图像
在具体编码之前,我们需要事先搭配开发环境。
一.
搭建开发环境
使用的开发平台是windows
xp
sp3
+
vs2010(windows
vc6.0的情况,请参考此文:
九(续)、sift算法的编译与实现)
1.
从Rob
Hess的个人主页:
http:
//blogs.oregonstate.edu/hess/code/sift/,下载最新版本的sift开源库源代码sift-latest_win.zip;
由于sift-latest_win.zip
要求的opencv版本是2.0以上,也下载最新版本
OpenCV-2.2.0-win32-vs2010.exe,运行安装程序将opencv安装在本地某路径下。
例如,我安装在D盘根目录下。
运行vs2010,建立一个空的控制台应用程序,取名bow。
配置opencv环境。
在vs2010下选择project菜单下的bow
property子菜单,调出bow
property
pages对话框,需要配置的地方有三处:
在vc++
Directory选项里需要配置Include
Directories和Library
Directories,在Linker选项卡的Input选项里需要配置Additional
Dependencies。
至此,开发环境全部搭建并配置完毕。
二.创建c++类CSIFTDiscriptor
为了方便使用,我们将SIFT库用C++类CSIFTDiscriptor封装,该类可以计算并获取指定图像的特征点向量集合。
类的声名在SIFTDiscriptor.h文件中,内容如下:
viewplaincopytoclipboardprint?
1.#ifndef
_SIFT_DISCRIPTOR_H_
2.#define
3.#include
<
string>
4.#include
highgui.h>
5.#include
cv.h>
6.
7.extern
"
C"
8.{
9.#include
../sift/sift.h"
10.#include
../sift/imgfeatures.h"
11.#include
../sift/utils.h"
12.};
13.
14.class
CSIFTDiscriptor
15.{
16.public:
17.
int
GetInterestPointNumber()
18.
{
19.
return
m_nInterestPointNumber;
20.
}
21.
struct
feature
*GetFeatureArray()
22.
23.
m_pFeatureArray;
24.
25.
public
:
26.
void
SetImgName(const
std:
string
&
strImgName)
27.
28.
m_strInputImgName
strImgName;
29.
30.
CalculateSIFT();
31.
public:
32.
CSIFTDiscriptor(const
strImgName);
33.
CSIFTDiscriptor()
34.
35.
m_nInterestPointNumber
0;
36.
m_pFeatureArray
NULL;
37.
38.
~CSIFTDiscriptor();
39.
private:
40.
m_strInputImgName;
41.
42.
*m_pFeatureArray;
43.};
44.#endif
成员函数实现在SIFTDiscriptor.cpp文件中,其中,CalculateSIFT函数完成特征点的提取和计算,其主要内部流程如下:
1)
调用OpenCV函数cvLoadImage加载输入图像;
2)
为了统一输入图像的尺寸,CalculateSIFT函数的第二步是调整输入图像的尺寸,这通过调用cvResize函数实现;
3)
如果输入图像是彩色图像,我们需要首先将其转化成灰度图,这通过调用cvCvtColor函数实现;
4)
调用SIFT库函数sift_feature获取输入图像的特征点向量集合和特征点个数。
1.#include
SIFTDiscriptor.h"
2.int
CSIFTDiscriptor:
CalculateSIFT()
3.{
4.
IplImage
*pInputImg
cvLoadImage(m_strInputImgName.c_str());
5.
if
(!
pInputImg)
7.
-1;
8.
9.
nImgWidth
320;
//训练用标准图像大小
10.
double
dbScaleFactor
pInputImg->
width
/
300.0;
//缩放因子
11.
*pTmpImg
cvCreateImage(cvSize(pInputImg->
dbScaleFactor,
height
dbScaleFactor),
12.
depth,
nChannels);
cvResize(pInputImg,
pTmpImg);
//缩放
14.
cvReleaseImage(&
pInputImg);
15.
16.
(pTmpImg->
nChannels
!
//非灰度图
*pGrayImg
cvCreateImage(cvSize(pTmpImg->
width,
pTmpImg->
height),
1);
cvCvtColor(pTmpImg,
pGrayImg,
CV_RGB2GRAY);
sift_features(pGrayImg,
m_pFeatureArray);
pGrayImg);
else
sift_features(pTmpImg,
30.}
31.CSIFTDiscriptor:
32.{
37.}
38.CSIFTDiscriptor:
~CSIFTDiscriptor()
39.{
(m_pFeatureArray)
free(m_pFeatureArray);
43.
44.}
三.创建c++类CImgSet,管理实验图像集合
Bag-of-words模型需要从多个目标类图像中提取视觉词汇,不同目标类的图像存储在不同子文件夹中,为了方便操作,我们设计了一个专门的类CImgSet用来管理图像集合,声明在文件ImgSet.h中:
_IMG_SET_H_
vector>
5.#pragma
comment(lib,
shlwapi.lib"
)
6.class
CImgSet
7.{
8.public:
(const
strImgDirName)
m_strImgDirName(strImgDirName+"
//"
),
m_nImgNumber(0){}
GetTotalImageNumber()
m_nImgNumber;
GetImgName(int
nIndex)
m_szImgs.at(nIndex);
LoadImgsFromDir()
LoadImgsFromDir("
);
22.private:
LoadImgsFromDir(const
strDirName);
24.private:
typedef
vector
IMG_SET;
IMG_SET
m_szImgs;
const
m_strImgDirName;
29.};
30.#endif
32.//成员函数实现在文件ImgSet.cpp中:
33.#include
ImgSet.h"
34.#include
windows.h>
35.#include
Shlwapi.h>
37.int
CImgSet:
strSubDirName)
38.{
WIN32_FIND_DATAA
stFD
{0};
strDirName;
("
==
strDirName
44.
45.
46.
47.
strSubDirName;
48.
49.
strFindName
/intCImgSet:
LoadImgsFromDir(conststd:
string&
strSubDirName){WIN32_FIND_DATAAstFD={0};
std:
stringstrDirName;
if("
==strSubDirName){strDirName=m_strImgDirName;
}else{strDirName=strSubDirName;
}std:
stringstrFindName=strDirName+"
//*"
;
HANDLEhFile=FindFirstFileA(strFindName.c_str(),&
stFD);
BOOLbExist=FindNextFileA(hFile,&
for(;
bExist;
){std:
stringstrTmpName=strDirName+stFD.cFileName;
if(strDirName+"
."
==strTmpName||strDirName+"
.."
==strTmpName){bExist=FindNextFileA(hFile,&
continue;
}if(PathIsDirectoryA(strTmpName.c_str())){strTmpName+="
LoadImgsFromDir(strTmpName);
bExist=FindNextFileA(hFile,&
stringstrSubImg=strDirName+stFD.cFileName;
m_szImgs.push_back(strSubImg);
}m_nImgNumber=m_szImgs.size();
returnm_nImgNumber;
}
LoadImgsFromDir递归地从图像文件夹中获取所有实验用图像名,包括子文件夹。
该函数内部通过循环调用windows
API函数FindFirstFile和FindNextFile来找到文件夹中所有图像的名称。
四.创建CHistogram,生成图像的直方图表
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Bagofwords 模型
![提示](https://static.bingdoc.com/images/bang_tan.gif)