本文來自:blog.aistudyclub.com
隨著短視頻應用火爆全網(wǎng),現(xiàn)在各種短視頻已經(jīng)占據(jù)了全網(wǎng)50%以上的流量讲仰,那么如何對短視頻分類就成了一個問題谜诫。目前漾峡,我們使用卷積網(wǎng)絡可以有效的對圖片進行分類,同時精度也比較高喻旷。那么神經(jīng)網(wǎng)絡是否可以對視頻分類呢生逸?答案是肯定的,本文帶你使用ResNet3D網(wǎng)絡來完成視頻分類任務且预。
本文對ResNet3D論文解讀和復現(xiàn)槽袄,ResNet3D網(wǎng)絡主要內(nèi)容出自以下兩篇論文:
《Can Spatiotemporal 3D CNNs Retrace the History of 2D CNNs and ImageNet?》
《Would Mega-scale Datasets Further Enhance Spatiotemporal 3D CNNs》
論文項目地址:
https://github.com/kenshohara/3D-ResNets-PyTorch
1.目標
這里我們先簡單介紹一下第一篇論文《Can Spatiotemporal 3D CNNs Retrace the History of 2D CNNs and ImageNet?》的目標。我們已經(jīng)知道CNN網(wǎng)絡在CV領域已經(jīng)取得了巨大的成功锋谐,在大量的圖片數(shù)據(jù)集下遍尺,比如ImageNet數(shù)據(jù)集,CNN網(wǎng)絡可以取得較高的精度怀估。那么使用目前已有的視頻數(shù)據(jù)集狮鸭,將現(xiàn)有的CNN網(wǎng)絡的2維卷積核調(diào)整為3維卷積核,是否有充足的數(shù)據(jù)可以滿足CNN網(wǎng)絡的訓練需求多搀?文中主要使用ResNet3D網(wǎng)絡對此進行了驗證歧蕉。
第二篇論文《Would Mega-scale Datasets Further Enhance Spatiotemporal 3D CNNs》是在第一篇的基礎上進行的工作,其目標是希望驗證超大規(guī)模的數(shù)據(jù)集是否可以增強CNN網(wǎng)絡的性能康铭。
2.工作內(nèi)容
在第一篇論文中惯退,論文作者發(fā)現(xiàn)只有在Kinetics400這種大規(guī)模數(shù)據(jù)集上,ResNet系列模型才能很好的收斂从藤。在UCF101催跪、HMDB-51和ActivityNet上模型都會出現(xiàn)過擬合的情況锁蠕,很難訓練出高精度的模型。在Kinetics400數(shù)據(jù)上懊蒸,隨著模型的深度增加荣倾,比如在ResNet152之后,精度提升就很微弱了骑丸。這里說明了如果有大規(guī)模的數(shù)據(jù)集是可以使用3D的CNN網(wǎng)絡進行訓練的舌仍。既然有了大規(guī)模數(shù)據(jù)集訓練好的模型,就可以在小規(guī)模的數(shù)據(jù)集上進行微調(diào)訓練通危,作者取得了不錯的結果铸豁。
第二篇論文在第一篇論文的基礎上,對不同的大規(guī)模數(shù)據(jù)集進行融合菊碟,得到了不同的組合超大規(guī)模的數(shù)據(jù)集节芥,分別訓練出不同層數(shù)ResNet3D網(wǎng)絡。保存模型權重可以作為預訓練權重逆害,在小規(guī)模數(shù)據(jù)集上進行微調(diào)訓練头镊,在不同數(shù)據(jù)集和模型上都得到了不同程度的精度提升。
3.模型結構
通常做圖像分類使用的ResNet網(wǎng)絡的卷積核一般只是在2D圖像上做滑動窗口忍燥,計算特征圖拧晕,卷積核的形狀一般為[out_channel, in_channel, W, H]隙姿。而在視頻分類任務中一般對網(wǎng)絡輸入的是視頻中的一段序列梅垄,比如16幀或32幀,這樣在原有WH維度上又增加了一個時間T的維度输玷,卷積核的形狀為 [out_channel, in_channel, T, W, H]队丝。這時,卷積核不止在2D平面上滑動欲鹏,還需要在第三個維度T上移動机久,提取幀之間的關聯(lián)特征。這樣就需要對2D的ResNet進行改造赔嚎,將其改造為3D的ResNet網(wǎng)絡膘盖。ResNet3D保持原有的ResNet的整體架構不變,替換每個block中的basicblock或bottleneckblock中的卷積核為Conv3D,同時池化層也需要替換為3D池化尤误。
整體網(wǎng)絡結構描述如下:
4.訓練方法
第一篇論文中在Kinetics400數(shù)據(jù)集上訓練使用寬和高均為112像素侠畔,16幀的RGB圖像作為輸入樣本。同時使用5種不同尺寸的裁剪方式對圖像進行隨機裁剪损晤,同時添加了隨機水平翻轉软棺,進行數(shù)據(jù)增強。使用交叉熵作為損失函數(shù)尤勋,同時使用SDG優(yōu)化器喘落,設置正則化系數(shù)為0.001茵宪,動量系數(shù)設置為0.9,起始學習率為0.1瘦棋。如果在10個epochs之后稀火,驗證集的損失沒有減小,則學習率除以10赌朋。在小數(shù)據(jù)集上進行模型微調(diào)時設置SDG優(yōu)化器學習率為0.001憾股,同時正則化系數(shù)設置為1e-5。同時作者在多次實驗得出結論:在訓練時箕慧,凍結前4個block服球,只微調(diào)第5個block和全連接層的權重可以得到更好的結果。
第二篇論文在第一篇論文訓練策略的基礎上進行了調(diào)整颠焦,因為是使用超大規(guī)模數(shù)據(jù)集對模型進行微調(diào)斩熊,所以其他參數(shù)不變,只是將SGD優(yōu)化器的起始學習率設置為0.003伐庭,正則化系數(shù)和動量系數(shù)保持0.001和0.9粉渠。
5.實驗結果
通過在多種超大規(guī)模數(shù)據(jù)集和多種模型結構組合訓練得出以下結果。
本次復現(xiàn)的條件和目標如下圾另,
預訓練模型:K+M數(shù)據(jù)集上的ResNet50預訓練權重
數(shù)據(jù)集:UCF-101
目標:Top1為92.9%
6.論文復現(xiàn)
項目地址:
https://github.com/txyugood/Paddle-3D-ResNets
1.下載解壓數(shù)據(jù)集
數(shù)據(jù)集地址數(shù)據(jù)集地址:
https://aistudio.baidu.com/aistudio/datasetdetail/48916
mkdir dataset/
unzip UCF-101.zip -d dataset/
2.視頻轉換為圖片
mkdir /home/aistudio/dataset/UCF-101-jpg/
cd Paddle-ResNets/ && python generate_video_jpgs.py /home/aistudio/dataset/UCF-101 /home/aistudio/dataset/UCF-101-jpg/ ucf101
3.轉換pytorch預訓練模型
pip install torch==0.4.1
cd Paddle-ResNets/model/ && python convert_to_paddle.py
4.訓練網(wǎng)絡
在訓練過程中進行clips準確率驗證霸株,并保存clips準確率最高的模型,最終clips準確率90%。
訓練方法:
訓練時開啟4進程讀取,將數(shù)據(jù)集分為4塊集乔,batch_size 為128去件,以異步方式讀取數(shù)據(jù)進行模型訓練。
每次迭代總訓練時間為2.3秒左右扰路,數(shù)據(jù)讀取時間為1.8秒左右尤溜,
CPU使用率已接近100%,內(nèi)存占用在80-90%之間汗唱。
GPU使用率50%,可見訓練瓶頸在CPU讀取數(shù)據(jù)部分宫莱,若CPU和內(nèi)存擴容,還可以繼續(xù)提升訓練速度哩罪。
訓練使用的優(yōu)化器為Momentum,學習率0.003授霸,momentun=0.9 L2Decay為0.001.
數(shù)據(jù)增強方式選擇RandomResizedCrop方式。
按照論文中提到的方法际插,凍結Resnet50網(wǎng)絡的conv1碘耳、conv2、conv3和conv4腹鹉,只訓練conv5和fc層藏畅。
cd Paddle-ResNets/ && python train.py
5.驗證網(wǎng)絡
按照論文的方法將視頻以16幀為一個clip進行分割,最后計算一個視頻的所有clips的平均值作為視頻的分類結果。
最后會生成val.json文件供計算top-1準確率使用愉阎。這里與pytorch版本代碼邏輯一致绞蹦。
cd Paddle-ResNets/ && python test.py
6.計算準確率
Top-1準確率為93.55% 超過論文中的92.9%。
cd Paddle-ResNets/ && python eval_accuracy.py
load ground truth
number of ground truth: 3783
load result
number of result: 3783
calculate top-1 accuracy
top-1 accuracy: 0.9355009251916468