1. 程式人生 > >在Keras 和 Tensorflow 框架下五種視訊分類的實施方法

在Keras 和 Tensorflow 框架下五種視訊分類的實施方法

本文是翻譯一篇大神的文章,點選檢視原文,可能需要VPN才能檢視。

  目前視訊分類是機器學習模式中獨樹一幟的挑戰。今天我們就要來看看在Keras 和 Tensorflow 框架下的不同的視訊行為識別策略,我們將會學著如何使用五深度學習的模式去學習UCF101資料組,具體程式碼在GitHub,有需要可以下載來看看

視訊分類的方法:

  我們將會輪流講述這五種方法來看看哪一個能夠達到最好的效果,我們會檢驗top1和top5的準確率(top5表示前五個的概率排名,這裡採用的資料組就是UCF101):
1、用Convnet逐一劃分幀
2、在一個網路中用一個時間分散式的Convnet並且傳遞這樣的特徵給RNN
3、使用3D的卷積網路
4、用Convnet從每一幀中提取特徵,並且傳遞這個特徵序列給另一個RNN
5、用Convnet從每一幀中提取特徵,並且傳遞這個特徵序列給另一個MLP

約束

  每個方法都有很多不同的拓展,所以我們將會利用一些約束來幫助簡化他們,也同樣減小將來應用在實際系統中的計算複雜性。
1、我們將不會用光流影象,我們考慮他們減弱了模型的複雜性、訓練時間和超引數的整體負荷力度
2、每個視訊將會被下采樣到40幀,所以在41到500幀的視訊都會通過基本的快進被減少到40幀之內
3、我們不會採用個多預處理的方式,視訊分類通常的預處理步驟是減少中間值,但是我們將會保持它從頭到尾的原始性
4、在新的 AWS p2.xlarge的例項中,每個模式必須要適用於12GiB的運存空間的GPU
  利用這些約束,我們不會達到最好的94%的準確率,但是我們可以知道我們是否找對了方向

資料準備:

  我們首先需要做的就是獲取一個我們能夠訓練的資料集。我們需要完成下面的步驟:
1、區分檔案為訓練集還是測試集的檔案
2、提取每個視訊中的每一幀的JPEG圖片
3、利用CSV方式(觀察全部的訓練過程的方式)通過視訊型別、訓練集或測試集狀態、幀數去概括這些視訊。
  需要注意的一點是,訓練集中有很多的視訊是很相似的。也就是說多個視訊可能出現相同的人在相同的角度上有相同的動作。所以我們需要注意不要因為效果很好而停止探索,這有可能是訓練集和測試集有相同的視訊導致的。
  我們就用UCF提供的三種訓練和測試集推薦分類,為了節省時間,我們僅僅使用第一個分類來進行我們的實驗。

關於下列圖表的註釋:

  每個圖表包括三個系列:
1、只用CNN,top1的準確率用紅線表示(通常作為基準線)。
2、綠色為top5的絕對準確率
3、藍色為top1的絕對準確率

方法零:隨機猜測或者總是選擇最普遍的

  這不是一個真正的方法,但是如果我們的模型不能找到比隨機的或者最常用的方法更好的結果,我們就走錯了方向。
  試著進行隨機分來,準確率只有0.9%。得出這個結果是因為有101個分類···再加上數學的計算
  如果總是選擇最普遍的類似於“網球擺動”(一個實驗),它的準確率是1.32%。同樣是因為網球擺動的成功例子是我們資料集的1.32%。這至少證明我們找對了方向,並且能夠找到一些結果,接下來一起建立一些模型吧。

方法一:用CNN逐一給幀進行分類

  首要的方法,我們將忽略視訊的時間特徵,然後試著觀察每一次幀的內容來分類。使用CNN,AKA ConvNet。更具體的說,我們將會採用Inception-V3,pre-trained on ImageNet這篇文章的內容
  我們將會使用遷移學習來過載訓練我們的資料。這有兩個步驟:
  首先,我們調整最密集的那一層訓練10次(每次訓練10240個影象),在進入深層之前調整最頂層讓其儘可能保持以前的學習狀態。奇怪的是,在這些層上訓練時我們沒有看到任何可觀的準確率。但是沒事,inception blocks是很難的部分,能做好這個就基本成功了。
  第二,我們重新學習最上面的兩層的inception blocks,訓練70次,我們可以看出來,結果達到了65%的準確率。
這裡寫圖片描述

top1top5
  值得注意的是我們逐一地觀察每個獨立的幀影象,並且僅僅基於一幀的內容給整個視訊進行分類。我們沒有觀察所有的幀並且做任何的平均值或者最大值分類。
  讓我們從測試集中隨機檢測幾個樣本圖片,看看我們是怎麼做的:
我們並沒有看到
預測:跳高:0.37,體操:0.14,罰點球:0.09  實際上:玩兒雙節棍   結果:失敗
這裡寫圖片描述
預測:牆壁俯臥撐:0.67,拳擊吊帶:0.09,雜耍球:0.08  實際上:牆壁俯臥撐   結果:第一個成功
這裡寫圖片描述
預測:擊鼓:1   實際上:牆壁俯臥撐   結果:第一個成功
這裡寫圖片描述
預測:倒立行走:0.32,雙節棍:0.16,跳繩:0.11  實際上:跳繩   結果:前五個中有成功

最後我們得出測試準確率:~65% top 1, ~90% top 5

方法二:在一個網路中,用時間分散式的CNN,傳遞這個特徵給一個RNN

  現在,我們有一個良好的開端,我們將會轉換模型,考慮把視訊的時間特徵考慮在內。在這個網路的第一層,我們將會採用Kera的非常好用的TimeDistributed封裝,它可以允許我們分配一個CNN在時間維度上的層
  在這個模型的ConvNet 部分,我們將會用一個很小的VGG16-style網路。理想中,我們在這個部分用了一個更深的的網路,但是我們將必須要給GPU過載所有的記憶體,我們的選擇是相當有限的。
  RNN的網路部分,我們使用三層的GRU,每層由128個節點組成,兩層之前0.2的流失率。
  不像方法一我們使用預先訓練好的ImageNet權重,這裡我們必須在我們的資料上從頭開始訓練我們的模型。這將意味著我們需要大量的引數或者更大的網路來達到相同的準確率作為Inception模組的產出。然而這也意味著我們的CNN權重將會沿著RNN的每一個反向傳遞而更新。讓我們來看看:
這裡寫圖片描述

top5top1

  最終的測試結果: 20% top 1, 41% top 5

方法三:用3D卷積網路

  所以從頭開始一起訓練一個CNN和一個LSTM對我們沒有多大用處。那3D卷積網路怎麼樣呢?
  對於視訊分類來說,3D ConvNets是一個明顯的選擇,因為他們在三維空間(在我們的案例中第三維是時間維度)固有地運用卷積(和最大的池化)。(從技術上講,這是4D,因為我們2D影象是代表了3D的向量,但是網路最終的結果是一樣的)
  然而,他們有相同的缺點:方法二的記憶體!在 Learning Spatiotemporal Features with 3D Convolutional Networks中,作者設定一個叫C3D的網路對於UCF101達到52.8%的準確率。我很想試著去複製這些結果,但是因為GPU的記憶體限制停止了。簡單的C3D都不能執行,即使是我砍掉了一層又一層。
  換計劃,我設計了一個更小的模型(只有三個3D的卷積),逐漸增大節點數量,從32到64再到128。:
這裡寫圖片描述
  在28次訓練之後,我們甚至還不能達到我們設定的Inception的基準線。我把學習率從5e-5減到了1e-6,並且再多加了30次訓練(沒上圖表),這樣會變得好一點,但是仍然沒有比較好的結果。
  可能從頭到尾的訓練這條路不好走,我們還是另闢蹊徑吧。

  最終的測試結果:28% top 1, 51% top 5

方法四:用CNN提取特徵傳遞序列給分離式的RNN

  既然Inception模組分類影象時做的很好,那我們為何不試著利用這個學習呢?在這個方法中,我們將會使用Inception模組的網路在視訊中提取特徵,並且傳遞給RNN。這需要兩步驟:
  第一:我們通過Inception模組遍歷視訊所有的幀,然後儲存最後網路中的池化層的輸出。我們能夠有效地去掉網路中的top分類,以便我們最後能夠得到一個2048維的特徵向量傳遞給我們的RNN。想了解更多,看之前文章 blog post on continuous video classification
  第二,我們轉變那些提取的特徵到序列中。如果你想起我們的約束,我們可以把每個視訊轉變成一個40幀的序列。所以我們把這40幀的樣本拼接起來,並且儲存到硬碟中,這樣我們在訓練不同的RNN網路模型時,每當我們讀取相同的樣品或者訓練一個全新的網路架構,就不需要連續不斷地傳遞我們的影象給CNN了。
  在RNN中,我們使用單獨的4096寬的LSTM層,緊接一個1024密度的層並且附帶一定的層間流失率。我試過,這個相當的淺層的網路勝過所有的多倍堆積的LSTMs。下面是做的結果:
這裡寫圖片描述

方法五:從每幀影象中用CNN提取特徵然後傳遞這些特徵序列給一個MLP

  我們採用同之前一樣的方法用CNN提取過程,但是我們不會把序列傳遞給RNN,我們將平滑序列,然後把新的輸入向量(2048*40)傳遞給一個全連線的網路,名叫MLP(multilayer perceptron)。
我們假設MLP能夠在不知道它是序列的情況下從序列的有機結合中推斷出時間特徵。
  在嘗試了一些深的、淺的、寬的、窄的網路之後,我們發現效能最好的MLP是一個簡單的兩層網路,每層有512個神經元:
這裡寫圖片描述
  另一個打敗只有CNN基準的方法!但是幾乎沒有和RNN做的一樣好的。我的直覺告訴我,在這個引數調整上可以做得更好。對於大多數的方法,我只給出了我們效果比較好的網路的結果,在MLP中,當我們嘗試更深的和更寬的網路的時候我們發現,top1的準確率很不確定,但是top5的準確率都快好的爆表了。這是4層的,2048寬的MLP:
這裡寫圖片描述
這個top5的準確率非常完美,但是並不是很符合題意。

最終結果:70% top 1, 88% top 5

最終勝出的是······

  用Inception ConvNet來提取特徵,緊接一個單層的LSTM的RNN!
  總結:在UCF101中74%準確率不是最好的,目前我所能達到最好的是94%。但是,隨著一個視訊流(不是光流模型)預處理的減少,記憶體的限制和非常小的引數調整,我想我們已經列出了一些深入研究這五種分類方法的大體框架。
  我從這項研究中得出的主要結論是,卷積網路在廣泛的任務中是多麼強大。(這句真沒看懂)……當只看單個的影象在65%的準確率是令人很吃驚的。使用這種方法為其他的模型提取圖片可以得到滿意的結果並且利用的記憶體也很少。
  第二個結論是我做了很多的工作。這使我感到很舒服,我也希望這篇文章可以給你很好的想法並且能夠激勵很多人去更好地探索視訊分類的世界

具體程式碼在GitHub,有需要可以下載來看看

相關推薦

Keras Tensorflow 框架視訊分類實施方法

本文是翻譯一篇大神的文章,點選檢視原文,可能需要VPN才能檢視。   目前視訊分類是機器學習模式中獨樹一幟的挑戰。今天我們就要來看看在Keras 和 Tensorflow 框架下的不同的視訊行為識別策略,我們將會學著如何使用五深度學習的模式去學習UCF10

ResNet在分別在Kerastensorflow框架的應用案例

一、殘差神經網路——ResNet的綜述 深度學習網路的深度對最後的分類和識別的效果有著很大的影響,所以正常想法就是能把網路設計的越深越好, 但是事實上卻不是這樣,常規的網路的堆疊(plain network)在網路很深的時候,效果卻越來越差了。其中原因之一 即是網路越深

L1 , L2 Loss 函式Regularization,及其在Tensorflow框架的實現

首先講下L1 L2損失: 可以參考下這個: Differences between l1 and l2 as loss function and regularization 在機器學習的學習過程中,你可能會選擇使用L1 或 L2。通常這兩個決定是: 1

在pycharmtensorflow環境運行nmt

light enc -o arm mas 環境 編譯 -- charm 目的是在pycharm中調試nmt代碼,主要做了如下工作: 配置pycharm編譯環境 在File->Settings->Project->Project Interpreter 設置

KerasTensorFlow之爭何時休?

實際上,到 2017 年中,Keras 已經被大規模採用,並與 TensorFlow 整合在一起。這種 TensorFlow + Keras 的組合讓你可以:  ●  使用 Keras 的介面定義模型;  ●  如果你需要特定的 TensorFl

使用KerasTensorflow設定安裝Mask RCNN(demo執行)

參考: https://blog.csdn.net/wc781708249/article/details/79438972 Mask RCNN paper: https://arxiv.org/pdf/1703.06870.pdf video 概述如何安裝 Step 1: cr

Tensorflow框架

本章是對前五章的總結 一、概述 Tensorflow框架的核心概念是計算圖:   整個計算流圖的主要包含以下幾個部分: 匯入資料 網路結構 損失函式 反向傳播 由於Tensorflow框架的機制,反向傳播過程並不需要我

kerastensorflow的關係

TensorFlow是最著名的用於深度學習生產環境的框架。它有一個非常大非常棒的社群。然而,TensorFlow的使用不那麼簡單。另一方面,Keras是在TensorFlow基礎上構建的高層API,比TF(TensorFlow的縮寫)要易用很多。 Keras的底

keras tensorflow 構建手寫字識別神經網路

#匯入資料 import numpy as np import tensorflow as tf import matplotlib.pyplot as plt from keras.datasets import mnist (train_images, train_labels), (test_i

tensorflow2caffe(3) : 如何將tensorflow框架訓練得到的權重轉化為caffe框架的權重引數

   在前兩期專欄tensorflow2caffe(1)和tensorflow2caffe(2)中,筆者向大家介紹了caffemodel檔案型別下的引數架構和如何取出tensorflow框架下訓練引數。在本期中,筆者將向大家闡述,如何去將tensorflow框架下訓練得到的引

文章學習《使用深度學習KerasTensorFlow打造一款音樂推薦系統》

本文僅是博主自己用來用來整理留存的摘錄,如對題目感興趣,請閱讀原文。 國內做得好的音樂APP網易雲、蝦米音樂和QQ音樂都會推薦喜歡的音樂。 推薦演算法是計算機專業中的一種演算法,通過一些數學演算法,推測出使用者可能喜歡的東西。 實現過程 採集大量資料

Tensorflow框架Faster-RCNN實踐(一)——Faster-RCNN所需資料集製作(附程式碼)

最近剛實現了在Ubuntu16.04、Tensorfllow1.0下 Faster R-CNN 從資料製作到訓練再到利用生成的模型檢測的測試圖片的全過程,現在將具體的過程記錄在部落格,方便遇到困惑或者需要的朋友檢視。 製作資料集 利用Fast

使用KerasTensorflow設定安裝Mask RCNN

參考: 概述如何安裝 Step 1: create a conda virtual environment with python 3.6 Step 2: install the dependencies Step 3: Clone the

Unix I/O模型

Unix下共有五種I/O模型:  1. 阻塞式I/O   2. 非阻塞式I/O   3. I/O複用(select和poll)   4. 訊號驅動式I/O(SIGIO)   5. 非同步I/O(POSIX的aio_系列函式)  io請求分兩步:  1. 先將資料從儲存介質(磁碟,網路等)拷貝到核心緩衝區,此

深度學習——卷積神經網路在tensorflow框架的應用案例

一、簡單的卷積神經網路的小應用 tensorflow框架下構建訓練一個簡單的3層卷積神經網路實現分類問題 (一)資料集介紹——SIGNS Datasets 教電腦破譯手語,在白色的牆壁前拍照,得到以下資料集。 現在的任務是建立一個演算法,使有語音障礙的人與不懂手語的人

阿里雲免費GPU+Tensorflow框架的影象分類例項

主要參看https://yq.aliyun.com/articles/72841?spm=5176.100239.0.0.aLlJGY 1.把下載的程式碼和資料集都上傳到了OSS中,放在資料夾cifar-10-py中 或者整理成4個資料夾: check_point:用

LinuxI/O模型詳解(阻塞IO、非阻塞IO、IO複用、訊號驅動、非同步IO)

文章轉載自微信公眾號:漫話程式設計 1 什麼是I/O 程式是由資料+指令構成的,執行程式的過程可以分成下面這幾步: 1.將程式碼載入到記憶體中,逐條執行記憶體中的程式碼 2.在執行程式碼的過程中,可能需要對檔案的讀寫,即將檔案輸入(Input)

原生jsjquery框架繫結事件的方法

一、原生js的事件的繫結 1、通過JavaScript物件屬性進行繫結 document.getElementById("test1").onclick=function(){alert("你好!")}; document.getElementsByTagName ("te

Tensorflow框架SSD演算法的樣例測試遇到的問題及成功執行!

主要參考部落格:https://blog.csdn.net/yexiaogu1104/article/details/77415990步驟同上述部落格:1. 下載模型ssd_300_vgg,存放在SSD-Tensorflow-master/checkpoints/這個目錄下 

TensorFlow 學習() 二分類logistic迴歸模型

邏輯迴歸的損失函式是對數損失函式,對數損失函式的方程式與資訊理論中的熵測量密切相關。它也是似然函式的負對數(假設“y‘ ’” 屬於伯努利分佈)。實際上,最大限度地降低損失函式的值會生成最大的似然估計值。對數損失函式的方程式如下圖