《A Bayesian Hierarchical Model for Learning Natural SceneCategories》,中文翻译为《一个用于自然场景分类的贝叶斯层次模型》。该文章由著名的华人人工智能专家李飞飞主笔。接下来,我将从论文讲解、代码实现两个方面阐述这篇论文的思想。
这篇博客先进行论文讲解。代码实现可以跳转到以下链接:
代码实现
Abstract:
摘要部分说明了该论文的创新点。“ 我们通过收集局部区域来表示场景图像,并通过无监督学习把这些局部区域表示成codewords(码字),这样的局部区域称之为'theme'(主题) ”。早期的工作中,这样的theme学习需要专家的手工标记,但是作者提出的方法是不需要监督就可以学习到这样的theme分布以及在主题之上所做的codewords分布。在论文中,作者对13个场景类别进行了分类。
1 Introduction:
引言部分首先讲了人类天生对复杂场景就具有很高、很快速的分辨能力,这给机器学习提供了挑战。机器必须要先识别物体,才能对场景进行识别。那么就提出一个问题:我们能否首先不通过识别物体,就能够识别场景呢?一个关键的想法是在分类场景之前找到一种intermediate representations(中间表示)——properties(属性)。不过这需要人去手动标记场景中的局部和全局属性。但是我们知道随着数据量的增多,人工标记会太麻烦而且劳动力昂贵,显然人类去手动标记这些属性不合适。另外一种intermediate representations的方法是使用有用的textons(纹理基元)的分布创建一个大的dictionary来表示复杂场景。但是这种方法需要手动分段训练样例,而且很难为一个场景类中的textons分布赋值。
鉴于以上两种intermediate representations方法,我们要做的就是尽可能避免使用人手标记或者对图像进行分段来训练这个分类系统。于是,参考论文[1],我们可以把图像分类想象成文本分类。“ 图像的局部区域首先被聚簇为不同的intermediate theme,然后再进行分类。局部区域和intermediate theme的概率分布都是自动完成的,不需要人的手工标记 ”。
总之,这篇文章的贡献在于 :
(1)无监督学习获得intermediate theme;
(2)提出了一个概率性框架,利用codewords来学习模型;
(3)论文中的方法有好的分类效果。
2 Our Approach:
图二展示了这篇论文的思想。训练过程,首先把每个类的每一张图片都看成很多小的patch(区块),对每个patch进行局部特征提取(如SIFT/HOG),得到一个个codeword,这些codewords相当于文本分类中的单词。所有类中的所有图像的codewords收集起来,利用聚类算法(如K-means)将其聚成K个类,形成一个codebook。然后,我们可以看到一副图像可以表示成很多codewords的组成。接下来,利用贝叶斯层次模型的方法,训练得到每个类的模型。测试过程,我们还是对图像就行局部特征提取,得到表示这幅图像的codewords。然后用我们训练好的模型去判断这个图像离哪个类最接近,就可以确定这幅图像的类别。
可能在这里说的有些抽象,具体到代码实现会更加详细。
2.1 Model Structure:
怎样使用贝叶斯层次模型来得到图二左侧的一个个Model呢?我们先看3个图:
图3(a)就是接下来的重点,(b)是(a)的一个变体,(c)是传统模型。刚开始看到这3个图头有点大,毕竟那么多符号。但是,结合公式和例子,其实我们发现理解它们并不难。
在理解图3(a)之前,我们先来看看类、图像、theme、codewords、codeword是怎样一个关系。以山峰类为例,山峰类中的图像都是和山有关。而对于一副山峰图像,我们要从所有的themes(可能来自于其他类的theme)中找到属于这张图像的theme(s),比如岩石。这时,一些codewords就会经常出现在岩石theme中。而codewords又是通过K-means算法得到的聚类中心,它们组成了一个codebook。每一个聚类中心又是很多codeword组成的。这里,不能将聚类中心和theme搞混。例如,论文中的聚类中心是174,theme是40。
2.1.1 The Theme Models:
我们现在来看看图3(a)。图3(a)是使用贝叶斯层次模型生成一个分类模型的过程,对应图2左侧训练过程中的learning阶段。我举一个例子:比如我们现在有6个类(C),40个theme(K),C和K组成图3(a)(θ),codebook大小为174(T)。
① c ~ p(c|η) ,即 η->c过程。这个过程是判断一副图像属于6个类中的哪一个,其中η是一个6维的多项分布的一个向量。
② π ~ p(π|c,θ),即c,θ -> π过程。这个过程是计算这副图像对应theme的一个概率分布情况,即patch分布直方图。其中,θ是一个6*40的矩阵,每一行代表一个类别的theme分布,即π向量(K维)。这里需要指出的是,这6个类共用这40个theme。
③ Zn ~ Mult(π),即 π-> z过程。这个过程是从theme分布中选择一个theme。其中Zn是K维单位向量,对应K维空间中的一个模为1的点的坐标。
④ Xn ~ p(Xn|Zn,β),即 z, β -> x过程。这个过程是从这个theme(Zn)中选择一个patch。其中β是一个40*174的矩阵,βkt代表从选中的第k个theme中得到第t个patch的概率。
实际上,在训练过程中,我们知道的是η、θ和β。η可以由训练集中各类图像的数目计算得到,θ矩阵中的K个theme可以由K-维的狄利克雷参数得到,β矩阵中codebook可以通过局部特征提取、然后利用K-means算法得到。因此我们可以利用贝叶斯推导出层次模型,即公式(2):
我们可以看到,实际上我们训练的这个model是一个联合概率产生式,可以由①~④中的公式计算得到。
我们对图3(a)进行了细致描述,图3(b)也就很好明白了。还记得在②中我们指出的“这6个类共用这300个theme”,图3(b)的做法是对每个类的theme进行建模,而不是所有类共用那40个theme。所以在图3(b)中,β是6个不同的40*174矩阵,且patch的计算依赖于C,即图中一条 c-> x 的边。
图3(c)就更简单了,它没有theme的参与,这也是论文[5,16]提到的一个方法。
2.1.2 Bayesian Decision:
根据图3(a)训练好的model,现在我们要识别一幅图像的类别,就要根据model计算每个类c的概率分布,然后选择最大的那个概率,就把这张图片分为这个类。公式如下:
式(7)根据贝叶斯定理,将求c的后验概率转化为先验概率的一个计算,由于p(c|η)可以看成是均匀分布,所以只需要计算式(8)即可。式(8)根据式(2)中隐藏的变量π和z得到。遗憾的是,这个公式中的β和π之间存在耦合关系(K),导致这个式子不好处理。于是,在2.1.3节中作者介绍了一种基于VMP的变分方法[18],来近似计算上面的式(8)。
对变分推理感兴趣的同学可以自行研究2.1.3节的内容。不会也没关系,它并不影响我们对论文核心思想的理解。
2.1.4节对图3(a)和图3(c)进行了简单的比较。
2.2 Features & Codebook:
特征分为全局特征和局部特征,局部特征被证明有很好的鲁棒性等优点而被采纳。作者在2.2.1节中先介绍了4种局部区域检测的方法,即把图像划分成一个个patch的过程。然后,采用了11*11像素正则化灰度值、128维的SIFT这两种特征提取方法来描述这些patch。把训练样本中所有类的所有图像的patch收集起来,使用K-means算法聚成K个类,最终形成codebook。例如,图4表示的是174个codewords,即174个聚类中心。
第3部分介绍了数据集和实验是如何建立的,比较简单,不在此论述。
4 Results:
第4部分值得一提的是图7左边的这个图:Confusion Table(混淆矩阵)
混淆矩阵的每一列代表了预测类别,每一列的总数表示预测为该类别的数据的数目;每一行代表了数据的真实归属类别,每一行的数据总数表示该类别的数据实例的数目。每一列中的数值表示真实数据被预测为该类的数目。
混淆矩阵也是我们在代码实现过程的输出结果,所以将它的概念在这里提一下。
至此,论文讲解部分到此结束。
代码实现部分请转到以下链接:
代码实现