论文笔记 《Object Detection with Discriminatively Trained Part Based Models》

论文和对应的代码在这里:http://www.cs.berkeley.edu/~rbg/latent/
笔者做的一个简单的slide
开始笔记之前先碎碎念两句:

  • rbg真牛。。先是DPM,然后是RCNN,保持了detection上的领先
  • 一年前笔者刚读研时,这是读到的第一篇文章,当年翻来覆去看了几周都不得要领,严重打击了我的自信心,现在倒是读的蛮顺畅了,自夸下自己这一年的进步先~

好了,正文开始,下面的结构是根据原文结构进行描述的。

INTRODUCTION

  • 介绍了detection的难点,以及本模型主要应对的是intraclass variability大的问题——通过part的组合来适应这个变化。
  • 介绍了使用的特征是HOG,是06年冠军使用的特征。后来HOG得到广泛的使用说明这确实是一个很好的人工设计的特征了。
  • 介绍了Latent-SVM,一个半凸的优化问题
  • 介绍了data-mining for hard negative,因为背景太大,不可能全部用上,所以需要“挖掘”到比较难的背景来训练分类器。

RELATE WORK

MODELS

总的来说,模型是若干个线性滤波器组成的

(本质上跟卷积核一样,F理解成权重,G理解成特征)
为了能够应对多尺度的问题,使用了特征金字塔,另外,part所在的层的分辨率是root所在的层的分辨率的两倍。

Deformable Part Models

单个的DPM可以理解成是一个root滤波器加入若干个part滤波器,然后减去part的形变损失。

上面的公式中,第一项代表了所有的滤波器(root是0,part从1到n共有n个,本质上上它们都是线性滤波器),第二项是形变损失(即模型的每个part节点都有一个标准位置,比如手在上半身而不是在下半身),第三项是bias,用于在多个模型之间实现可比性。
附带一提形变损失的计算公式是:

上面公式(3)中的“2”是由于root节点的分辨率只有part节点的一半,所以需要映射到2倍大小。
公式(4)表明形变损失考虑到了1范距离(曼哈顿距离)和2范距离(欧氏距离)。

Matching

当训练好一个模型时候,inference就是一个matching的问题了,即需要针对窗口给出分数:

上式中的p0~pn表示的是filter的位置。
穷举复杂度过高,所以需要用到动态规划,这里不展开了,作者给了一张大图:

(还是挺直观的,对于root和part的每个滤波器,都卷积出来一个map,然后叠加这些feature的结果)

Mixture Models

说明了如何从单个model拓展到多个model。
原因是因为单个model的描述能力不够——车有正视图、侧视图等。那么就可以根据不同视角建立不同的model来表示。

LATENT SVM

由于本文的model都是线性filter,所以其实可以将整个model的所有的参数拉成一个长向量,这样就可以用常规的线性优化方法来求解了。

又由于训练数据(VOC PASCAL)只有root的标注而没有part的标注,所以相对位置是未知的,需要作为latent项进行学习,所以就要用到Latent SVM(以下也遵循原文简称为LSVM)了。

Semi-convexity

作者提出了一个叫“半凸”的说法,因为LSVM的损失函数:

  • 对于负样本是凸的
  • 对于正样本是非凸的,但是如果固定住latent项,那么就变成凸的了

于是作者把这个情况叫做“半凸”

Optimization

既然LSVM是半凸的,那么可以想到转换成凸函数来进行求解,作者提出了一种叫坐标下降(coordinate descent)的算法,分成两步走:

  1. 先对于正样本优化latent项,然后固定住,那么损失函数就变凸了
  2. 然后用SVM的常规优化方法来进行优化即可

迭代重复上面两个步骤,就可以实现LSVM的优化了。
注意到,这里只是针对正样本的latent项单独优化并且fix住,而负样本的优化是没有fix住latent项的,作者给出的解释是:

Stochastic gradient descent

这个章节讨论的是上面坐标下降中第二步的优化,即求解SVM部分。
注意到这里面正样本的latent已经被固定住了,所以损失函数已经变成了凸函数,可以用常规方法求解。
一般求解SVM可以用二次规划的方法,作者这里用的是随机梯度下降(SGD)。至于为什么,倒没有说明。
梯度的计算公式见下图:

这里对于(17)可以给出较为直观的解释:

  • 当$y_if_\beta(x_i)\geq1$时候,其实也就是样本被正确分类了,所以对应部分的梯度为β+0
  • 否则,样本类别错了,或者类别对了但是落在了分隔面之内,那么就需要更新(β+对应的梯度)了。

更为具体的过程是:

具体解释一下:
1) 设置学习率,一般设置成1/t就可以了。
2) 选择随机的一个样本
3) 求解最佳隐变量
4)和5) 都是更新梯度了。
另外需要注意到,作者没有使用mini-batch的下降法,而是用是单个样本的梯度(直接乘上一个n)来估计全体样本

Data-mining hard examples, SVM version

上文也提到了,由于负样本太大,无法全部用上,所以需要挖掘出hard negative来帮助分类。
虽然说得data-mining,但实际上思路很简单。
首先,定义easy negative和hard negative为:

其实,就是能够正确分类的就是easy negative,不能正确分类或者分类正确但是在决策面之内的叫做hard negative
具体的过程,如下图:

简单解释下。
1) 选择一个子集C,训练SVM得到参数β
3) 排除掉C中的easy negative
4) 填充hard negative到C
2) 是结束条件,如果没有可以添加的hard negative,就退出。

后面是算法有效性的证明,跳过了。

Data-mining hard examples, LSVM version

LSVM的Data-mining算法是类似的。
正样本的latent项被固定住后,本质上也是一个凸优化问题。
通常地,通过维护一个cache,迭代地排除easy negative,加入hard negative。

TRAINING MODELS

Learning parameters

这里说了几件事:

  • 如何生成正样本:根据gt bbox生成,控制latent项的overlap在50%之内
  • 如何生成负样本:没看懂,感觉是在小范围内密集地采样
  • 训练过程的伪代码:基本是将上述过程(搜索并固定正样本的latent项,data-mining)简述了一遍

Initialization

这里提到了对于有latent项的模型需要较好地初始化,不然会陷入局部最优(略没懂,不是说latent SVM是半凸函数吗?)
大致分成3个步骤:

  • Initialzation Root Filters:
    • 根据aspect ratio分组,来训练mix model
    • 使用一个线性SVM进行权值的训练
  • Merging Components
    • 没看懂,大致是聚类,将相同的component聚在一起
  • Initailzing Part Filters
    • 使用启发的贪心算法来寻找能量最大的位置(该位置的中心限制在中轴线或者以中轴线对称)

FEATURES

略,介绍了HOG,和做了PCA

POST PROCESSING

略,包括了,bbox回归,NMS,Context

EMPIRICAL RESULTS

略,当时VOC的state-of-the-art

DISCUSSION

很久没有更新网站,发现多了不少评论和问题,无法一一回复,如果现在仍有问题请再次留言 :) 2016.03.29