Action Classification In Still Image (CNN篇)

赶完ICCV之后,导师还是觉得需要把之前ICME的工作扩展成期刊(当时拿了Best Student Paper的时候已经叫了。。过了快一年了,拖延症啊),于是开始重新涉猎静态图片下的行为识别,关注在Deep Learning方面的paper,迟点有空会写一下传统的方法。

大概搜了一下,不得不说,Georgia Gkioxari这个美女发了几篇了…

Learning and Transferring Mid-Level Image Representations using Convolutional Neural Networks

paper链接

CVPR 2014的paper,文章核心是Transfer Learning,把在大规模的数据集下得到的模型的部分参数迁移到新模型上,一般这方面的工作都是基于在imagenet上训练的模型(AlexNet, VGG),为啥这么做?一般都认为大部分模型前面几层学习的都是一些很普通的特征(如gabor,有人可视化过),后面几层是跟任务相关的,所以通常的做法就是:

  1. 先在数据量大的数据集上训练一个模型。
  2. 把这个模型的后面几层删掉,换成新的层。
  3. 固定没有被换掉的层的参数,新模型在目标数据集上进行finetune。
    如下图,这篇paper用的AlexNet,把FC8去掉,重新加了两个全链接,在要测试的数据集上进行finetune。在PASCAL 2007/2012上物体分类以及Pascal 2012动作分类上都取得很好效果。

文章另外两个值得学习的部分是:
[1] 如何对样本进行分类(设置groundtruth)。会从两个方面考虑(1)正样本的bbox( $B_o$ )跟patch( $P$ )的重合程度,$|P \cap B_o| \ge 0.2|P| \&\& |P \cap B_o| \ge 0.6|B_o|$, (2)一个被当做正样本的patch不能包含两个object。
[2] 样本均衡问题。文章的做法是从background patches里面选取10%用来训练,其实我觉得没必要这么做,使用SGD来训练的时候,只需要调整每个mini-batch的正负样本即可,比如一个batch大小是10,可以3个是正样本,7个是负样本,这个方法实质是使得每次更新参数的时候,负样本对权值的影响不会是压倒性的。这个方法我屡试不爽。

在生成样本的时候,每张图片大概会在8个尺度下随机产生500个方形patches,而且这些patches里面,相邻的patches需要有50% overlap,测试也是每张图片用500个patch,然后通过下面的公式进行融合,$C_n$是类别,$M$是patches数量(500),$y(C_n | P_i)$就是每个patch对应的概率输出,$k$是可调参数,$k$越大表示越关心概率大的patch:

$$ score(C_n) = \frac{1}{M}y(C_n | P_i)^k $$

贴一下样本分类的图:

Action and Attributes from Wholes and Parts

paper链接

我觉得这个paper写得很难懂….

思路是用CNN做分类,如下图,先通过把人体不同的part检测出来,然后把对每个part提取AlexNet(CNN)的fc7的features,把这些features拼接起来得到concat features,然后把这个concat features作为线性svm的输入进行训练。

然后文章的贡献就是如果检测part,因为还是走的是feature pyramid + sliding windows + classification流程,那么就必须得先训练好单一尺度的part的分类器。文章并不是对人的每个关键点训练一个分类器,而是定义了所谓的high-level part:头/躯干/腿,这相当于把整个人从上到下分成了三部分,下图是例子。

对于每个part,内部还会分不同的类型,比如头部,就可能会被分成左侧脸/右侧脸/正脸,当然这只是我直观上的说法,实际上文章是通过聚类得到的。这跟poselet很像,所以作者也说自己是deep poselet…

同样的,他训练part的分类器跟训练action的分类器类似,也是提取AlexNet某层的feature出来,然后把他扔到线性svm里面训练。在最终测试的时候,part检测是会在给定bbox(可以是groundtruth,可以是检测的结果,例如用R-CNN来检测)的情况下进行检测,对于每个part,会选择在给定bbox下的最大响应作为输出。

R-CNNs for Pose Estimation and Action Detection

paper链接

这个paper比较简单,一个简单的multi-task paper。网络结构如下:

总共有3个输出,分别是人体检测/姿势估计/动作分类,具体的loss看paper就好了,最终这三个loss是加权起来,通过控制权值可以实现单任务训练以及多任务训练。

跟R-CNN类似,这个网络的输入是object proposal。

Contextual Action Recognition with R*CNN

paper链接

这篇paper是结合了context信息来做,这么看来感觉已经追上了传统的步伐了…套路是:只对整个人建模 –> 对part也建模 –> 对context信息建模,接下来就是对part/context/object同时建模了。

这个paper很简单,可以说是传统的方法换了个特征。尽管如何,还是有点创意的,创意在于作者怎么去对context建模,也就是如何找对行为分类有用的context区域。作者提出了一个R*CNN的方法,他在这个方法里面指定了两个区域,一个叫primary region,这个区域是包括一个人,由ground truth box给出,这个人的动作需要被分类;另外一个叫secondary region,这个区域包含的是对行为分类有用的context信息。secondary regions是由一些region proposal(论文用的是selective search)的方法产生,因为是用region proposal的方法产生,所以可能会存在多个region,那么就存在如何选一个最有效的region出来的问题。

假设$\phi$表示特征,$r$表示primary region,$R(r; I)$表示secondary regions的候选区域,其中$R(r; I) = \{s \in S(I); overlap(s, r) \in [l, u]$,$s$表示secondary region,上面的条件约束了$s$的候选区域,让$s$跟$r$的交并比在一定范围内。$s^*$表示最好的secondary region,那么
$$
\begin{equation}
s^* = arg\max_{s \in R(r; I)}w_s^{\alpha} \cdot \phi(s; I)
\end{equation}
$$

最终每个action的score:

$$\begin{equation} score(\alpha; I, r) = w_p^{\alpha} \cdot \phi(r; I) + \max_{s \in R(r; I)}w_s^{\alpha} \cdot \phi(s; I) \end{equation}$$

接着用个softmax转换为概率的形式:

$$\begin{equation} P(\alpha | I, r) = \frac{exp(score(\alpha'; I, r)}{\sum{exp(score(\alpha'; I, r)}} \end{equation}$$

最终上面的公式都可以映射到网络里面,网络结构如下:

作者用的是VGG net,在conv5出来之后就会分两路,红色那路是用来处理primary region,绿色那路是用来处理secondary regions,绿色那里的secondary regions的数量是固定的,每次随机的从$R(r; I)$里面选N个,最终在secondary regions选取一个score最大的跟primary region的score相加,然后经过softmax。实际训练中,fc6/fc7是不动的,finetune的是score这一层的参数。

大概思路就是这样。

然后看一下网络选取secondary regions的情况:

其实可以隐约的发现,secondary regions都是跟action比较相关的,所以说secondary regions还是比较靠谱的,其实这跟Vittorio在12年的PAMI的想法类似的,不过显然,这个模型远不够Vittorio的好。

坚持原创技术分享,您的支持将鼓励我继续创作!