一 写在前面
未经允许,不得转载,谢谢~~
这篇文章是DeepMind团队发在CVPR2017年的文章,它把视频分类任务在HMDB-51H和UCF-101数据集上分别做到了80.9%和98.0%,还是非常值得学习一下的。
我主要从以下这三个方面整理了一下文章的核心内容:
- 场景引入
- Introduction: 本文基于什么样的背景做了什么事情?
- Action Classification Architecture: 具体使用的模型结构,又是怎么根据一个现有的2D ConvNet提出新的I3D模型,并巧妙利用原来的参数做模型的训练?
实验结果以及更细节的东西就不在这里介绍了,感兴趣的同学自己去看原文哦~
- 文章链接:http://cn.arxiv.org/abs/1705.07750
- 文章代码链接:https://github.com/deepmind/kinetics-i3d
二 场景引入
在讲文章之前我们先来看一下这张图片:
这张图片是从Quo Vadis
这步影视作品里截取出来的,就只有这一张图片的情况下,我们无法猜测剧情中男女主是否接下来要kiss each other,还是 they have just done so?所以说单张图像能够展示给我们的动作信息是非常含糊的。
但是由于现有动作识别数据集大小的限制,导致现在即使是最好的视频识别网络都很难完全与图像识别分开,因为图像领域有一个非常大的数据集ImageNet,这给图像分析带来很大的便利。
接下来我会讲为什么说目前视频识别研究也这么依赖于ImageNet,以及本文基于这样的背景做了什么样的事情。
三 Introduction
3.1 ImageNet challenge带来的福利
ImageNet是目前计算机视觉领域最大的图像数据集,有1500 万由人工注释的带标签的图片,超过 2.2 万个类别。
而围绕这个数据集展开的ImageNet challenge诞生出了很多优秀的网络。
比如最常见的AlexNet、VGG16这些在ImageNet上本来用于做图片分类任务训练出来的网络我就可以直接用来做一个图像特征的提取,取到fc7的输出,作为图像特征,然后继续做图像分割、图像相似度检测、动作识别等任务。这一步,也常常称为warm starting(热启动),这个对于后面的任务效果提升非常明显,甚至有的时候可以直接用这些模型提取到的网络作为特征来使用。
3.2 由ImageNet Challenge带来的启发
ImageNet是对图像做分类任务,那么同样的我们就会想在视频领域,如果我们在一个足够大的数据集上做动作的识别任务的训练,这样训练出来的模型在用于其他的任务或者说是不同的数据集的时候会不会有同样效果的提升呢?
所以本文就想来回答这样的一个问题,跟ImageNet这个图像数据集相对的,我们选择了一个Kinetics数据集。
在视频动作识别领域,主要有这样三个比较常用的数据集:HMDB-51、UCF-101、Kinetics
前面两个都是小数据集,分别包含51个动作类别、101个动作类别,很多现有的方法在这两个数据集上的分类结果都差不多,很难真正判别一个模型结构的好坏。
我们主要介绍下本文主要用到的Kinetics这个数据集:
- 整个数据集有400 human action classes,每个类别都有超过400 clips
- Person actions(singular) : drawing,drinking,laughing;
- Person-Person actions : hugging, kissing, shaking hands;
- Person-Object actions : opening presents, washing dishes.moving lawn;
- 有些动作需要特别挖掘时间信息:比如不同类型的有游泳;
- 有些动作需要侧重于物体信息,比如不同类型的乐器;
3.3 本文所做的工作
基于以上的背景,本文主要做了以下2项工作:
挑选了比较经典的视频动作识别的方法来验证先在大的Kinetics数据集上做预先训练,再各自到HMDB-51和UCF101上做fine-tuning。结果证实这样的做法确实对于分类精度的提升有较大的促进作用,但是具体对于每个模型的精度度提升多少还是由模型本身决定。
-
文章又做了第二件事情:提出Two-Stream Inflated 3D ConvNets(I3D)。
- 提出了一个能很好的利用现有的image classification model(2D ConvNet)来扩充得到一个3D ConvNet;
- 简单来说就是对原来的网络结构中的filters和pooling kernels都换成是3D的,这样就可以更好的提取视频的时序信息。又由于这样是从2D直接过来的,还可以利用ImageNet上训练好的网络参数。
- 最终本文模型在Kinetics数据集上预训练过的模型能在HMDB-51和UCF-101上分别达到80.9%和98.0%的精度。
四 Action Classification Architectures
这个部分我们就来看下文章选择了哪些经典且具有代表意义的视频动作识别网络来验证现在大的Kinetic数据集上训练会在小数据集上带来促进作用,以及文章是怎么样通过一个现有的image classification model扩充得到新的3D模型,又是怎么样利用原来的参数并把整个模型结构嵌入到Two-Stream方法中,形成I3D的?
4.1 Current video architectures
在现有的视频信息表示的结构中,主要有以下几项不同的地方:
- 卷积操作是2D(image-based)的还是3D(video-based)的;
- 网络输入是只有RGB图像,还是包括提前计算过的optical flow
- 另外在那些2DConvNets中,又如何利用LSTM或者时间上的特征融合来做到跨帧传播信息;
本文挑选了一些比较经典且具有代表意义的网络模型:
- 2D ConvNets中:ConvNets with LSTMs on TOP
- 2D ConvNets中:two-stream networks with two different stream fusion
- 3D ConvNets中:C3D
- 本文:two-stream inflated 3D ConvNets(I3D)
文章实验用到的5个模型就如下图所示:
- 图(a)就是第1种情况;
- 图(b)就是C3D的结构示意图;
- 图(c)和图(d)就是第2种Two Stream结构,只是两个Stream的融合方式不一样;
- 图(d)就是本文新提出的I3D了。
I3D:之前的3D ConvNets由于参数比较多,但是训练数据又少,所以网络层数都不会太深。但是本文就想能不能利用本来已经有的一些用在图像分类任务上的2D ConvNets, 想办法把他们扩充成3D,然后套入到two-stream这个大的方法框架中。因为这些网络本身就比较深,又有预先训练好的参数可以用来初始化,所以就可以解决我们刚刚提到的参数多、训练数据少的问题。
接下来的这张表是模型的参数大小以及模型输入的信息:
experiment strategy: 这里除了C3D外都有在ImageNet上预先训练好的网络模型,为了方便对比,我们把inception-v1,并对它用不同的方式进行变换来适应各个具体的网路结构。
Inception-v1:具体的网络结构就不讲了,简单看下构成:
4.2 The Old 1: ConvNet+LSTM
- 图像分类任务的高精度使得我们很想把它直接用在视频分析上;
- 最简单最方便的做法是把每帧都看成是独立的,提取图像特征后,然后取平均作为整个视频的特征,但是这样的做法完全忽略了视频的时序信息;
- 所以像图(a)中展示的更舒服更合理的做法就是增加一层长短时时间网络LSTM,来学习各个帧之间的时序信息 .所以文章在Inception-V1的最后一个average-pooling后面加了一个包含512个隐含节点的LSTM,最后跟的是一个用于分类的全连接层;
4.3 The Old 2 :3D ConvNets
- 3D ConvNets看起来应该是处理视频分析最自然的方法;
- 但是3D网络比2D网络拥有更多的模型参数,这也代表网络更难训练;
- 而且因为本来就是3D的结构,所以它们看起来没有办法享受到ImageNet预训练的好处;
- C3D本身也是一个非常经典的3D convNet,我们来看一下3D convolution的示意图,具体的细节就不展开了
- 在实验中也对原本的C3D的结构做了一些小的变化,这里就不再说具体的了,对这篇文章来说主要掌握到知道C3D大概是什么样子就可以了。
4.4 The Old 3: Two-Stream Networks
1. why two-stream?
- 像ConvNet+LSTM这样的结构中,可能能够提取都到高层的一些变化信息,但是对帧与帧之间低层动作信息建模是不够的, 而这一点在action recognition中是非常重要的;
- two-stream就从不同的角度解决了这个问题:一路是RGB帧,另一路是计算得到的光学流。这样就对时间和空间的信息提取都比较好;
- 这种方法在现有benchmarks上的表现都不错,而且比较容易训练和测试;
2. two different fusion methods
- 图(c): 取一帧图像预测的结果与光学流图像预测的结果取平均
- 图(d): 是在图(c)基础上的一种扩展,通过一个3D ConvNet对多帧的信息进行融合,取到两个Stream的最后一个average pooling层的输出,作为3D ConvNet部分的输入,先是512个(3,3,3)的卷积核,然后是一个(3,3,3)的max-pooling,最后是一个全连接层;
两个Two-Stream模型都是端到端的方式进行训练的;
4.5 The New: Two-Stream Inflated 3D ConvNets
方法的优越性:
- 通过把2D ConvNet扩充成3D的ConvNet可以在参数初始化的时候用原来在ImageNet上预训练的参数做初始化;
- 还用了比较好的two-stream方法;
4.5.1 inflating 2D ConvNets into 3D
- 直接将那些在图像分类上表现优异的模型扩充成3D模型;
- 在现有的2D architecture基础上将里面的2维卷积核的过滤器filters以及pooling kernels,通常为square:(N,N),扩充成cublic:(N,N,N)
4.5.2 Bootstrapping 3D filters from 2D filters
直接扩充容易,但是要怎么使用原来训练好的模型参数来做初始化呢?
我们可以想象一下把一个帧图像沿着时间轴复制n次,除了帧与帧之间没有变化之外,这其实就是一个video,我们称之为boring video
那么我们要达到在这个boring video上做卷积操作后得到的feature map与原来的初始图像做卷积操作后得到的feature map一模一样。
解决方法就是将原来(N,N)的卷积核沿着t的方向复制N遍,得到(N,N,N), 再将这(N,N,N)的卷积核中每个值都除以N做个rescaling就可以满足这个需求了。
我用(3,3,3)的kernel做了如下证明,实在懒得打字了,and忽略下我丑丑的字ヾ(◍°∇°◍)ノ゙
- 因为我们证明了convolution layer按照这样的方法可以保证在时间轴上是constant的,所以relu,maxpool这些层也都能保留原来的模型特性。
4.5.3 Pacing receptive field growth in space,time and network depth
怎么选择convolution stride和pooling操作在时间维度上的扩充问题;这两个都是影响feature receptive field的主要因素。
几乎所有的image models对待空间平面(horizontial和vertical),不管是pooling kernels的大小还是convolution stride的大小在这2个维度上都是一样的,(2,2) (3,3) (7,7)都是这样的;
但是在考虑时间维度的时候,完全对称的接受域并不一定是最好的,这个由frame rate,image dimension共同决定;
- time grows more quickly than space: 可能会破坏物体边缘信息,从而影响早期物体特征检测;
- time grows more slowly than space: 可能就不能很好的捕捉场景动态信息,影响动作的检测;
- 所以本文在将Inceptin-V1扩充的时候,并不是简单的做对称维度:
-
扩充后的Inception-V1模型结构:
- 可以看到是原来的Inception-v1结构变换而来的,原来的convolution以及pool全部都成了3D的;
- 大多数保持了对称的特征,例如第一个(7,7)变成(7,7,7),stride也由原来的(2,2)变成了(2,2,2)
- 但是少数做了改变,比如前面的两个max-pool,并不是(2,2,2),而是(1,2,2)这样能够更好的保留时间信息;还有最后的这个avg-pool,并不是(7,7,7)而是(2,7,7)。
4.5.4 Two 3D Streams
现在我们看到的这个3D ConvNet已经可以比较好的提取时间和空间信息了;
但是two-stream这个方法对于动作识别来说还是非常有帮助的;
-
所以最后又将这个3D ConvNet设计成two stream的方式,具体的结构图如下所示,对左右两个网络分开训练,然后最后对它们各自的预测结果做一个平均。
4.5.5 Implementation Details
主要讲了网络训练测试的一些细节,介绍几个关键的点:
- 除了C3D-like之外都用在ImageNet上预训练过的Inception-v1做参数的初始化;
- 所有的网络,除了最后一层conv,其余都加BN层和relu层;
- 网络模型是现在大的这个Kinetic数据集上训练110k个step,然后再在Hmdb-51和UCF101上各自进行fine-tuning。
五 Experiment
文章主要做了两部分的实验:
- experimental comparion of architectures
- experimental evalution of feature
这部分内容就不再介绍了~~
六 写在最后
花了2天的时间阅读和理解文章以及做整个文章的梳理工作,觉得还ok的话点个赞呀嘻嘻~
❥(ゝω・✿ฺ)
感谢阅读~
有问题欢迎简信交流。