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

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

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

BOW 算法,被CNN 打爆之前的王者_第1张图片 网上讲解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 出现的个数, 就能清楚地分辨谁是谁。

BOW 算法,被CNN 打爆之前的王者_第2张图片

将这个思路扩展到图像上。 我们需要用一个方法获取图像中的特征点。这些特征点就好比川主席推特里的所有推文。 之后我们需要处理这些特征点,把最具有代表性的单词(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 的流程图。

BOW 算法,被CNN 打爆之前的王者_第3张图片

在实际的过程中,我们要尽量避免过拟合, 尽量避免噪声。 这里有很多小聪明可以耍,我的做法是把每张图的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。


你可能感兴趣的:(深度学习)