『cs231n』視頻數據處理
視頻信息
和我之前的臆想不同,視頻數據不僅僅是一幀一幀的圖片本身,還包含個幀之間的聯系,也就是還有一個時序的信息維度,包含人的動作判斷之類的任務都是要依賴動作的時序信息的
視頻數據處理的兩種基本方法
- 使用3D卷積網絡引入時間維度:由於3D卷積網絡每次的輸入幀是有長度限定的,所以這種方法更傾向於關註局部(時域)信息的任務
- 使用RNN/LSTM網絡系列處理時序信息:由於叠代網絡的特性,它更擅長處理全局視頻信息
發散:結合兩種方法的新思路
上面的具體實現也未必需要3D卷積,畢竟遞歸網絡自己已經包含了時序信息了:
3D卷積神經網絡理解
1、3D卷積
3D卷積是通過堆疊多個連續的幀組成一個立方體,然後在立方體中運用
需要註意的是: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 a3-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』視頻數據處理