有关C3D源代码和预训练模型的信息,请访问http://vlg.cs.dartmouth.edu/c3d。
最新修订:2017,5.20
-还没有对于V1.1的文档,但是对特征提取,训练和微调的例子已经提供。
目录
下面的指导是为C3D-v1.0写的
译者注:这个是一个作者告诉我们如何提取特征的一个举例,需要自己再下载预训练模型之后就可以运行了,因为用于提取特征的视频和图片作者已经为我们准备了。
如果你已经成功安装C3D(或者安装了caffe和它的依赖),接下来使用如下步骤:
sh c3d_sport1m_feature_extraction_frm.sh
或者(这个是视频作为输入)
c3d_sport1m_feature_extraction_video.sh
如果你可以成功运行例子,然后你就可以在输出文件夹下发现已经提取到的特征。
如果你运行时出现:out of memory错误,那么你应该考虑减少Batch-size(see section I.B)
如果你可以成功运行从帧中提取特征,但是在视频输入时候失败了。可能的原因是视频编码的问题。请确保你已经编译了你的OpenCV和Ffmpeg并打开了共享标志。
注意:对于使用帧当做输入,帧序号从1开始(例如1至N);对于使用视频当做输入,从0开始。
输入列表文件使一个文本文件,其中每一行包含用于输入C3D中提取特征的剪辑的信息。每一行的格式如下:
<string_path> <starting_frame> <label>
<路径字符串><开始帧><标签>
其中,<标签>值用于训练、测试或者微调,但不用于提取特征,于是可以被忽略(在提供的例子中,他们都被0填充,因为所给的例子是用于教其他人如何使用C3D提取特征的)。对于<路径字符串>(<string_path>),有两种情况。
最后<开始帧>被用于指定剪辑的开始帧。我们注意到C3D是提取16帧长度的剪辑的特征。例如,如果开始帧是1,那么你正在为从帧1到帧16的剪辑(从<路径字符串>指定的)提取特征。如果开始帧是17,那么感兴趣的剪辑是从17到32。
注意:在所给出的例子中,我们已经使用16帧的步长从视频中采样了一些剪辑。你可以使用不同的采样大小(步长):例如密集到每一帧或者稀疏到每32帧。
- 输出前缀文件使用于指定正在提取的特征将被保存到的位置,每一行的格式如下:
<output_prefix>
<输出前缀>
前缀文件中的每一行对对应于输入列表文件中的一行(顺序相同,例如,前缀文件中的第一行是对于列表文件中的第一行的剪辑的输出前缀)。C3D将会将特征保存为:output_prefix.[feature_name](例如: prefix.fc6,即输出前缀为prefix,是fc6层的特征)。建议给每个视频创建一个输出文件夹,并将前缀格式化为sprintf(“output_folder/%06d”, starting_frame). 这意味着每个剪辑都有自己的起始帧作为标识符,文件拓展名用于不同的特征。记住要创建输出文件夹,因为C3D不会创建他们。
source: "prototxt/input_list_frm.txt"
并且记住要设定use_image,如果你使用了图片当做输入,那么设置为true;如果使用视频作为输入那么设置为false。
extract_image_features.bin <feature_extractor_prototxt_file> <c3d_pre_trained_model> <gpu_id> <mini_batch_size> <number_of_mini_batches> <output_prefix_file> <feature_name1> <feature_name2> ...
其中:
你可以发现在例子中给出的命令行如下:
GLOG_logtosterr=1 ../../build/tools/extract_image_features.bin prototxt/c3d_sport1m_feature_extractor_frm.prototxt conv3d_deepnetA_sport1m_iter_1900000 0 50 1 prototxt/output_list_prefix.txt fc7-1 fc6-1 prob
假如你有更多或更少的内存,你可以调整mini-batch size(大于或小于50)。为了那么做,你需要调整网络的prototext文件中的参数(找到行,例如 batch_size:50)。你还需要在命令行中输入<mini_batch_size>和<number_of_mini_batch>的新调整参数。
在提取C3D特征之后,你看一下使用提供的MATLAB脚本(read_binary_blob.m)阅读特征以进行进一步分析。
该工具允许您计算您自己的数据集的体积平均值,这对于从零开始培训或在您自己的数据集上微调C3D都很有用。
用法
GLOG_logtostderr=1 compute_volume_mean_from_list input_chunk_list length height width sampling_rate output_file [dropping rate]
参数
如果你更喜欢mean_value,代替volume_mean文件,那么你可以在你的数据层中设置man_value这个字段。这等价于所有值得体积平均都设置为mean_value。
假设您有您的input_data_list、您的train/test prototxt和您的求解程序prototxt,您可以使用train_net来训练网络。
1.将目录改变到YOUR_C3D_HOME/examples/c3d_train_ucf101/
2.运行 sh create_volume_mean.sh 来计算平均卷积文件?
3.运行sh train_ucf101.sh 来训练,预计几天后完成
4.运行sh test_ucf101.sh 进行测试,预计大约15'完成。你的准确率应该在45%左右。(这是剪辑准确率)
确保你已经下载了C3D预训练模型,你可以尝试微调例子,通过以下步骤:
1.更改目录里到 YOUR_C3D_HOME/examples/c3d_finetuning
2.运行: ucf101_finetuning.sh
3.当微调完成,你可以通过运行下面的命令来测试你的微调模型:
sh ucf101_testing.sh
4.【2016/5/10添加】如果你没有时间去在UCF101上微调C3D,在这里我们提供了一个已经在UCF101上微调好的C3D模型。
https://www.dropbox.com/s/mkc9q7g4wnqnmcv/c3d_ucf101_finetune_whole_iter_20000
下载这个模型到 YOUR_C3D_HOME/examples/c3d_finetuning, 并且运行:
sh ucf101_testing.sh
注意:请确保你已经将test_01.lst文件指向你的UCF101帧。
这将给出一个80.19%的准确率(clip accuracy)
注意:这个模型是在UCF101“训练分割1”上微调的,因此他只对在“test split 1”上有效。
1.有对于提取C3D特征的MATLAB或Python封装吗?
答:并没有。
2.我可以在CPU上使用C3D吗?
答:C3D的版本是在老的Caffe上构建的,所以在Makefile中没有“CPU_ONLY”模式。但是你可以通过以下来达到目的:
参考资料:
[1] D. Tran, L. Bourdev, R. Fergus, L. Torresani, and M. Paluri, Learning Spatiotemporal Features with 3D Convolutional Networks, ICCV 2015