1. 程式人生 > >『cs231n』視頻數據處理

『cs231n』視頻數據處理

return 分辨 learning 組成 tput sin con 自己 時間信息

視頻信息

和我之前的臆想不同,視頻數據不僅僅是一幀一幀的圖片本身,還包含個幀之間的聯系,也就是還有一個時序的信息維度,包含人的動作判斷之類的任務都是要依賴動作的時序信息的

視頻數據處理的兩種基本方法

技術分享

- 使用3D卷積網絡引入時間維度:由於3D卷積網絡每次的輸入幀是有長度限定的,所以這種方法更傾向於關註局部(時域)信息的任務

- 使用RNN/LSTM網絡系列處理時序信息:由於叠代網絡的特性,它更擅長處理全局視頻信息

技術分享

發散:結合兩種方法的新思路

技術分享

上面的具體實現也未必需要3D卷積,畢竟遞歸網絡自己已經包含了時序信息了:

技術分享

技術分享

3D卷積神經網絡理解

1、3D卷積

3D卷積是通過堆疊多個連續的幀組成一個立方體,然後在立方體中運用

3D卷積核。在這個結構中,卷積層中每一個特征map都會與上一層中多個鄰近的連續幀相連,因此捕捉運動信息。例如下圖,一個卷積map的某一位置的值是通過卷積上一層的三個連續的幀的同一個位置的局部感受野得到的。

需要註意的是:3D卷積核只能從cube中提取一種類型的特征,因為在整個cube中卷積核的權值都是一樣的,也就是共享權值,都是同一個卷積核(圖中同一個顏色的連接線表示相同的權值)。我們可以采用多種卷積核,以提取多種特征。

對於CNNs,有一個通用的設計規則就是:在後面的層(離輸出層近的)特征map的個數應該增加,這樣就可以從低級的特征maps組合產生更多類型的特征。

傳統的2D卷積方法是用一個2維的卷積層對特征圖進行采樣,從而得到下一層的特征圖,形式如下:

技術分享

那麽3D就是額外增加了一個時間維度,即對一定數量幀的圖片,用同一個3維的卷積層去采樣,從而得到下一維的特征圖,形式如下:

技術分享

多出來的那個Ri,即是3維卷積核在時間維度上的長度。

有了這個基礎,論文Learning Spatiotemporal Features with 3D Convolutional Networks則是進一步探尋了這種3D時間卷積的實用性,用實驗證明,3*3*3的時空卷積核,是最適合於這種新型神經網絡結構的卷積核。

技術分享技術分享

TensorFlow中的3D卷積層&池化層

tf.nn.conv3d(input, filter, strides, padding, name=None)

Computes a 
3-D convolution given 5-D input and filter tensors. In signal processing, cross-correlation is a measure of similarity of two waveforms as a function of a time-lag applied to one of them. This is also known as a sliding dot product or sliding inner-product. Our Conv3D implements a form of cross-correlation. Args: input: A Tensor. Must be one of the following types: float32, float64, int64, int32, uint8, uint16, int16, int8, complex64, complex128, qint8, quint8, qint32, half. Shape [batch, in_depth, in_height, in_width, in_channels]. filter: A Tensor. Must have the same type as input. Shape [filter_depth, filter_height, filter_width, in_channels, out_channels]. in_channels must match between input and filter. strides: A list of ints that has length >= 5. 1-D tensor of length 5. The stride of the sliding window for each dimension of input. Must have strides[0] = strides[4] = 1. padding: A string from: "SAME", "VALID". The type of padding algorithm to use. name: A name for the operation (optional). Returns: A Tensor. Has the same type as input. tf.nn.avg_pool3d(input, ksize, strides, padding, name=None) Performs 3D average pooling on the input. Args: input: A Tensor. Must be one of the following types: float32, float64, int64, int32, uint8, uint16, int16, int8, complex64, complex128, qint8, quint8, qint32, half. Shape [batch, depth, rows, cols, channels] tensor to pool over. ksize: A list of ints that has length >= 5. 1-D tensor of length 5. The size of the window for each dimension of the input tensor. Must have ksize[0] = ksize[4] = 1. strides: A list of ints that has length >= 5. 1-D tensor of length 5. The stride of the sliding window for each dimension of input. Must have strides[0] = strides[4] = 1. padding: A string from: "SAME", "VALID". The type of padding algorithm to use. name: A name for the operation (optional). Returns: A Tensor. Has the same type as input. The average pooled output tensor.

tf.nn.max_pool3d(input, ksize, strides, padding, name
=None) Performs 3D max pooling on the input. Args: input: A Tensor. Must be one of the following types: float32, float64, int64, int32, uint8, uint16, int16, int8, complex64, complex128, qint8, quint8, qint32, half. Shape [batch, depth, rows, cols, channels] tensor to pool over. ksize: A list of ints that has length >= 5. 1-D tensor of length 5. The size of the window for each dimension of the input tensor. Must have ksize[0] = ksize[4] = 1. strides: A list of ints that has length >= 5. 1-D tensor of length 5. The stride of the sliding window for each dimension of input. Must have strides[0] = strides[4] = 1. padding: A string from: "SAME", "VALID". The type of padding algorithm to use. name: A name for the operation (optional). Returns: A Tensor. Has the same type as input. The max pooled output tensor.

2、3D卷積神經網絡架構

文中的3D CNN架構包含一個硬連線hardwired層、3個卷積層、2個下采樣層和一個全連接層。每個3D卷積核卷積的立方體是連續7幀,每幀patch大小是60x40,架構如下:

技術分享

在第一層,我們應用了一個固定的hardwired的核去對原始的幀進行處理,產生多個通道的信息,然後對多個通道分別處理。最後再將所有通道的信息組合起來得到最終的特征描述。這個實線層實際上是編碼了我們對特征的先驗知識,這比隨機初始化性能要好對於這個做法(原文“相比於隨機初始化,通過先驗知識對圖像的特征提取使得反向傳播訓練有更好的表現”),梯度表征了圖像的邊沿的分布,而光流則表征物體運動的趨勢,3D卷積通過提取這兩種信息來進行行為識別。,每幀提取五個通道的信息分別是:灰度、x和y方向的梯度,x和y方向的光流。其中,前面三個都可以每幀都計算。然後水平和垂直方向的光流場需要兩個連續幀才確定。所以是7x3 + (7-1)x2=33個特征maps。

技術分享

然後我們用一個7x7x3的3D卷積核(7x7在空間,3是時間維)在五個通道的每一個通道分別進行卷積。為了增加特征map的個數(實際上就是提取不同的特征),我們在每一個位置都采用兩個不同的卷積核,這樣在C2層的兩個特征maps組中,每組都包含23個特征maps。23是(7-3+1)x3+(6-3+1)x2前面那個是:七個連續幀,其灰度、x和y方向的梯度這三個通道都分別有7幀,然後水平和垂直方向的光流場都只有6幀。54x34是(60-7+1)x(40-7+1)。

在緊接著的下采樣層S3層max pooling,我們在C2層的特征maps中用2x2窗口進行下采樣,這樣就會得到相同數目但是空間分辨率降低的特征maps。下采樣後,就是27x17=(52/2)*(34/2)。

C4是在5個通道中分別采用7x6x3的3D卷積核。為了增加特征maps個數,我們在每個位置都采用3個不同的卷積核,這樣就可以得到6組不同的特征maps,每組有13個特征maps。13是((7-3+1)-3+1)x3+((6-3+1)-3+1)x2前面那個是:七個連續幀,其灰度、x和y方向的梯度這三個通道都分別有7幀,然後水平和垂直方向的光流場都只有6幀。21x12是(27-7+1)x(17-6+1)。

S5層用的是3x3的下采樣窗口,所以得到7x4。

技術分享

到這個階段,時間維上幀的個數已經很小了, (3 for gray, gradient-x, gradient-y, and 2 for optflow-x and optflow-y)。在這一層,我們只在空間維度上面卷積,這時候我們使用的核是7x4,然後輸出的特征maps就被減小到1x1的大小。而C6層就包含有128個特征map,每個特征map與S5層中所有78(13x6)個特征maps全連接,這樣每個特征map就是1x1,也就是一個值了,而這個就是最終的特征向量了。共128維。

技術分享

經過多層的卷積和下采樣後,每連續7幀的輸入圖像都被轉化為一個128維的特征向量,這個特征向量捕捉了輸入幀的運動信息。輸出層的節點數與行為的類型數目一致,而且每個節點與C6中這128個節點是全連接的。

在這裏,我們采用一個線性分類器來對這128維的特征向量進行分類,實現行為識別。

模型中所有可訓練的參數都是隨機初始化的,然後通過BP訓練。

後面還有一些其他的處理,不過對於理解3D卷積意義不大了,不再贅述,有興趣的自行查閱相關文章吧(cs231n課件上引用論文圖時均給出了出處)

2、雙流神經網絡(了解發展脈絡)

時間軸:時間+空間雙流神經網絡 -> 16年CVPR的3D卷積+雙流網絡

Two-Stream Convolutional Networks for Action Recognition in Videos提出的是一個雙流的CNN網絡,分別捕捉空間和時間信息

3D Convolutional Neural Networks for Human Action Recognition提出了3D卷積方法

Convolutional Two-Stream Network Fusion for Video Action Recognition在原雙流論文的基礎上做了改進

在原雙流論文中,時間和空間兩個神經網絡的融合是在最後一步,結果取平均值或者用線性SVM劃分,而在本文中,則是把兩個神經網絡在某一層融合,如下圖: 技術分享

左邊是單純在某一層融合,右邊是融合之後還保留時間網絡,在最後再把結果融合一次。論文的實驗表明,後者的準確率要稍高。

融合的前提要求是,在這一層,空間與時間網絡的特征圖長寬相等,且channel數一樣(channel在很多論文都有提及,暫時的理解是,channel就代表對應的卷積層中,特征圖的個數,因為對上一層輸入的特征圖,每用一個卷積核,就會產生一個新的特征圖,所以需要一個channel來統計總共產生了多少特征圖)。具體融合方法很多,詳見論文即可。

在把兩個網絡的特征圖融合後,還需要進行另一次卷積操作。假設在時間t,我們得到的特征圖是xt,那麽對於一大段時間t=1….T,我們要把這段時間內的所有特征圖(x1,…,xT)綜合起來,進行一次3D時間卷積,最後得到的,就是融合後的特征圖輸出。註意,此時輸出的,仍然是一系列在時間上的特征圖。然後再輸入到更高層網絡,繼續訓練學習。

『cs231n』視頻數據處理