当前位置: 首页 > 工具软件 > C3D > 使用案例 >

C3D官方指南翻译完整版

韦熙云
2023-12-01

C3D用户指导

英文原文链接

有关C3D源代码和预训练模型的信息,请访问http://vlg.cs.dartmouth.edu/c3d

最新修订:2017,5.20

C3D-v1.1是用新模型发布的(2017,5.1)

-还没有对于V1.1的文档,但是对特征提取,训练和微调的例子已经提供。

目录

I.C3D特征提取

I.A 对你的视频或帧提取C3D特征

a. 准备你的输入文件

b.准备你的设定文件

c.提取C3D特征

I.B 使用更小或更大的batch-size提取C3D特征

II.训练3D卷积网络

A、从列表中计算体积平均值

B、从0开始训练你自己的网络

C、一个从零开始在UCF101上训练的例子

III、微调C3D

问答:


下面的指导是为C3D-v1.0写的

I.C3D特征提取

译者注:这个是一个作者告诉我们如何提取特征的一个举例,需要自己再下载预训练模型之后就可以运行了,因为用于提取特征的视频和图片作者已经为我们准备了。

如果你已经成功安装C3D(或者安装了caffe和它的依赖),接下来使用如下步骤:

  1. 下载预训练模型(这个模型有在文章开头的预训练模型信息那个网址里面给出,但是下载需要科学上网),然后将它保存到 "你的C3D目录/examples/c3d_feature_extraction"
  2. 改变当前目录到 "你的C3D目录/examples/c3d_feature_extraction"
  3. 运行(这个是图片作为输入)
sh c3d_sport1m_feature_extraction_frm.sh

或者(这个是视频作为输入)

c3d_sport1m_feature_extraction_video.sh

 

如果你可以成功运行例子,然后你就可以在输出文件夹下发现已经提取到的特征。

 

如果你运行时出现:out of memory错误,那么你应该考虑减少Batch-size(see section I.B)

 

如果你可以成功运行从帧中提取特征,但是在视频输入时候失败了。可能的原因是视频编码的问题。请确保你已经编译了你的OpenCV和Ffmpeg并打开了共享标志。

  • 当你使用C3D当做特征提取器时,请确保 ‘shuffle: false’ 在你的数据层。这有助于我们保持输入剪辑和输出特征之间的对应关系。

 

I.A 对你的视频或帧提取C3D特征

a. 准备你的输入文件

  • -C3D允许你使用视频输入当做帧序列或视频文件。在使用视频文件的情况下(.mp4, .avi, .mov),请确保你的机器上有适当的解码器,opencv和ffmpeg。在使用帧的情况下,C3D假设每个视频都是一个包含帧数从1到N(帧数)的文件夹。帧的格式如下:“video_folder/%06d.jpg”.

注意:对于使用帧当做输入,帧序号从1开始(例如1至N);对于使用视频当做输入,从0开始。

b.准备你的设定文件

  • 你需要准备两个设定文件:input-list(输入列表)和output prefix。在提供的例子中,他们是:"你的C3D目录/examples/c3d_feature_extraction/prototxt"目录下的input_list_frm.txt(用于图片当作输入), input_list_video.txt(用于视频当作输入), 和 output_list_prefix。

输入列表文件使一个文本文件,其中每一行包含用于输入C3D中提取特征的剪辑的信息。每一行的格式如下:

<string_path> <starting_frame> <label>

<路径字符串><开始帧><标签>

其中,<标签>值用于训练、测试或者微调,但不用于提取特征,于是可以被忽略(在提供的例子中,他们都被0填充,因为所给的例子是用于教其他人如何使用C3D提取特征的)。对于<路径字符串>(<string_path>),有两种情况。

  • 对于视频输入文件的设定,<路径字符串>是完整路径和视频的文件名。(例如,input/avi/v_ApplyEyeMakeup_g01_c01.avi);
  • 对于使用帧作为输入的设定,<路径字符串>是对包含视频的帧的文件夹的完整路径,(例如input/frm/v_ApplyEyeMakeup_g01_c01/)。

最后<开始帧>被用于指定剪辑的开始帧。我们注意到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不会创建他们。

c.提取C3D特征

  • 假设您已经准备好了设置文件,那么您需要修改prototxt文件来指向输入列表文件。在prototxt文件中,查找行:
source: "prototxt/input_list_frm.txt"

并且记住要设定use_image,如果你使用了图片当做输入,那么设置为true;如果使用视频作为输入那么设置为false。

 

  • 使用extract_image_features工具来提取特征。使用工具的命令如下:

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> ...

其中:

  • <feature_extractor_prototxt_file>:是prototxt文件(示例是给出了),指向了你的输入列表文件。
  • <c3d_pre_trained_model>:是你下载的C3D预训练模型。
  • <gpu_id>:你想运行的GPU iD,从0开始,如果被设置为-1,那么将会使用CPU
  • <mini_batch_size>:你的mini batch size大小。默认值是50,但你可以修改这个数字,取决于你的GPU内存。
  • <number_of_mini_batches>:你想要提取特征的的mini-batches的数量。例如,如果您有100个剪辑来提取特性,并且您使用的mini-batch大小为50,那么应该将该参数设置为2。但是,如果您有101个剪辑要提取特征,那么这个数字应该设置为3。
  • <output_prefix_file>:你的输出前缀文件。
  • <feature_name1>:你可以列出尽可能多的特征名称,只要他在网络输出块的名称中。(可以查看所有层的prototxt文件,他们看起来像fc6-1, fc7-1, fc8-1, pool5, conv5b, prob,...)

 

你可以发现在例子中给出的命令行如下:
 

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

I.B 使用更小或更大的batch-size提取C3D特征

假如你有更多或更少的内存,你可以调整mini-batch size(大于或小于50)。为了那么做,你需要调整网络的prototext文件中的参数(找到行,例如 batch_size:50)。你还需要在命令行中输入<mini_batch_size>和<number_of_mini_batch>的新调整参数。

在提取C3D特征之后,你看一下使用提供的MATLAB脚本(read_binary_blob.m)阅读特征以进行进一步分析。

 

II.训练3D卷积网络

A、从列表中计算体积平均值

该工具允许您计算您自己的数据集的体积平均值,这对于从零开始培训或在您自己的数据集上微调C3D都很有用。

 

用法

GLOG_logtostderr=1 compute_volume_mean_from_list input_chunk_list length height width sampling_rate output_file [dropping rate]

 

参数

  • <input_chunk_list>:与特征提取中用到的列表文件相同。
  • <length>:用于训练中的剪辑的长度(例如 16)
  • <height>, <width> :帧的大小,例如128, 171
  • <sampling_rate>:用于调整你的剪辑中的帧率。(例如, 剪辑长度(clip length)为:16, sampling (采样值)= 1,那么你的剪辑就是一个连续16帧的视频块。或者剪辑长度为16,而采样率(sampling rate)为2,那么你剪辑的是32帧的长剪辑,但是你每2帧采样1帧)
  • <output_file>:输出平均文件
  • <dropping_rate>:如果你的数据集太大(例如1M),你可能从剪辑的自己计算平均值。设此为n,表示下降速率为1:n,没n个剪辑中选择1个样本进行均值计算。

 

如果你更喜欢mean_value,代替volume_mean文件,那么你可以在你的数据层中设置man_value这个字段。这等价于所有值得体积平均都设置为mean_value。

 

B、从0开始训练你自己的网络

假设您有您的input_data_list、您的train/test prototxt和您的求解程序prototxt,您可以使用train_net来训练网络。

 

C、一个从零开始在UCF101上训练的例子

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%左右。(这是剪辑准确率)

 

III、微调C3D

确保你已经下载了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

 类似资料: