論文閱讀筆記: 2016 ECCV Temporal Segment Networks: Towards Good Practices for Deep Action Recognition
部落格位址
論文位址
Github位址
- 論文閱讀筆記 2016 ECCV Temporal Segment Networks Towards Good Practices for Deep Action Recognition
- 主要思想
- 網絡結構
- 正則化技術
- 資料增強
- 測試網絡
- 相關實驗
- Temporal Segment Networks
- 配置安裝
- Demo testing
- Demo training
- Demo 單視訊測試
本部落客要學習介紹2016 ECCV的一篇文章,這篇文章用于行為識别,來自瑞士蘇黎世聯邦理工大學計算機視覺實驗室
主要思想
設計了一個時間分割網絡 Temporal Segment Network(TSN),一種特定的基于長範圍時間結構的用于視訊動作識别的網絡。模型結合了稀疏時間采樣政策和視訊等級監督方法,可以使用整體的動作視訊進行便捷和有效的學習。
實驗結果:在HMDB51(69.4%)和UCF101(94.2%)資料集上達到了目前最好的性能。
解決問題:如何設計一種有效的基于視訊的網絡結構能夠學習視訊的表現進而捕捉 long-range 時間結構。如何在有限的訓練樣本下學習卷積神經網絡模型。
網絡結構
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5ibvdWa5AzbuBjMqBDd0BHO5EmewZWM5xWN0YTNhNWNi9CXwkjN312Lc52YucWbpFmbpNnLyg3dvw1LcpDc0RHaiojIsJye.jpg)
對于一個輸入的視訊,将被分成K(k=3)個segments,從每個segment中随機地選擇一個short snippet。将選擇的snippets通過two-stream卷積神經網絡得到不同snippets的class scores,最後将它們融合。不同片段的類别得分采用段共識函數(The segmental consensus function)進行融合來産生段共識(segmental consensus),這是一個視訊級的預測。然後對所有模式的預測融合産生最終的預測結果。(這種方法大大降低了計算開銷)
網絡的具體思路:實驗中設定片段的數量為 3;從每個序列中随機采樣得到片段序列,随後輸入卷積網絡得到對應的得分,運用平均均值的聚合方法推斷類别得分,獲得相應的結果(使用Softmax函數);使用标準分類交叉熵損失(cross-entropy loss),随機梯度下降法(SGD)訓練網絡.
我們選擇 Batch Normalization(BN)-Inception 結構設計 two-stream 卷積神經網絡,由于它在準确率和效率之間有比較好的平衡。空間 stream 卷積神經網絡作用在 single RGB images,時間 stream 卷積神經網絡以 stacked optical flow field 作為輸入。
正則化技術
在學習過程中,Batch Normalization 将估計每個 batch 内的激活均值和方差,并使用它們将這些激活值轉換為标準高斯分布。這一操作雖可以加快訓練的收斂速度,但由于要從有限數量的訓練樣本中對激活分布的偏移量進行估計,也會導緻過拟合問題。是以,在用預訓練模型初始化後,當機所有 Batch Normalization 層的均值和方差參數,但第一個标準化層除外。由于光流的分布和 RGB 圖像的分布不同,第一個卷積層的激活值将有不同的分布,于是,我們需要重新估計的均值和方差,稱這種政策為部分 BN。
與此同時,在 BN-Inception 的全局 pooling 層後添加一個額外的 dropout 層,來進一步降低過拟合的影響。dropout 比例設定:空間流卷積網絡設定為0.8,時間流卷積網絡設定為0.7。
資料增強
資料增強能産生不同的訓練樣本并且可以防止嚴重的過拟合。在傳統的 two-stream 中,采用随機裁剪和水準翻轉方法增加訓練樣本。作者采用兩個新方法:角裁剪(corner cropping)和尺度抖動(scale-jittering)。
角裁剪(corner cropping):僅從圖檔的邊角或中心提取區域,來避免預設關注圖檔的中心。
尺度抖動(scale jittering):将輸入圖像或者光流場的大小固定為 ,裁剪區域的寬和高随機從 中選擇。最終,這些裁剪區域将會被 resize 到 用于網絡訓練。事實上,這種方法不光包括了尺度抖動,還包括了寬高比抖動。
測試網絡
由于在 TSN 中片段級的卷積網絡共享模型參數,是以學習到的模型可以進行幀評估。具體來說,作者采用與 two-stream 相同的測試方案——即從動作視訊中采樣25個RGB幀或光流堆。同時,從采樣得到的幀中裁剪4個邊角和1個中心以及它們的水準翻轉來評估卷積網絡。為了根據訓練測試模型,在Softmax之前融合了25幀和不同流的預測分數。
空間和時間流網絡采用權重平均的方式進行融合。相比于 two-strean,TSN 中空間流卷積網絡和時間流卷積網絡的性能差距大大縮小。基于此,設定空間流的權重為1,設定時間流的權重為1.5。當正常和扭曲光流場都使用時,将其權重1.5分出1給正常光流場,0.5給扭曲光流場。
相關實驗
UCF101資料集包含13,320個視訊剪輯,其中共101類動作。HMDB51資料集是來自各種來源的大量現實視訊的集合,比如:電影和網絡視訊,資料集包含來自51個動作分類的6,766個視訊剪輯。
用在ImageNet上預訓練的模型對網絡權重進行初始化。實驗中 learning rate 設定較小:對于空間網絡,初始化為0.01,并且每2,000次疊代降為它的0.1 ,訓練過程共疊代4,500次;對于時間網絡,初始化為0.005,并且在第12,000和18,000次疊代之後降為它的 0.1,訓練過程共疊代20,000次。
在UCF101 split 1上對不同訓練政策進行實驗的結果:
由上表可以看出,從零開始訓練比基線算法(two-stream卷積網絡)的表現要差很多,證明需要重新設計訓練政策來降低過拟合的風險,特别是針對空間網絡。對空間網絡進行預訓練、對時間網絡進行交叉輸入模式預訓練,取得了比基線算法更好的效果。之後還在訓練過程中采用部分 BN dropout 的方法,将識别準确率提高到了 92.0%。
不同輸入模式的表現比較
由上表可以看出:首先,RGB圖像和RGB差異的結合可以将識别準确率提高到87.3%,這表明兩者的結合可以編碼一些補充資訊。光流和扭曲光流的表現相近(87.2% vs 86.9%),兩者融合可以提高到87.8%。四種模式的結合可以提高到91.7%。由于RGB差異可以描述相似但不穩定的動作模式,作者還評估了其他三種模式結合的表現(92.3% vs 91.7%)。作者推測光流可以更好地捕捉運動資訊,而RGB差異在描述運動時是不穩定的。在另一方面,RGB差異可以當作運動表征的低品質、高速的替代方案。
TSN不同段共識函數的實驗結果
由上表可以看出:平局池化函數達到最佳的性能。是以在接下來的實驗中選擇平均池化作為預設的聚合函數。
在不同深度卷積網絡上的實驗結果
具體來說,比較了3個非常深的網絡架構:BN-Inception、GoogLeNet和VGGNet-16。在這些架構中,BN-Inception表現最好,故選擇它作為TSN的卷積網絡架構。
Temporal Segment Networks
2016年的 ECCV: Temporal Segment Networks: Towards Good Practices for Deep Action Recognition
官方首頁
配置/安裝
下載下傳github原始檔案并編譯安裝.注意:此處編譯OpenCV2.4.13\dense_flow\Caffe.
git clone --recursive https://github.com/yjxiong/temporal-segment-networks
bash build_all.sh
随後,我們擷取了視訊資料(UCF101/HMDB51)和預訓練模型.
提取圖像幀以及提取光流資訊;
bash scripts/extract_optical_flow.sh SRC_FOLDER OUT_FOLDER NUM_WORKER
Demo – testing
執行代碼如下:
python tools/eval_net.py ucf101 1 rgb \
/home/ling/YH/work/Action_Recognition/dataset/UCF-101-flow \
models/ucf101/tsn_bn_inception_rgb_deploy.prototxt \
models/ucf101_split_1_tsn_rgb_reference_bn_inception.caffemodel \
--num_worker 1 \
--save_scores /home/ling/YH/work/Action_Recognition/temporal-segment-networks/result/RGB_SCORE_FILE_ucf101_split_1
通過代碼:
python tools/eval_scores.py SCORE_FILE
可以得到對應的結果
Accuracy 86.02% (ucf101 1 rgb)
Accuracy 84.96% (ucf101 2 rgb)
Accuracy 84.55% (ucf101 3 rgb)
Accuracy 85.10% (UCF101 3 Splits Average)
Demo – training
執行代碼如下:提取結果将被放置在檔案夾data/下,檔案名為
ucf101_rgb_train_split_1.txt
,形式為
video_frame_path 100 10
(路徑,視訊提取幀數,類别數)
随後,我們訓練網絡:
訓練結果如下所示:
# ucf101_rgb_split1
Iteration , Testing net (#0)
I0402 :: solver.cpp:] Test net output #0: accuracy = 0.836842
I0402 :: solver.cpp:] Test net output #1: loss = 0.698602 (* 1 = 0.698602 loss)
**Accuracy % (UCF101 Splits Average)**
Demo – 單視訊測試
為了後續友善處理,我們這裡對檔案進行了相應的修改,進而可以進行單視訊測試,修改如下:(這裡,我們緊緊針對在 rgb 1 上進行修改)
首先:修改/data/ucf101_splits/檔案夾中的測試集01
testlist01.txt
,将其修改為你需要測試的單一視訊,如:
HandstandWalking/v_HandstandWalking_g07_c04.avi
接下來,修改/data/檔案夾中的檔案
ucf101_rgb_val_split_1.txt
,将将其修改為你需要測試的單一視訊幀,如:
dataset/v_HandstandWalking_g07_c04 192 37
(這些檔案是在 training 開始階段産生的,請看上邊的代碼)
随後,制作資料集 dataset:dataset中隻包括你的視訊幀檔案,如:
dataset/v_HandstandWalking_g07_c04 192 37
最後,進行測試,測試代碼示例如下:
python tools/eval_net.py ucf101 rgb \
dataset \ # 制作資料集位置
models/bn_inception_kinetics_rgb_pretrained/bn_inception_rgb_deploy.prototxt \ # 模型
single_test/ucf101_kinetics_rgb_split1_iter_6500.caffemodel \ # 模型參數
--num_worker \ # GPU個數
--save_scores result/Kinetics_RGB_re_bn_SCORE_FILE_ucf101_split_1 # 存放結果