转至:http://www.tianzsong.xyz/2018/04/08/c3d-keras/
code:https://github.com/TianzhongSong/C3D-keras
前言
C3D使用3D CNN构造了一个效果不错的网络结构,对于基于视频的问题均可以用来提取特征。 我简单复现了论文中行为识别那部分的实验。
项目地址: C3D-keras
关于C3D的细节可以参考 Will-Lin的博客 行为识别笔记:C3D network-用于视频特征提取的3维卷积网络 或者参看 C3D原始论文。
前期准备
1、数据集:采用的是通用数据集 UCF101。
2、主要用到的库:Keras2.0.8、TensorFlow1.3.0、OpenCV3.2.0
数据处理
1、先将UCF101数据集中的所有视频转换为图片保存到本地(注意:需要大约150多G的存储空间),使用 video2img.py
2、制作标签文档,跟 C3D官方Caffe实现一致,模型输入的视频段长度为16帧,训练集与验证集的分割与UCF101官方保持一致,每个类别的前7个人为测试样本,后面的8~25人为训练样本。
模型定义
我这里使用的模型与论文中的模型并不一致,采用的是 C3D官方Caffe实现 的最新结构,该模型共有5个3D卷积层,卷积核的数量依次为64、128、128、256、256,每一个3D卷积层后接一个3D最大池化层,除第一个池化层的pool_size为(2,2,1)外 其余池化层的pool_size均为(2,2,2),最后接三个全连接层,前两层全连接层的神经元个数均为2048,最后一层为101(类别输出)。权重衰减系数weight_decay设置为0.005。
具体细节请看models.py
训练
在训练过程中我们先将每一个视频段(clip)中的每一帧resize为128x171,并在每个clip上crop一个112x112x16的视频段作为模型输入。对于训练集,每个clip都做一个翻转,作为一个简单的数据扩充手段。验证集只进行中心裁剪。
训练的epoch、学习率及学习率衰减(每4个epoch除以10)都跟原始论文保持一致,由于我只有一快GTX1080,batch_size只设置为16,太大了没法训练。