Tensorflow 2.0 视频分类(四) C3D 3D convolutional Networks

论文学习

摘要

开篇明义,三点结论:

  1. 3D 卷积网络比2D卷积更适合提取时空特征;
  2. 3x3x3的卷积核是最好的filter结构;
  3. C3D与线性分类器的组合有在UCF101数据集上很好的分类效果

介绍

视频分类在动作识别、非常规动作识别、活动理解、视频内容描述等领域;视频描述器的四个特点:通用、有竞争力、高效、简洁;卷积网络并不适用于处理视频数据,因此提出 C3D.
不同数据集上的表现:
在这里插入图片描述
除Sport 1M上,其他数据比之前最好的都要好。
优秀!

相关研究

传统机器视觉领域的SIFTs(spatio-temporal interest points)、SIFT-3D、HOG3D算法。对大规模数据集合表现intractable;
前人在3D卷积网络上的研究对比,突出点提出适用于大规模视频数据集合,具有3D卷积、3Dpooling提取时间信息的深度网络。

网络结构

图一对比了3D卷积的机构特点。对于多帧的视频输入,传统2d卷积核的深度于视频的帧数相同,输出只有一层输出,因此丢失了时域信息(b);相反,3D卷积核的深度d小于输入画面的帧数L,因此一个卷积核操作以后可以得到多特征层,因而保留了时域信息(c).
在这里插入图片描述
可以参看最后一张图中的数据维度,一般的conv2d的输入数据维度为(batch, w, h, channels), 卷积核和stride都是二维参数,即在(w, h)维度上进行操作;
对于conv3d为(batch, frames, w, h, channels),卷积核和stride都是三维参数,即在(frames, w, h)维度上进行操作。

超参设置

对于UCF101的视频数据输入,压缩成3x16x128x171的格式

卷积核深度

卷积核的深度d的确定:相同深度(1,3,5,7);不同深度(逐步加深3-3-5-5-7,逐步减小7-5-5-3-3)
对比结果如下:
在这里插入图片描述
明显采用相同卷积核深度3的网络性能最好。

C3D网络

通过上面的对该笔提出了C3D网络的基本框架。
3x3x3的卷积核大小,1 x 1 x 1stride
2x2x2的pooling层, 2 x 2 x 2stride
整体结构:
在这里插入图片描述

sport-1M数据集上表现

在这里插入图片描述
结果上看比文献29的预测准确度低,但作者说这主要是受到输入画面帧数较多的影响。

网络可视化

在这里插入图片描述
对conv5b特征层进行可视化,可以发现C3D网络相比2D网络对运动物体更加敏感。

动作识别分类

UCF101数据集的动作识别结果
在这里插入图片描述
网络的一些组合和比较,比如C3D (3 nets) 表示三组C3D的fc6同时并联,与SVM结合后能提高预测精度(这里三组C3D训练差别没有太看明白)

网络compactness(紧密度?)

通过提取不同算法的全连接层提取的体征,适用PCA算法降维到10后,对比算法的准确度,进而比较compactness性能。
在这里插入图片描述
相同的fc6特征层,使用t-SNE算法降维到2维可视化空间。
在这里插入图片描述
可见C3D对不同类型的视频在2维空间中有很好的分离

ASLAN动作识别数据集表现

在这里插入图片描述
在这里插入图片描述

场景识别

YUPENN(420 videos of 14 scene categories)和Maryland(130 videos of 13 scene categories)数据集。
在这里插入图片描述
同样优秀!

耗时比较

在这里插入图片描述
一样的优秀!

附录

卷积神经网络,可视化的展示
在这里插入图片描述
在这里插入图片描述

参考

Learning Spatiotemporal Features with 3D Convolutional Networks

下载资源

http://vlg.cs.dartmouth.edu/c3d/

代码实操

C3D网络构建

import  tensorflow as tf
from    tensorflow import keras
from    tensorflow.keras import layers, models, Input
from    tensorflow.keras.models import Model
from 	tensorflow.keras.layers import Conv3D, MaxPooling3D, Dense, Flatten, Dropout, ZeroPadding3D


def C3Dnet(nb_classes, input_shape):
    input_tensor = Input(shape=input_shape)
    # 1st block
    x = Conv3D(64, [3,3,3], activation='relu', padding='same', strides=(1,1,1), name='conv1')(input_tensor)
    x = MaxPooling3D(pool_size=(1,2,2
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值