提取C3D視頻特征(官方文檔&實踐)


C3D Introduction

卷積神經網絡(CNN)近年被廣泛應用於計算機視覺中,包括分類、檢測、分割等任務。這些任務一般都是針對圖像進行的,使用的是二維卷積(即卷積核的維度為二維)。而基於視頻的問題,提特征的方法主要分為雙流和C3D兩個分支,目前C3D衍生出P3D,I3D等等,這里只介紹最早的C3D caffe版提取特征的步驟以及遇到的問題。

C3D 用caffe實現
官網
github

C3D Installation

installation

C3D User Guide

官方User Guide

Du Tran (Last modified Mar 20, 2017)
C3D-v1.1 is released with new models (Mar 01, 2017).
No documentation for v1.1 yet, but some examples for feature extraction, training, and fine-tuning are provided. 

文檔介紹了C3D 1.0的用法,至於1.1,只有examples。

I.C3D Feature Extration

  1. 安裝好C3D,下載預訓練的模型,保存到

    YOUR_PATH_TO_C3D/C3D-master/C3D-v1.0/examples/c3d_feature_extraction
  2. change dir to

    YOUR_PATH_TO_C3D/C3D-master/C3D-v1.0/examples/c3d_feature_extraction
  3. Run:

    sh c3d_sport1m_feature_extraction_frm.sh
    or
    sh c3d_sport1m_feature_extraction_video.sh

運行成功將在output文件夾找到特征文件。

遇到“out of memeory”內存不足的錯誤,調整min_batch_size參數。參見章節 I.B。

如能使用圖片輸入,不能使用視頻輸入。請確保編譯OpenCV和ffmpeg時”shared-flags”為”on”。

I.A Extract C3D features for your own videos or frames

a.准備輸入文件

輸入為視頻或視頻幀
對於視頻文件,由於使用opencv獲得幀,幀數從0開始。
對於視頻幀,命名為“video_folder/%06d.jpg”,幀數從1開始。一個文件夾最多999999個幀,如果視頻超出999999幀,需要分成多個文件夾。

b.准備配置文件(具體可以參考默認的兩個例子修改)

兩個設置選項:輸入列表(input_list) 和 輸出前綴(output_prefix)
在example中,輸入列表的配置文件為: “prototxt/input_list_video.txt”和”prototxt/input_list_frm.txt”。

input_list文件需要制定輸入的列表,格式為每行制定一個輸入。每行的格式為

<string_path> <starting_frame> <label>

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

“string_path”: 為路徑,對視頻,為視頻路徑和文件名;對frames,是包含視頻幀的目錄路徑。
“starting_frame”: C3D能從長為16幀的視頻中提取特征。一個視頻包含了大量的幀,我們需要指定C3D從哪一幀開始提取特征。例如上面例子中的視頻一共有165幀,那么最后一行對應的145幀開始提取特征,取16幀,使用145幀-161幀的數據。在這里如果取用的幀的編號超過總幀數165,則會報錯,要注意這一點。
“label”: 這個僅對訓練、測試、調優起作用,提取特征的時候會被忽略,設置為0。

output_prefix文件要為每一個輸入指定一個輸出前綴。即行數與input_list一致。每行的格式為:
<output_prefix>

C3D將特征輸出到 output_prefix.[feature_name]文件(例如prefix.fc6)。為了與輸入對應,輸出建議采用如下格式`sprintf(“output_folder/%06d”, starting_frame)。

c.提取特征

在prototxt中,通過后綴名為.prototxt的文檔來指向你的輸入列表文件。
主要修改這兩行:

source: “prototxt/input_list_video.txt”

use_image: false
shuffle: false

source 修改為輸入列表文件
如果使用圖像文件,use_image修改為true。
提取特征時確保shuffle為false。
(.prototxt文件第一行是name,接下來是若干個layer,layer用json表示,我們只需要修改第一個輸入layer。)

mean_file: "sport1m_train16_128_mean.binaryproto"

這里是使用的均值文件的路徑,根據所使用的模型生成或選擇均值文件即可

另外也可根據需求修改其他參數。

 

接下來使用extract_image_features工具來提取特征。

該工具使用的參數如下

  1. 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文件,指向input_list_file,如prototxt/c3d_sport1m_feature_extractor_video.prototxt是demo所使用的prototxt文檔

  • c3d_pre_trained_model:

    下載的C3D預訓練模型,如conv3d_deepnetA_sport1m_iter_1900000

  • gpu_id:

    GPU ID,從0開始。設為-1則使用CPU

  • mini_batch_size:

    批處理大小。默認值為50。根據GPU的性能修改。

  • number_of_mini_batches

    批處理數量。

    如果有100個clips,<mini_batch_size>設置為50,則<number_of_mini_batches>為2。

    如果有101個clips,<mini_batch_size>設置為50,則<number_of_mini_batches>為3。

    (就是ceil除法嘛)

  • output_prefix_file:

    輸出前綴文件

  • feature_name1:

    特征名。(參見.prototxt文件的layers, 如 fc6-1, fc7-1, fc8-1, pool5, conv5b, prob,…)

example中的命令行如下:

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

 

其他注意事項

輸出的特征文件所保存的路徑必須自己生成,C3D不會創建文件夾

如果提示“out of memory” 可以嘗試減小batch size

提取的特征是二進制文件,需要進行格式轉換才能正常處理

其他的注意事項可以參考官方的用戶指南

問題及解決方法:

1. 運行成功但無法得到輸出特征

完全按demo的路徑配置一遍即可

2. 使用多batch提大量視頻的特征

F0914 17:45:44.359544 287137792 video_data_layer.cpp:123] Check failed: read_status Testing must not miss any example

暫時的解決辦法是設batchsize為1,將input_list和output_prefix切分為batch大小,一次一batch跑

1 frame_num=100000
2 for((i=1;i<=frame_num;i=i+50))
3 do 
4     j=49
5     num=$(($i+$j))
6     sed -n ''$i','$num'p' prototxt/input_list_frm.txt > prototxt/tmp_input_list_frm.txt
7     sed -n ''$i','$num'p' prototxt/output_list_prefix.txt > prototxt/tmp_output_list_prefix.txt
8     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/tmp_output_list_prefix.txt fc6-1
9 done

 參考:

https://annazhou.github.io/2015/12/09/c3d/

https://www.cnblogs.com/yaoyaoliu/p/6929234.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM