CNN/Action_Recognition/C3D/readme.md
Learning spatiotemporal features with 3d convolutional networks
C3D是facebook的一个工作,采用3D卷积和3D Pooling构建了网络。 通过3D卷积,C3D可以直接处理视频(或者说是视频帧的volume) 实验效果:UCF101-85.2% 可以看出其在UCF101上的效果距离two stream方法还有不小差距。 我认为这主要是网络结构造成的,C3D中的网络结构为自己设计的简单结构,如下图所示。
速度:
C3D的最大优势在于其速度,在文章中其速度为314fps。而实际上这是基于两年前的显卡了。
用Nvidia 1080显卡可以达到600fps以上。
所以C3D的效率是要远远高于其他方法的,个人认为这使得C3D有着很好的应用前景。
即基于inception-V1模型,将2D卷积扩展到3D卷积。
Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset
Temporal 3D ConvNets:New Architecture and Transfer Learning for Video Classificati
该论文值得注意的,
一方面是采用了3D densenet,区别于之前的inception和Resnet结构;
另一方面,TTL层,即使用不同尺度的卷积(inception思想)来捕捉讯息。
Learning Spatio-Temporal Representation with Pseudo-3D Residual Networks
改进ResNet内部连接中的卷积形式。然后,超深网络,一般人显然只能空有想法,望而却步。
官方GitHub项目上同时提供了C3D-v1.0和C3D-v1.1两个版本,以下方法适用于v1.0
官方提供的特征提取demo路径为~/C3D-master/C3D-v1.0/examples/c3d_feature_extraction
在这个路径下,执行c3d_sport1m_feature_extraction_video.sh
或
c3d_sport1m_feature_extraction_frm.sh 可以分别从 视频提取特征 和从 图片提取特征的 demo
打开c3d_sport1m_feature_extraction_video.sh 文件,
除去一些用来生成文件夹的指令,
可以看到启动C3D的命令如下:
GLOG_logtosterr=1
../../build/tools/extract_image_features.bin
prototxt/c3d_sport1m_feature_extractor_video.prototxt
conv3d_deepnetA_sport1m_iter_1900000 0 50 1
prototxt/output_list_video_prefix.txt fc7-1 fc6-1 prob
其中
a) ../../build/tools/extract_image_features.bin
是提取特征的可执行文件,示例命令中使用了相对路径,如果在其他路径下调用注意进行对应的修改
b) prototxt/c3d_sport1m_feature_extractor_video.prototxt caffe网络配置文件和数据集路径等
c) conv3d_deepnetA_sport1m_iter_1900000 这是预训练模型文件,根据自己的需求做对应的修改
d) 接下来的三项数字是:0 50 1,分别是gpu_id,mini_batch_size 和 number_of_mini_batches。
gpu_id是在计算机具有多块GPU时指定使用哪一块GPU的,默认是0,如果将这一项的值置为-1则启动CPU模式。
需要注意,如果需要调整batch size,在prototxt文档中也要进行相应的修改
e) prototxt/output_list_video_prefix.txt 是输出前缀文件,下面会详细介绍
f) fc7-1 fc6-1 prob 是卷积层特征输出名称 要提取哪一层的特征依序写在这里即可
prototxt/c3d_sport1m_feature_extractor_video.prototxt是这个demo所使用的prototxt文档
第8行:
source: "prototxt/input_list_frm.txt"
这是记录输入文件路径的文档。在这个demo中,prototxt/input_list_frm.txt对应的是以图片作为输入时的文档,
而prototxt/input_list_video.txt对应的是以视频作为输入时的文档。
以prototxt/input_list_frm.txt为例,
该文档格式如下:
input/frm/v_ApplyEyeMakeup_g01_c01/ 1 0
input/frm/v_ApplyEyeMakeup_g01_c01/ 17 0
input/frm/v_ApplyEyeMakeup_g01_c01/ 33 0
input/frm/v_ApplyEyeMakeup_g01_c01/ 49 0
input/frm/v_ApplyEyeMakeup_g01_c01/ 65 0
input/frm/v_ApplyEyeMakeup_g01_c01/ 81 0
input/frm/v_ApplyEyeMakeup_g01_c01/ 97 0
input/frm/v_ApplyEyeMakeup_g01_c01/ 113 0
input/frm/v_ApplyEyeMakeup_g01_c01/ 129 0
input/frm/v_ApplyEyeMakeup_g01_c01/ 145 0
input/frm/v_BaseballPitch_g01_c01/ 1 0
input/frm/v_BaseballPitch_g01_c01/ 17 0
input/frm/v_BaseballPitch_g01_c01/ 33 0
input/frm/v_BaseballPitch_g01_c01/ 49 0
input/frm/v_BaseballPitch_g01_c01/ 65 0
input/frm/v_BaseballPitch_g01_c01/ 81 0
其中input/frm/v_ApplyEyeMakeup_g01_c01/是保存图片的路径,
后面的第一个数字表示从哪一帧开始提取特征,
最后的数字表示该行对应的类别。
由于这是提取特征而非训练,类别填写什么都不要紧,只要有就行
多少帧提取一次特征,是由prototxt/input_list_frm.txt中第17行new_length一项参数决定的。
例如上面例子中的视频一共有165帧,那么最后一行对应的145帧开始提取特征,
取16帧,使用145帧-161帧的数据。在这里如果取用的帧的编号超过总帧数165,
则会报错,要注意这一点
如果输入时视频,则参考prototxt/input_list_video.txt。
需要注意的是,输入为视频时帧的序号是从0开始计算的。
第9行:
use_image: true
如果输入时图片,则为true,如果输入时视频,则为false。
第10行
mean_file: "fb_train16_128_mean.binaryproto"
这里是使用的均值文件的路径,根据所使用的模型生成或选择均值文件即可
另外也可根据需求修改其他参数。
参照prototxt/output_list_video_prefix.txt生成输出前缀文件,
可以根据需求进行自定义,只要注意该文件要和prototxt/input_list_frm.txt
输入文件清单的行数相对应即可
输出的特征文件所保存的路径必须自己生成,C3D不会创建文件夹
如果提示“out of memory” 可以尝试减小batch size
提取的特征是二进制文件,需要进行格式转换才能正常处理
其他的注意事项可以参考官方的用户指南
训练和fine-tune的官方demo的路径分别是
~/C3D-master/C3D-v1.0/examples/c3d_train_ucf101
~/C3D-master/C3D-v1.0/examples/c3d_finetuning
所使用的prototxt和inputlist等文件参照特征提取和demo修改即可.