BOW 算法,被CNN 打爆之前的王者

源地址 https://zhuanlan.zhihu.com/p/25999669

简而言之就是2012 年Alex 使用CNN 突然将图片识别的正确率降低了一倍!之后CNN 就席卷了Computer Vision 界,对此的研究如同雨后春笋般冒了出来(computer vision 水论文很容易 改个参数就行)。

网上讲解CNN的教程有很多例如 Deep MNIST for Experts , 创业公司也喜欢加入深度学习 人工智能 之类的字眼增加估值。

那么问题来了... 在CNN 之前 , 我们用什么方法来识别图像?

这里介绍一个过气网红 ----- Bag of visual words 算法。 这个算法在10年前, 大约2005-2006 年是非常火的。

故事要从过滤辣鸡邮件(Spam)开始,收悉这一算法的人都知道 在识别辣鸡邮件的时候会有一个字典, 上面有很多单词(vocabulary / words ), 这些单词是根据前人对辣鸡邮件的总结得出来的。然后系统会对一篇新邮件扫描,数出这篇邮件中这些单词出现的次数, 然后根据出现的频率进行预测。


举个例子, 下图是 Trump 大妹子和希拉里小胸弟的Vocabulary,遮住前面的名字,你们都能准确得说出左右两边分别是谁。 为什么能这样做? 因为在我们的脑中就有了川希两人的图像, 一个食指朝天说着 make America great again, 另一个面带微笑喊 love trumps hate。 看着字典数图像中vocabulary 出现的个数, 就能清楚地分辨谁是谁。


将这个思路扩展到图像上。 我们需要用一个方法获取图像中的特征点。这些特征点就好比川主席推特里的所有推文。 之后我们需要处理这些特征点,把最具有代表性的单词(visual words / vocabulary )罗列出来,构造一个字典(codebook) 。 之后,我们可以把单张图像上的所有特征点和这些vocabulary做对比, 如果这个特征点和某个vocabulary 相似, 就把这个vocabulary的计数+1 ,遍历所有特征点就能得到这个图像的所有频率分布,遍历特征点获得频率分布,我们叫做quantization. 先这样处理training set, 得到已知类别(class)的频率分布,然后扔到任何一个multicalss classifier 里。再处理test set, 得到频率分布以后,把频率分布扔到上一个模型里做预测。

主要思路和垃圾邮件识别是一模一样的, 只不过一个是图像,一个是文字。 老外也缺乏创造精神,后者叫bag of words, 前者叫 bag of visual words。

有些人要问了, 我要怎么从图像里得到特征点? 这里推荐一个算法叫做 SIFT 它在图像中寻找极值点, 并附带了其他特征。在我心中这个算法如同魔术一般是工程学的集大成者, 但不幸在很多方面被CNN打爆了。

有些人又问了, 我要怎么选取最具有代表性的单词(vocabulary) ? 用unsupervised learning, 这里推荐Kmeans 聚类,或者Random Forest。假设原来有10个class, 每个class 15个图像,每张图像都做SIFT,一共得到40k 个特征点, 然后apply k means ,选取一个合适的k , 例如 k = 128。 那么这个k means 的cluster centroid 就是我们要的vocabulary, 这128 个 vocabularies 统称一个codebook。每张图的特征都拿去比照看看哪个vocabulary 更相近,得到概率分布,长度为1*128 。假设我们有150个图像, 那么能得到一个 150*128 的matrix,和这150个图像的label长度为 150*1 , 之后就扔到multiclass classifier 咯。

下图就是Bag of visual words 的流程图。



在实际的过程中,我们要尽量避免过拟合, 尽量避免噪声。 这里有很多小聪明可以耍,我的做法是把每张图的SIFT特征随机选 25% , 扔掉剩下的75% 。 这样做既可以让训练更块, 又可以避免过拟合。

电脑算力有限,我在 caltech 101 里选了10 个class ,每个class 15 张图做训练,15 张图做测试。 调了一下参数 能做到75% 的正确率。

代码放在bag of words -public 里。

在构建codebook的时候还能用 Random forest , 我也试了一下, 除了速度快一点,准确度上并没有明显的提升。 具体细节可以参考 Fast Discriminative Visual Codebooks using Randomized Clustering Forests


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本demo实现的是基于bow原理对图片进行分类,并实现对选取得测试集进行查找 BoW(Bag of Words)词袋模型最初被用在文本分类中,将文档表示成特征矢量。它的基本思想是假定对于一个文本,忽略其词序和语法、句法,仅仅将其看做是一些词汇的集合,而文本中的每个词汇都是独立的。简单说就是讲每篇文档都看成一个袋子(因为里面装的都是词汇,所以称为词袋,Bag of words即因此而来),然后看这个袋子里装的都是些什么词汇,将其分类。如果文档中猪、马、牛、羊、山谷、土地、拖拉机这样的词汇多些,而银行、大厦、汽车、公园这样的词汇少些,我们就倾向于判断它是一篇描绘乡村的文档,而不是描述城镇的。 serachFeatures.py中,前面主要是一些通过parse使得可以在敲命令行的时候可以向里面传递参数,后面就是提取SIFT特征,然后聚类,计算TF和IDF,得到单词直方图后再做一下L2归一化。一般在一幅图像中提取的到SIFT特征点是非常多的,而如果图像库很大的话,SIFT特征点会非常非常的多,直接聚类是非常困难的(内存不够,计算速度非常慢),所以,为了解决这个问题,可以以牺牲检索精度为代价,在聚类的时候先对SIFT做降采样处理。最后对一些在在线查询时会用到的变量保存下来。对于某个图像库,我们可以在命令行里通过下面命令生成BoF。 query.py只能每次查找一张图片,并返回与之匹配度(递减)最接近的6张图片
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值