基于词袋(Bag of Words)和SVM的图片分类
摘要
虽然现在已经是深度学习的时代了,传统的机器学习方法日渐甚微,不过有些算法还是有着旺盛的生命力,比如SIFT、SVM,在一些深度学习算法中也能看到它们的影子。这些人工设计的经典特征和分类器可以让我们感受到那个时代计算机视觉的魅力。互联网上,需要处理识别的图像越来越多,为此图像分类搜索引擎所需的分类能力要求越来越高,在图像处理领域内也成为越来越热点的课题。对目标进行分类是人类的天生能力,对于计算机,现实世界的呈现方式大多是以图片的方式(视频本质上也是图片)输入,因而图片的分类是实现人工智能的重要部分。词袋模型是基于自然语言模型而提出的一种文档描述方法,被广泛研究用于图像的分析和处理中。本文介绍了一种基于词袋的图片分类方法,首先提取图片的SIFT特征通过聚类得到“视觉词典”,然后统计词频获得突破的词袋描述,最后通过SVM进行有监督的图片分类。
源码及完整报告:
算法使用C++ MFC实现,基于OpenCV。
https://mbd.pub/o/bread/ZJuTlZ5u 或
https://www.syjshare.com/res/1TUR49UG
词袋(Bag of Words, BoW)
在图片的分类中首先需要解决的是对图像的描述,最初对图像的描述是直接利用图片的颜色信息,但是图像的色彩往往随着光强,物体方向等变化而变化,因此鲁棒性很差。现在的方式是在图片中提取能够表征图片全局或局部的特征作为对图像的描述,从而使得得到的图像描述具有光照不变性、旋转不变性、尺度不变性等特性。然而这种直接基于图像底层基础上的特征不含有语义信息,无法完成对图像生成语义的理解。而基于词袋的图像描述则在一定程度上解决了这一问题。
词袋模型最先是由Josef等基于自然语言处理模型而提出的。在这种模型中,文本(段落或者文档)被看作是无序的词汇集合,忽略语法甚至是单词的顺序。词袋模型的原理非常简单,词袋模型是文本的简化描述模型。在此模型中, 文本\(x_{1} ,x_{2},x_{3}\) 被表达成无序的单词组合,不去考虑语法与词序。以文本为例,如果一个文本\(X\)表示一连串有顺序的词的排列,那么机器对于\(X\)的识别其实就是计算出它在所有文本词语中出现的可能,也就是概率为多个词语概率的相乘如\(p(X)=p(x_{1})*p(x_{2}|x_{1})*p(x_{3}|x_{2})...p(x_{n}|x_{n-1})\),而词袋模型就是这种文本模型的特例,即\(x_{k}\) 出现的概率与前面的文本无关,故有\(p(X)=p(x_{1})*p(x_{2})*...p(x_{n})\) 成立。
类比一篇文章由很多文字 (textual words) 组合而成,如果將一張图片表示成由许多 视觉单词(visual words) 组合而成,就能将过去在文本检索(text retrieval)领域的技巧直接利用在图像检索(image retrieval)中,以文字检索系统现在的效率,图像表示的“文字化”也有助于大规模(large-scale)图像检索系统的效率。
词袋模型中关键的一步是要生成词典,对图片来说即是要生成“视觉词典”,而这首先需要提取图片的特征形成图片特征描述子集合,然后通过聚类的方式形成视觉单词,从而形成视觉词典。再统计待分类图片的词频,通过分类器即可实现对图片的分类或高级语义的理解。
基于词袋模型的图片分类基本流程
如引言所述,基于词袋的模型首先需要要在大量的已知类别的训练图片集中提取图片特征形成多个预选词,然后通过聚类形成视觉词典,然后通过词典统计图片的词频从而形成图片的基于视觉词典的特征描述。将得到图片词袋描述及其类别作为输入训练分类器。分类时,首先提取待分类图片的特征,然后形成图片的词袋描述,将描述输入到训练得到的分类器,即可得到待分类图片的类别
特征提取是形成词袋的关键一步,也是一个研究的热点。目前比较著名的特征提取方法主要有HoG,SIFT,LBP等方法。SIFT(Scale-Invariant Feature Transform),即尺度不变特征最早于1999年由David Lowe 提出,并在2004年进一步改进。SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性。SIFT特征提取通过尺度空间极值检测、关键点定位、主方向确定、关键点描述四步最终形成128维的具有多种不变特性的特征点,能够很好的表征图片的局部特征。这些不变性使得SIFT成为目前最火的特征提取算法之一。
尽管有计算复杂度高的不足,SIFT算法仍然是性能最好、应用最广泛的基于局部特征的图像特征提取方法。因而本文在特征提取部分选取SIFT算法作简要介绍。
SIFT特征提取通过尺度空间极值检测、关键点定位、主方向确定、关键点描述四步最终形成128维的具有多种不变特性的特征点。
多尺度空间极值点检测
SIFT要查找的点是一些十分突出的点,这些点不会因光照条件改变,尺度变化等环境变化而消失,比如角点、边缘点、暗区域的亮点以及亮区域的暗点。要保证尺度不变性,首先要保证提取出的特征点不因目标的尺度变化而变化。这个可以通过建立尺度空间来完成。
尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标在视网膜上的形成过程。
高斯核是唯一可以产生多尺度空间的核,一个图像的尺度空间\(L(x,y,\delta )\) 定义为原始图像\(I(x,y)\) 与一个尺度可变的2维高斯函\(G(x,y,\delta)\) 的卷积运算。
\]
\]
其中\((x,y)\)是尺度空间坐标,\({\delta}\) 代表尺度,决定图像的平滑程度,值越大图像越粗糙(模糊),反之越精细。通过卷积运算,一幅图像可以生成图2所示的高斯金字塔空间,这个空间由几塔(octave)图像组成,一塔图像包括几层(interval)图像。同塔图像大小一致,尺度不同,塔间图片是降采样的关系。
通过上面的操作,得到了塔数为O,塔内层数为S+3的高斯金字塔。LoG(Laplacian of Gaussian) 算子能够很好的找到图像中的兴趣点,但是需要大量的计算。而DoG(Difference of Gaussian)算子与LoG算子由直接关系,且计算量很小,所有可以用来代替LoG来进行兴趣点的查找。DoG:
\]
通过DoG可以得到尺度空间的差分高斯金字塔
差分高斯金字塔
关键点查找
生成了DoG高斯金字塔,就可以在该尺度空间检测极值点。 一个点如果在DOG尺度空间本层以及上下两层的26个领域中是最大或最小值时,就认为该点是图像在该尺度下的一个特征点。如图3。
通过上面的步骤,就可以粗略的检测到图像中的关键点。
关键点精确定位
以上极值点的搜索是在离散空间中进行的,检测到的极值点并不是真正意义上的极值点。同时还要去除低对比度和边界响应这些不稳定的关键点。
通过关键点周围点的信息拟合三维二次函数可以精确确定关键点的位置, DoG函数在图像边缘有较强的边缘响应,而一旦特征落在图形的边缘上,这些点就是不稳定的点,因此还需要排除边缘响应。这一点可以通过Hessian矩阵完成。
关键点主方向计算
上一节中确定了每幅图中的特征点,为每个特征点计算一个方向,依照这个方向做进一步的计算, 利用关键点邻域像素的梯度方向分布特性为每个关键点指定方向参数,使算子具备旋转不变性。
首先在与关键点尺度相应的高斯图像\(L(x,y,\delta)\) 上计算关键点领域窗口内像素点的梯度幅度和方向:
\]
\]
上式中,\(m(x,y)\)和 \(\theta(x,y)\)分别为高斯金字塔\((x,y)\)处梯度的大小和方向。
然后用直方图统计领域像素的梯度方向和幅值,梯度直方图的范围是0~360度,其中,每10度一个柱,共36个柱。直方图的主峰值(最大峰值)代表了关键点处邻域梯度的主方向,即关键点的主方向。
关键点主方向计算
至此,图像的关键点已检测完毕,每个关键点有三个信息:位置、尺度、方向;同时也就使关键点具备平移、缩放、和旋转不变性。
生成描述子
描述的目的是在关键点计算后,用一组向量将这个关键点描述出来,这个描述子不但包括关键点,也包括关键点周围对其有贡献的像素点。用来作为目标匹配的依据,也可使关键点具有更多的不变特性,如光照变化、3D视点变化等。
描述子生成图示
首先,将坐标轴旋转到关键点的主方向。只有以主方向为零点方向来描述关键点才能使其具有旋转不变性。
其次,以关键点为中心取1616的窗口。然后计算每个44的小块上计算8个方向的梯度方向直方图,绘制每个梯度方向的累加值(高斯加权),即可形成一个种子点。每个种子点有8个方向向量信息。
这样就可以对每个特征点形成一个448=128维的描述子,每一维都可以表示4*4个格子中一个的scale/orientation. 将这个向量归一化之后,就进一步去除了光照的影响。
这个128维的描述向量就可以用于图像匹配等应用中了。
特征词典的生成
上一节得到的SIFT特征点即是预选的“视觉单词”,当提取了若干特征点后,其数量往往巨大,而且特征点是局部特征。但是在庞大的特征数据库中,仅仅几个单一的特征点无法完成图像描述的重大任务。此时,聚类就显得格外重要,它将大量相似的128维特征向量通过一定的规则进行整合,寻找出若干相似的特征点聚为一类作为词典中的一个词,以此来代表一类特征点,方便后期的图像描述,增加描述的可信度,提高描述的速度。
K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。其算法过程如下:
1)从N个文档随机选取K个文档作为质心
2)对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类
3)重新计算已经得到的各个类的质心
4)迭代2~3步直至新的质心与原质心相等或小于指定阈值,算法结束。
经过K-means聚类,图片中提取出的SIFT特征就形成了对应的视觉词典。
SVM分类器
通过聚类得到的词典,即可将图片的特征转化为对应的词频表(如统计直方图)。这样每幅图片就可以用一个词典向量来表示了,然后将这些向量作为分类器的输入进行训练即可得到分类器。本文中选择的是SVM(支持向量机)进行分类。
支持向量机(英语:Support Vector Machine,常简称为SVM)是一种监督式学习的方法,可广泛地应用于统计分类以及回归分析。
支持向量机将向量映射到一个更高维的空间里,在这个空间里建立有一个最大间隔超平面。在分开数据的超平面的两边建有两个互相平行的超平面。建立方向合适的分隔超平面使两个与之平行的超平面间的距离最大化。其假定为,平行超平面间的距离或差距越大,分类器的总误差越小。支持向量机通过学习已知样本来获得决策边界,来完成对未知样本的分类。这种学习是有监督的学习。
本文中训练时,是将多类问题看作二类问题,即训练某类时以此类为正样本,其它类为负样本。测试时,计算测试样本分作某一类的概率,取最大概率的分类为测试样本的类别。
利用决策边界进行有监督分类
实验结果
测试图片使用corel图片库,选择了其中5个类别各20张图作为训练集训练分类器,并选择同类别各20张作为测试集测试分类的准确性。并且与K阶最近邻分类器作对比(取K为9)。测试平台为T6600CPU,系统为WINDOWS8.1。
训练图片集
表2 测试图片集
测试时通过加大Kmeans聚类的类数可以达到不同的效果,基本上Kmeans类数越大,SVM分类的效果越好。这也很容易理解,K-means聚类个数即代表了生成的词典中词的个数,词数越多,对图像的描述更精确。但随着词数的增加,字典的生成时间会增加。
2者的关系如下表:
视觉词个数 | SVM分类 | KNN分类 | 字典生成耗时(s) | ||||
正确分类个数 | 正确率 | 分类耗时(s) | 正确分类个数 | 正确率 | 分类耗时(s) | ||
2 | 18 | 0.36 | 69 | 21 | 0.42 | 69 | 69 |
5 | 33 | 0.66 | 72 | 34 | 0.68 | 71 | 81 |
10 | 38 | 0.76 | 77 | 36 | 0.72 | 77 | 110 |
20 | 42 | 0.84 | 100 | 37 | 0.74 | 97 | 232 |
50 | 42 | 0.84 | 102 | 37 | 0.74 | 98 | 240 |
100 | 43 | 0.86 | 111 | 35 | 0.70 | 103 | 447 |
200 | 44 | 0.88 | 110 | 38 | 0.76 | 94 | 647 |
500 | 47 | 0.94 | 118 | 28 | 0.56 | 101 | 978 |
1000 | 47 | 0.94 | 135 | 27 | 0.54 | 108 | 1294 |
由表可以看出,对比KNN分类,SVM在单词个数不太小时,都会好于KNN,并且在单词数较大时,效果远好于KNN的分类,准确率达到了94%。
总结
本文介绍了一个典型的基于词袋和SVM分类器的图片分类方法。基于词袋的图片分析技术由于具有对图片进行语义理解的潜力,因此得到广泛研究。SVM分类器也是目前非常火热的分类方法之一。实验结果表明,二者结合用于图片的有监督分类可以得到很好的效果。但由于词袋没有考虑词的顺序,对于图片也就是没有考虑特征的空间分布信息,因而还有待改进,也有人提出了Spatial pyramid matching方法进行分尺度,分块的处理,得到了一定改善,但仍有待研究。
参考文献
[1] Lowe, David G. "Distinctive image features from scale-invariant keypoints." International journal of computer vision 60.2 (2004): 91-110.
[2] Wallach, Hanna M. "Topic modeling: beyond bag-of-words." Proceedings of the 23rd international conference on Machine learning. ACM, 2006.
[3] Dalal, Navneet, and Bill Triggs. "Histograms of oriented gradients for human detection." Computer Vision and Pattern Recognition, 2005. CVPR 2005. IEEE Computer Society Conference on. Vol. 1. IEEE, 2005.
[4] Chang, Chih-Chung, and Chih-Jen Lin. "LIBSVM: a library for support vector machines." ACM Transactions on Intelligent Systems and Technology (TIST) 2.3 (2011): 27.
[5] Tong, Simon, and Edward Chang. "Support vector machine active learning for image retrieval." Proceedings of the ninth ACM international conference on Multimedia. ACM, 2001.
源码及完整报告:
算法使用C++ MFC实现,基于OpenCV。
https://mbd.pub/o/bread/ZJuTlZ5u 或
https://www.syjshare.com/res/1TUR49UG
基于词袋(Bag of Words)和SVM的图片分类的更多相关文章
- 【CV知识学习】【转】beyond Bags of features for rec scenen categories。基于词袋模型改进的自然场景识别方法
原博文地址:http://www.cnblogs.com/nobadfish/articles/5244637.html 原论文名叫Byeond bags of features:Spatial Py ...
- 『Kaggle』Sklearn中几种分类器的调用&词袋建立
几种分类器的基本调用方法 本节的目的是基本的使用这些工具,达到熟悉sklearn的流程而已,既不会设计超参数的选择原理(后面会进行介绍),也不会介绍数学原理(应该不会涉及了,打公式超麻烦,而且近期也没 ...
- NLP从词袋到Word2Vec的文本表示
在NLP(自然语言处理)领域,文本表示是第一步,也是很重要的一步,通俗来说就是把人类的语言符号转化为机器能够进行计算的数字,因为普通的文本语言机器是看不懂的,必须通过转化来表征对应文本.早期是基于规则 ...
- 文本情感分析(一):基于词袋模型(VSM、LSA、n-gram)的文本表示
现在自然语言处理用深度学习做的比较多,我还没试过用传统的监督学习方法做分类器,比如SVM.Xgboost.随机森林,来训练模型.因此,用Kaggle上经典的电影评论情感分析题,来学习如何用传统机器学习 ...
- 使用Gensim库对文本进行词袋、TF-IDF和n-gram方法向量化处理
Gensim库简介 机器学习算法需要使用向量化后的数据进行预测,对于文本数据来说,因为算法执行的是关于矩形的数学运算,这意味着我们必须将字符串转换为向量.从数学的角度看,向量是具有大小和方向的几何对象 ...
- 词袋和 TF-IDF 模型
做文本分类等问题的时,需要从大量语料中提取特征,并将这些文本特征变换为数值特征.常用的有词袋模型和TF-IDF 模型 1.词袋模型 词袋模型是最原始的一类特征集,忽略掉了文本的语法和语序,用一组无序的 ...
- tensorflow在文本处理中的使用——词袋
代码来源于:tensorflow机器学习实战指南(曾益强 译,2017年9月)——第七章:自然语言处理 代码地址:https://github.com/nfmcclure/tensorflow-coo ...
- 基于pandas python sklearn 的美团某商家的评论分类(文本分类)
美团店铺评价语言处理以及分类(NLP) 第一篇 数据分析部分 第二篇 可视化部分, 本文是该系列第三篇,文本分类 主要用到的包有jieba,sklearn,pandas,本篇博文主要先用的是词袋模型( ...
- 3.基于Label studio的训练数据标注指南:文本分类任务
文本分类任务Label Studio使用指南 1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取).文本分类等 2.基于Label studio的训练数据标注指南:(智能文档) ...
- 一款基于jquery的下拉点击改变背景图片
今天给大家介绍一款基于jquery的下拉点击改变背景图片.单击右上角的图片,下拉显示可选择的背景图片,单击图片变为背景图.效果图下: 在线预览 源码下载 实现的代码. html代码: <a ...
随机推荐
- stable diffusion打造自己专属的LORA模型
通过Lora小模型可以控制很多特定场景的内容生成. 但是那些模型是别人训练好的,你肯定很好奇,我也想训练一个自己的专属模型(也叫炼丹-_-). 甚至可以训练一个专属家庭版的模型(family mode ...
- UnrealEngine - 网络同步入门
1 网络同步机制 UE 提供了强大的网络同步机制: RPC :可以在本地调用,对端执行 属性同步:标记一个属性为 UPROPERTY(Replicated) 就可以自动将其修改后的值同步到客户端 移动 ...
- mysql迁移:mysqldump导出数据库
问题描述:要将一个mysql中六个数据库导出来,使用mysqldump导出 mysqldump使用语法:mysqldump -uroot -p -S /data/mysql/db_itax_m/mys ...
- Caused by: java.net.BindException: Address already in use: JVM_Bind(ActiveMq已经启动)
1.本地启动项目开启两个启动类出错. Error creating bean with name 'brokerService' defined in class path resource [com ...
- Sql Server 数据库事务与锁,同一事务更新又查询锁?期望大家来解惑
我有一个People表,有三行数据: 如果我们没详细了解数据库事务执行加锁的过程中,会不会有这样一个疑问:如下的这段 SQL 开启了事务,并且在事务中进行了更新和查询操作. BEGIN TRAN up ...
- 第139篇:JS数组常用方法(map(),reduce(),foreach())
好家伙,本篇为MDN文档数组方法的学习笔记 Array.prototype.reduce() - JavaScript | MDN (mozilla.org) 数组方法这块的知识缺了,补一下 1. ...
- vscode使用git推送代码
下载vscode https://code.visualstudio.com/ 点击应用管理 搜素Chinese (Simplified) Language Pack for Visual Studi ...
- 2022-09-24:以下go语言代码输出什么?A:1;B:3;C:13;D:7。 package main import ( “fmt“ “io/ioutil“ “net/
2022-09-24:以下go语言代码输出什么?A:1:B:3:C:13:D:7. package main import ( "fmt" "io/ioutil" ...
- 2022-08-27:以下go语言代码输出什么?A:[0];B:panic;C:7;D:不清楚。 package main import ( “fmt“ ) func main() { a
2022-08-27:以下go语言代码输出什么?A:[0]:B:panic:C:7:D:不清楚. package main import ( "fmt" ) func main() ...
- 2020-12-15:mysql的回滚机制是怎么实现的?
福哥答案2020-12-15:[答案来自此链接:](https://www.cnblogs.com/ld-swust/p/5607983.html)在 MySQL 中,恢复机制是通过回滚日志(undo ...