當前位置:
首頁 > 最新 > 神經網路技術在網路視頻處理的應用探討

神經網路技術在網路視頻處理的應用探討

一、背景:

機器學習與神經網路(machine learning):

那麼什麼樣的科技才能幫到我們呢?首先把目光投向了機器學習,也就是所謂的machine learning。機器學習簡單的說就是要讓電腦自己學習,就像老師教學生數學題一樣,先給計算機展示一些例子,然後讓計算機自己去做題。希望通過這個理念來訓練計算機思考,代替人力。能夠實現機器學習的演算法多種多樣,每種演算法都有自己的特點和優劣勢。而我想要重點介紹的一個比較先進的演算法,人工神經網路(Artificial Neural Networks,簡寫為ANNs)。它是一種應用類似於大腦神經突觸聯接的結構進行信息處理的數學模型。神經網路的是一個較為新的演算法概念。其出現使得機器學習有了突飛猛進的進展。人工神經網路在模式識別、智能機器人、自動控制、預測估計、生物、醫學、經濟等領域已成功地解決了許多現代計算機難以解決的實際問題,表現出了良好的智能特性。而卷積神經網路(cnn)更是用途最廣的神經網路之一。它具有一定的抽象能力,可以提取數據的特徵,魯棒性較強。也就是說如果同一組數據發生了變化,卷積神經網路也一樣可以適應這些變化。例如時下流行的人臉識別,新款的iPhone8 和iPhoneX應用的正是卷積神經網路來做到的人臉解鎖。百度搜索引擎也利用了卷積神經網路實現了精準的黃色,垃圾,恐怖等非法圖片,非法網址的識別。

二、問題的提出:

由於目前谷歌等大型網路公司對神經網路的深入研究。現在卷積神經網路已經能對文字和圖片的進行識別高效而準確的識別。但是對於視頻內容的識別還處於開始階段。於是我想在卷積神經網路在視頻信息處理的可行性方面做出一點探究。而這次我把目光投向了遊戲視頻。

遊戲直播一直都是網路直播行業的主力軍。而為了保留下精彩瞬間吸引更多觀眾,各大直播平台也紛紛推出了自己的錄播平台,上傳自己遊戲主播的精彩視頻。但是,將整段整段的錄播內容上傳十分耗費時間,保留這些視頻也十分耗費內存。如果能對視頻進行切割,只保留有遊戲的部分,除掉其它與遊戲無關部分,將會大大緩解這些問題,並且還能方便看錄像的觀眾跳過等待時間。但是,對視頻進行分段十分耗費人力。中國目前知名的直播平台douyuTV,僅遊戲類主播每天就能產生上千個小時的錄播視頻。人力將無法有效地處理如此龐大的數據量,因此我想嘗試卷積神經網路是否能對這些遊戲視頻做出高效的處理。本文將通過機器學習來建立 「絕地大逃殺」 這款遊戲視頻的卷積神經網路模型,使其對這款遊戲開始,遊戲中,和結束3各階段進行識別。

三、 問題的研究分析:

實驗對象分析:

絕地大逃殺是一款第一人稱視角射擊類遊戲。遊戲本身採用了當下比較流行MOBA類遊戲模式。既遊戲分為一場又一場的比賽,比賽之間相互獨立,且每局比賽有鮮明的開始和結束畫面,便於識別。在這方面與之相類似的還有很多人氣很高的遊戲:League of Legend, dota2, Overwatch, 等等。如果我能通過機器學習對這款遊戲的視頻進行分段,那麼說明對其他遊戲這類遊戲也同樣可行。

演算法分析:

現在存在著很多種卷積神經網路,而我下面想要重點介紹2D卷積神經網路,和3d卷積神經網路。這兩類卷積神經網路擅長於捕捉數據的特點並對其進行分類,正是我需要的演算法。

2D卷積神經網路:

2D卷積神經網路比傳統神經網路多出的部分就是卷積層和採樣層。比如我們想識別所有帶有狗的圖片,而現在輸入層是就是一張帶有狗的圖片。想要讓神經網路理解什麼是狗,我們先要大致預測這張照片展現了多少狗的特徵,這就是卷積的含義了。如上圖所示,如果我預測狗有40個特徵,那麼這一張照片將被分成40份(c1層),分別做檢測,每一份檢測一個特徵。但是由於機器的限制,第一次卷積每一個特徵的大小都是相同的,也就是說第一次卷積可能只檢測到5x5像素大小的狗的特徵。而還有一些狗的更大的特徵無法被檢測。於是我們要降採樣。保留c1層檢測到的特徵的位置,把沒有特徵的像素去掉。我們得到了一張更模糊的圖片(s1層),然後對這張更模糊的圖片再次卷積,然後再降採樣,如此往複,直到圖片的像素少到難以判斷這是什麼的時候。最後一步,把所有最後一層的小圖片們中的像素展開,形成一列,這一過程就是上圖的全連接。把它們輸入傳統人工神經網路分析,得到輸出,這到底是不是狗。

3D卷積神經網路:

3D卷積神經網路和2D卷積神經網路的思路相似,都是通過不斷卷積,再降採樣來識別輸入數據的特徵。但是與2D-cnn不同的是,3D-cnn側重於識別連續樣本中特徵連續變化的特徵。也就是說3D-cnn比較擅長處理連續變化的數據。所以3D-cnn多用於視頻識別。如上圖所示的是3D-cnn的卷積過程。首先把視頻按照幀數輸入到一個3維矩陣中。由於輸入層是一個3維矩陣,那麼卷積所要捕捉的特徵也會是3維的。假設我想捕捉在連續五幀里5x5像素大小的特徵,那麼卷積核就的大小就是一個5x5x5的三維矩陣。最後的輸出是上圖的「 輸出特徵圖」,對應2D-cnn的C1層中的某一層。

四、問題的解決及驗證:

目前看來比較主流的處理視頻的演算法是3d卷積神經網路,這次我採用的是傳統的2d卷積神經網路,以下是我的分析。

雖然說3d卷積神經網路在能更好的識別視頻中連續幀所包含的信息。然而,遊戲視頻有自己的一些特性。在遊戲開始,進行,和結束階段,視頻畫面往往會有很大的差異,例如 「絕地大逃殺」 這款遊戲,遊戲開始時玩家屏幕中會有一架飛機:

而遊戲結束時顯示的是計分板:

大部分遊戲都會有這種鮮明的畫面對比來告知玩家遊戲開始,或結束了。所以用2d神經網路倆對這些幀做識別較為合適。3d卷積神逐幀會對視頻逐幀分析,捕捉到視頻的動態特點,但這些特點對視頻截取沒有額外的幫助。權衡之下我採用了傳統2d卷積神經網路。通過對遊戲中這些關鍵幀的識別來達到對遊戲內容分段的效果。

然而2d神經網路也存在自己的問題。我第一次訓練的時候從兩個遊戲視頻中截取了532張圖片做訓練,結果損失函數很快地就收斂了,準確率也一直高地驚人,僅僅10次訓練就達到了100%。但是當我用該模型測試一段全新的視頻時,準確率確只有65%左右。經過反覆思考,我發現問題產生在我用於做訓練的視頻太少,而我截取的樣本容量卻太多。雖然通過密集地截取視頻幀數可以獲得大量的訓練樣本,但是這些樣本存在很大問題。鄰近幀數的圖片往往差異比較小,將這些差異極小的圖片大量地輸入神經網路會導致訓練的準確率虛高,且模型容易訓練過度。因此,這次我在訓練時特別注意了這個細節,找到了12段不一樣的視頻,只截取了1000張左右的圖片。

搭建神經網路:

所有激活函數均採用了ReLU函數來作為激活函數,以便加速收斂。卷積神經模型,分3層卷積網路。每層提取8x8大小的特徵40個,每次卷積完後用2x2大小的filter進行maxpool。最後展開層有5400個神經元,算上輸入層一共有7層。

Input: (3, 68, 120) float32

layer   0: cnn1/Relu:0          (68, 120, 40)    float32

layer   1: pool1:0              (34, 60, 40)    float32

layer   2: cnn2/Relu:0          (34, 60, 40)    float32

layer   3: pool2:0              (17, 30, 40)    float32

layer   4: cnn3/Relu:0          (17, 30, 40)    float32

layer   5: pool3:0              ( 9, 15, 40)    float32

layer   6: flatten:0            (5400, )         float32

接下來對有5400個神經元的展開層後面加一個50%dropout率的Dropout層。接下來第8,10,12層為全連接層,9,11層又是Dropout層,Dropout率均為50%。12層為輸出層,輸出3個值為某一幀是遊戲開始,遊戲中,遊戲結束可能性的參數。

layer   7: drop1/mul:0          (5400, )         float32

layer   8: relu1/Relu:0         (5000, )         float32

layer   9: drop2/mul:0          (5000, )         float32

layer  10: relu2/Relu:0         (1024, )         float32

layer  11: drop3/mul:0          (1024, )         float32

layer  12: output/Identity:0    (3, )            float32

增加dropout層可以大大減少模型對樣本容量的需求,而且也可以防止過度訓練。

最後,訓練將採用minibatch來提高訓練的速度。每十組數據分為一個batch。所以真正訓練時的神經網路比上述的神經網路每一層都多一維度,且該維度一直為10,例如輸入層大小為(10, 3, 68, 120) 。

訓練:

本次實驗在本人自己的工作電腦本上進行。Intel(R) Core(TM) i7-6700HQ CPU @ 2.6Hz, 英偉達GTX970顯卡。12個遊戲視頻作為訓練樣本,這些視頻全部來自於www.bilibili.com,從視頻中以遊戲開始,遊戲進行,遊戲結束這3個階段較為平均地抽取了1013張截圖作為訓練樣本。這些圖片又被以7:3的比例分為訓練組和驗證組。取幀軟體為Windows自帶的ffmpeg,截取下的圖片大小為1280*720,為了減少內存的壓力,用numpy把圖片轉換成120*68的大小。搭建神經網路時使用python作為編程語言,主要應用tensorflow和tensorlayer來進行神經網路的搭建。

由於鄰近幀數的畫面可能會彼此之間十分相似,當這相似的兩張圖片分別被分進了訓練組和驗證組便會導致驗證組的準確率虛高。所以為了減少這種情況干擾模型的準確率,驗證組中的畫面全部來自於與訓練組不同的遊戲視頻。訓練時將對這1013張圖片反覆訓練200次,每過10次,輸出一次訓練組和驗證組的損失參數和準確率。

結果:

訓練結果由下圖看可見。橫軸坐標中從2到21,每個數據代表著10次運算後的平均值。只有橫坐標為1時,代表了訓練了一次之後所得的結果。

損失函數:

準確率:

除去第一組數據後的損失函數:

除去第一組數據後的準確率函數:

在200次循環計算過程中平均每次循環花費3.292319秒,整個程序大約耗時12分鐘。

五、總結:

對比驗證組數據和訓練組數據,可以發現兩者之間存在的差異較小,說明搭建的模型比較真實的捕捉到了遊戲中3個階段的特點,說明該2D-cnn模型克服了鄰近幀相似的問題。

從200次循環得到的數據來看,損失函數和準確率函數均有收斂的趨勢。但是在訓練樣本只有12個視頻的情況下再進行更多的重複訓練也不會更加提高模型的準確率,反而有可能過度訓練。由於一個人力量有限,無法提供更多的訓練樣本。如若能有更多的訓練樣本和更好的硬體設備,相信可以訓練出更加準確的模型來模仿這款遊戲的進程從而對其進行分段。由此可見,通過2d卷積神經網路來對遊戲視頻進行分段是完全可行的。

如果以後這個演算法被改良後用於視頻分段和視頻截取,將大大節省人工處理視頻的時間。目前我的程序處理1000左右幀的圖片需要話費約3.2秒,1000/3.2也就是312.5幀每秒。而一般人眼可有效識別的幀數的頻率大概是24幀每秒。由此可見神經網路的運算速度遠遠高於人工的速度,約為人工的13倍。如果這種視頻分段方法被加以利用,可以大大減少人工時間。

此外除了對視頻進行簡單的分類,截取。對於特定遊戲視頻加入對某些特點畫面的識別,例如許多遊戲都有計分板,記錄玩家得分,對它們進行識別可以大致判斷玩家在這段視頻中的表現。又或者一些低概率發生的事件,發生時遊戲畫面也會發生特定的變化。神經網路完全可以識別這些細節,然後再對整個視頻的精彩程度加以判斷,把精彩的遊戲視頻推送給感興趣的人。我們甚至還可以加入聲音的識別,對截取的視頻配上字幕,方便聽力不好的觀眾觀看。

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 中關村在線 的精彩文章:

前後雙玻璃硬朗風來襲 買堅果Pro上天貓
數說新機:蘋果iPhone 8 Plus出師未捷身先死?NO
想入手就快抓緊 堅果Pro限時直降200元
iPhone X預售前開業?蘋果在芝加哥最美的零售店
坐飛機可以放肆玩手機了 飛行模式終於派上用場

TAG:中關村在線 |