目录
参考资料
论文:
Learning Spatiotemporal Features with 3D Convolutional Networks
博客:
第1章 引言
随着互联网的发展,越来越多的视频被分享在网上。计算机视觉社区关于视频的研究也在不断发展,比如行为识别、异常事件检测、活动理解等。通过采用不同的具体解决方案,在这些个别问题上取得了相当大的进展。然而,对于解决大规模视频任务,仍然需要有一套通用的视频特征表示学习方法。
作者认为,比较好的视频表征需要具备如下四个特性:
(1)泛化性,对于互联网、影视剧、宠物、日常等类型的视频都能学得很好的表征;
(2)紧凑性,用更低的维度包含更多的信息,这能减小存储和检索的压力;
(3)计算高效,视频量级较大,计算高效可以节省很多计算资源;
(4)实现简单;
在图像领域,在ImageNet预训练的深度卷积模型迁移到其他图像领域也有很好的表现,不过,这些模型却不能直接迁移到视频领域。原因在于,这些图像预训练模型缺少视频中的运动信息的表征能力。因此,作者在本文主要是想通过深度3D卷积神经网络来学习一种视频通用表征,并验证在这个视频表征上,只需要结合简单的分类器就可以在不同的视频任务上取得不错的效果。
论文的主要贡献如下:
- 实验表明3D卷积网络能够很好的同时建模形状和运动特征。
- 发现在网络所有层都使用 3×3×3 的卷积能够获得最好的结果。
- 本文提出的网络特征 + 简单的线性分类模型,在4种不同的任务以及6个不同的数据集上都接近或者超过当前的方法。
第2章 3D卷积网络架构
2.1 2D卷积和3D卷积原理
2.1.1 2D卷积
如图所示:输入层为 5 × 5 × 3 5\times5\times3 5×5×3 的矩阵(即为三通道),卷积核为 3 × 3 × 3 3\times3\times3 3×3×3 的矩阵(即卷积核的通道数为3),首先卷积核中的每个通道分别应用于输入层的三个通道。执行卷积计算,输出 3 3 3 个 3 × 3 3\times3 3×3 的通道。
然后对这三通道相加,即进行 矩阵加法
,得到一个
3
×
3
×
1
3\times3\times1
3×3×1 的单通道。这个通道就是在输入层
5
×
5
×
3
5\times5\times3
5×5×3 应用单个
3
×
3
×
3
3\times3\times3
3×3×3 卷积核的结果,如下图所示:
静态过程如下图所示:
同样地,以上过程可以更为统一地看成一个3D的卷积核对输入层进行处理。其中输入层和卷积核有着相同的深度,即输入层的通道数量与卷积核中通道数相同。3D卷积核即只需要在输入层的2个维度(高和宽)滑动,这也是为什么3D卷积核用于处理3D矩阵时,该运算过程称为2D卷积的原因。在每个滑动位置,执行乘法和加法运算得到一个运算结果(单个数字)。
在每个滑动位置,执行乘法和加法运算得到一个运算结果(单个数字)。
进一步,我们就能非常轻易地理解如何在不同深度的层(Layer)进行转换。假设输入层有 D i n D_{in} Din 个通道,而输出层需要得到 D o u t D_{out} Dout 个通道。只需要将 D o u t D_{out} Dout 个卷积核对输入层进行处理,单个卷积核的维度为 K × K × D i n K\times K \times D_{in} K×K×Din 。
2D卷积的计算过程如下:
- 输入层为: W i n × H i n × D i n W_{in}\times H_{in}\times D_{in} Win×Hin×Din
- 超参数:
- 卷积核个数: k k k
- 卷积核的大小: w × h w\times h w×h
- 滑动步长(Stride): s s s
- 填充值(Padding): p p p
- 输出层: W o u t × H o u t × D o u t W_{out}\times H_{out}\times D_{out} Wout×Hout×Dout
- 其中输出层和输入层之间的参数关系为:
W o u t = ( W i n + 2 p − w ) s + 1 H o u t = ( H i n + 2 p − h ) s + 1 D o u t = k W_{out} = \frac{(W_{in}+2p-w)}{s}+1\\ H_{out} = \frac{(H_{in}+2p-h)}{s}+1\\ D_{out} = k Wout=s(Win+2p−w)+1Hout=s(Hin+2p−h)+1Dout=k
- 参数量为: ( w × h × D i n + 1 ) × k (w\times h \times D_{in}+1)\times k (w×h×Din+1)×k
2.1.2 3D卷积
在上面的图中,可以看出,这实际上是在完成3D卷积。但通常意义上,仍然称之为深度学习的2D卷积。因为将卷积核深度和输入层深度相同,3D卷积核仅在宽和高这2个维度上移动,得到的结果为单通道。
通过将2D卷积的推广,在3D卷积定义为卷积核的深度小于输入层的深度(即卷积核的个数小于输入层通道数),故3D卷积核需要在三个维度上滑动(输入层的长、宽、高)。在卷积核滑动的每个位置执行一次卷积操作,得到一个数值。当卷积核滑过整个3D空间,输出的结构也是3D的。
简单点讲,三维卷积需要向三个方向滑动,分别是width、height、depth(注意这个深度不是RGB)。你可以讲二维卷积看作是三维卷积的特例!
3D卷积的计算过程如下:
- 输入层为: W i n × H i n × D i n × C i n W_{in}\times H_{in}\times D_{in}\times C_{in} Win×Hin×Din×Cin
- 超参数:
- 卷积核个数: k k k
- 卷积核的大小: w × h × d w\times h\times d w×h×d
- 滑动步长(Stride): s s s
- 填充值(Padding): p p p
- 输出层: W o u t × H o u t × D o u t × C o u t W_{out}\times H_{out}\times D_{out}\times C_{out} Wout×Hout×Dout×Cout
- 其中输出层和输入层之间的参数关系为:
W o u t = ( W i n + 2 p − w ) s + 1 H o u t = ( H i n + 2 p − h ) s + 1 D o u t = ( D i n + 2 p − d ) s + 1 C o u t = k W_{out} = \frac{(W_{in}+2p-w)}{s}+1\\ H_{out} = \frac{(H_{in}+2p-h)}{s}+1\\ D_{out} = \frac{(D_{in}+2p-d)}{s}+1\\ C_{out} = k Wout=s(Win+2p−w)+1Hout=s(Hin+2p−h)+1Dout=s(Din+2p−d)+1Cout=k
- 参数量为: ( w × h × d + 1 ) × k (w\times h \times d+1)\times k (w×h×d+1)×k
2.2 网络结构
与2D的卷积相比,3D的卷积得益于其3D卷积和3D池化的操作特性更加有效地提取时间域的特征。2D卷积无论输入是单通道图像还是多通道图像,其结果都是单张图像,也就损失了时间域上的信息。而3D卷积输出保持空间域上的特征,是立体输出。同样的道理可以推到池化上面。
Two-Stream的方法[1]中的时间流上虽然输入是视频的多帧图像,但是因为其采用的是2D的卷积,一层卷积之后时间域上的信息就破坏掉了。目前只有Slow Fusion model[2]中在前3个卷积层采用了3D的卷积和平均池化,这应该也是其表现优于Two-Stream方法[1]的主要原因。但是3层之后的非3D卷积还是丢失了时间域的信息。
基于 VGG
[3]中的结论,通过堆叠小的 3x3
的卷积核可以后的更优的效果。这篇文章也采用了
3
×
3
3\times3
3×3 的卷积核。以下论文均采用
c
×
l
×
h
×
w
c×l×h×w
c×l×h×w 表示视频片段,其中
c
c
c 表示通道数,
l
l
l 表示帧数,
d
×
k
×
k
d×k×k
d×k×k 表示3D卷积核和池化核,其中
d
d
d 表示时间域深度。
网络的基本设定:网络输入是视频片段,输出是特定的UCF101的类别标签。所有的视频帧都被resize到128x171。视频被拆分成非重叠的包含16帧的片段作为网络的输入,也就是输入维度是
3
×
16
×
128
×
171
3×16×128×171
3×16×128×171 。作者在训练的时候还采用了 jittering
的方法,从输入的视频片段随机 crop
出来
3
×
16
×
112
×
112
3×16×112×112
3×16×112×112 大小,然后再做resize。
- 网络结构采用了 5个卷积层 + 5个最大池化层 + 2个全连接层 + 1个softmax分类器。即每个卷积层后面都跟了一个最大池化。
- 所有层的3D卷积核都相同,为 d × 3 × 3 d×3×3 d×3×3 (实验中发现d=3的效果最好);
- 所有层的3D最大池化层的kernel也都相同,为
2
×
2
×
2
2×2×2
2×2×2 (除了第一个池化层)。第一个池化层的kernel size为
1
×
2
×
2
1×2×2
1×2×2 ,即只对空间特征进行池化,时间维度保持不变,这样做的目的是:
- (1)不过早的合并时间信息;
- (2)输入时间维度 l = 16 l=16 l=16 ,只能经过4个最大池化就变成1了,只有设置第一个最大池化的时间深度为1,才能保证后面的4个最大池化可以正常操作。
- 所有卷积操作时,在3个方向的都使用padding并且步长都为1,即卷积操作时保证输入特征的维度不发生变化。只有在池化过程中才改变。
第3章 实验
3.1 探索卷积核深度
时间维度为3的3D卷积效果最好,时间维度为1的3D卷积核,退化成2D卷积核,效果最差。
3.2 时空表征学习
作者通过反卷积的方法可视化特征,观察到:C3D首先关注前几帧的外观,并跟踪后续帧的显著运动。
3.3 行为识别
作者在UCF101数据集上同样进行了测试,baselines的方法选择了iDT[4]和基于imagenet的预训练模型提取帧特征再做融合的方法。
这里可以看到C3D的特征联合iDT的特征能够取得90.4的最好结果,但是联合ImageNet的特征就没有啥提升。作者这里提到因为iDT的特征基本上是基于光流和低梯度直方图,而C3D的特征是高阶的语义特征,因此两者会相互补充。
第4章 Pytorch实现C3D
参考博客:
代码: