2017-03-06 89 views
7

我想預測給定N先前幀的(灰度)視頻的下一幀 - 在Keras中使用CNN或RNN。關於時間序列預測和Keras的大多數教程和其他信息在他們的網絡中使用一維輸入,但是我的將是3D (N frames x rows x cols)使用Keras進行視頻預測(時間序列)

我目前真的不確定這個問題的好方法是什麼。我的想法包括:

  • 使用一個或多個LSTM層。這裏的問題是,我不確定他們是否適合拍攝一系列圖像,而不是一系列標量作爲輸入。內存消耗是否會爆炸?如果可以使用它們:我如何在Keras中使用它們以獲得更高的尺寸?

  • 在輸入(先前視頻幀的堆疊)上使用3D卷積。這引發了其他問題:當我沒有進行分類而是預測時,爲什麼這會有所幫助?如何堆疊圖層使網絡輸入的尺寸爲(N x cols x rows)和輸出(1 x cols x rows)

我對CNN/RNN和凱拉斯很新,希望能夠向正確的方向提出任何建議。

回答

14

所以基本上每種方法都有其優點和缺點。讓我們去throught您所提供的關鍵字,然後等找到最好的辦法:

  1. LSTM:在其最大的優點是學習在你的數據長期dependiencies模式的能力。它們的設計是爲了能夠分析像例如演講或文字。這也可能會導致問題,因爲數字參數可能非常高。其他典型的經常性網絡體系結構(如GRU)可能會解決此問題。主要的缺點是,在標準(順序執行)中,將其應用於視頻數據是不可行的,這與密集層對於圖像數據不好的原因相同 - 時間和空間不變性的負載必須通過完全拓撲來學習不適合以有效的方式捕捉它們。將視頻按像素向右移動可能會完全改變網絡的輸出。

    其中值得一提的另一件事是,訓練LSTM被belived是類同找出兩個競爭過程之間的平衡 - 找到好的權重用於緻密狀輸出計算和找到一個很好的內存儲器動態在處理序列。找到這種平衡可能會持續很長時間,但一旦找到平衡 - 通常會非常穩定併產生非常好的結果。

  2. Conv3D:在他們最大的優點之一中,人們可以很容易地找到像在圖像情況下以與Conv2D相同的方式捕獲空間和時間不變性的能力。這使得維度的詛咒危害更小。另一方面 - 與Conv1D一樣,使用更長的序列可能不會產生好的結果 - 同樣的方式 - 缺少任何內存可能會使學習長序列變得更困難。

當然一項的可使用不同的方法,如:

  • TimeDistributed + Conv2D:使用TimeDistributed包裝 - 人們可以使用一些預訓練convnet像例如Inception framewise,然後順序分析功能圖。這種方法的一個巨大優勢是轉移學習的可能性。作爲一個缺點 - 人們可能會認爲它是一個Conv2.5D - 它缺乏對數據的時間分析。

  • ConvLSTM:這種架構還沒有通過的Keras最新的版本(3月6日2017)支持,但作爲一個可以看到here應該在未來提供。這是LSTMConv2D的混合物,它被認爲更好,然後堆疊Conv2DLSTM

  • 當然這些都不是解決這一問題的唯一辦法,我將提到一個更可能是有用的:

    1. 堆疊:一個可以容易地堆疊上層的方法,以建立他們的最終解決方案。例如。可以建立一個網絡,在這個網絡中,開始使用TimeDistributed(ResNet)轉換視頻,然後輸出到Conv3D,具有多個積極的空間池並最終由GRU/LSTM層轉換。

    PS:

    一兩件事,這也是值得一提的是,視頻數據的形狀其實4D(frames, width, height, channels)。

    PS2:

    在情況下,當你的數據實際上是3D(frames, width, hieght)你實際上可以使用經典Conv2D(通過改變channelsframes)來分析這些數據(實際上可能更有效的計算)。在傳輸學習的情況下,您應該添加額外的維度,因爲大多數CNN模型都訓練了形狀爲(width, height, 3)的數據。有人可能會注意到你的數據沒有3個通道。在這種情況下,通常使用的技術是重複空間矩陣三次。

    PS3:

    這種2.5D方法的一個例子是:

    input = Input(shape=input_shape) 
    base_cnn_model = InceptionV3(include_top=False, ..) 
    temporal_analysis = TimeDistributed(base_cnn_model)(input) 
    conv3d_analysis = Conv3D(nb_of_filters, 3, 3, 3)(temporal_analysis) 
    conv3d_analysis = Conv3D(nb_of_filters, 3, 3, 3)(conv3d_analysis) 
    output = Flatten()(conv3d_analysis) 
    output = Dense(nb_of_classes, activation="softmax")(output) 
    
    +0

    非常有用的信息,特別是TimeDistributed層。我的視頻數據的形狀是3D,因爲只有一個頻道,我應該重新塑造它嗎?另外,你可能會提供一些關於如何連接圖層的方法(僞)代碼?尺寸仍然讓我困惑。非常感謝你! – Isa

    +0

    我還有一些其他問題。僞代碼指的是nb_of_classes,但我不需要分類,但是需要在下一個時間步。有沒有更簡單的解決方案?我不需要轉移學習,但只需要一個簡單的網絡,取N個前面的幀並預測下一個幀。 – Isa

    +1

    我會回答明天嗎?好? –

    4

    做大量的研究之後,我終於偶然發現了Keras ExampleConvLSTM2D層(馬爾辛Możejko已經提到) ,這正是我所需要的。

    在當前版本的Keras(v1.2。2),該層已經包含並且可以使用

    from keras.layers.convolutional_recurrent import ConvLSTM2D 
    

    要使用該層被導入,所述視頻數據具有如下被格式化:

    [nb_samples, nb_frames, width, height, channels] # if using dim_ordering = 'tf' 
    [nb_samples, nb_frames, channels, width, height] # if using dim_ordering = 'th' 
    
    相關問題