在 TensorFlow 的許多功能和工具中,有一個名爲 TensorFlow Object Detection (目標檢測)API 的組件。顧名思義,這個庫的目的就是訓練一個神經網絡,可以識別視頻幀中的目標,例如一個圖像。html
在我以前的一項工做中,我曾發表了一篇文章,闡述了我在 Android 設備上使用 TensorFlow 軟件包檢測皮卡丘的過程。此外,我還介紹了這個庫,並討論了它提供的不一樣架構和功能,以及如何使用 TensorBoard 評估訓練過程的演示。ios
AI 前線注:該文章可訪問如下連接查看 http://suo.im/4GPhqagit
幾個月後,我開始着手改進以前訓練過的皮卡丘檢測的模型,但願可以在視頻中檢測到皮卡丘,我使用了 Python、OpenCV,固然還有 TensorFlow Object Detection。這個模型的代碼能夠在 Github 上找到:github
https://github.com/juandes/pikachu-detection微信
超級萌物皮卡丘網絡
本文記錄了我爲實現這個目標所採起的步驟。首先,我將闡述我在原始模型中注意到的問題,以及爲改善這些問題所作的工做。而後,我將繼續闡述如何使用這個改進的新模型,並基於它開發了一個視頻檢測系統。最後,大家將能看到有着幾個皮卡丘檢測的兩個視頻。架構
在咱們開始以前,先看一副 gif 動圖,演示如何快速檢測皮卡丘。ide
皮卡丘被檢測到函數
綠框處即檢測到的皮卡丘工具
如前所述,在以前的工做中,我對一個皮卡丘檢測模型進行了最初的訓練,目標是在 Android 設備和 Python notebook 使用這個模型。然而,我對這個模型的表現並非很滿意,想作出皮卡丘檢測系統的動機驅使我持續改進這個模型,因而便有了本文。
我所關心的主要問題是用來構建該系統所需的皮卡丘圖片的數量:230 張。其中約 70% 用於訓練,其他 30% 用於測試,所以訓練並不太多。儘管這在技術上並非什麼問題(由於該模型的表現是「良好」),但我仍是在訓練集上增長了 70 多張圖片(雖然不是不少,但總比沒有好)。
因爲我如今有了更多的圖片,所以必須延長模型的訓練。我並無從頭開始訓練,而是使用了早期模型的訓練檢查點,並從那裏繼續;前者在 15000 個輪數訓練,而新訓練則需 20000 個輪數。以下兩張圖所示,顯示了總損失(total loss)和精度(precision)(來源:TensorBoard);從這兩張圖很容易看出,從 15000 個輪數到 20000 個輪數(特別是在損失中),並無多少變化。
損失度曲線
精度曲線
我作的最後一個(也是比較小的)改進,是修改了 Android 應用的檢測閾值,將默認值 0.6,增長到 0.85。
你可能會問,這些改進能改變什麼嗎?就算摒棄個人偏見,我也會說,是的!我確實注意到了小小的改進。我注意到的最大變化就是,Android 應用的假正類(False Positive)數量減小了,緣由是目標看起來像一個黃色的斑點;固然,也有多是由於門檻提升所致。
如今,我有了一個最新的(承載着個人但願)改進模型,我已經準備好用它來檢測視頻中的皮卡丘。在此以前,我想指出的是,我將略過模型凍結和導入的整個過程,由於在我以前的工做中,已經解決了這個問題。
從視頻中進行目標檢測並不像聽起來那麼困難或複雜。從外行的角度來講,咱們能夠認爲視頻是由一系列按順序排列的圖像組成的,所以檢測過程與從正常圖像檢測的過程很是類似。爲何會至關類似呢?嗯,因爲視頻的性質,在將其饋送到檢測模型前必須解決幀的預處理和準備還須要幾個步驟。在接下來的文章中,我將會解釋這一點,再加上我執行檢測的過程,以及如何建立一個新視頻來展現檢測效果。
個人大部分代碼都是基於 TensorFlow Object Detection 中提供的 Python notebook;這段代碼完成了大部分工做,由於它包含了許多簡化檢測過程的函數。另外,我建議你看一下個人腳本,並在閱讀如下段落時,使用這段腳本做爲指導。
從高層次的角度來看,我寫的代碼完成了三個主要任務:
首先,要加載凍結模型、數據標籤和視頻。爲了簡單起見,我建議使用一個簡短的中型視頻,由於處理一整部電影的話可能會須要更多的時間。
該腳本的主要功能是基於循環遍歷視頻的每個幀。在每次迭代中,讀取幀並更改其顏色空間。接下來,經過實際的檢測過程找出全部那些漂亮的皮卡丘。而後返回皮卡丘所在邊界框的座標(若是找到的話)以及檢測到的置信度值。隨後,這個腳本將建立一個幀的副本,其中包含皮卡丘的邊界框,只要置信度的值高於給定閾值便可。對於這個項目,我將置信度的閾值設置爲很是低的 20%,由於我注意到在視頻中檢測到的假正類的數量很是小,因此我決定「冒險」設置這樣的閾值,只是爲了可以檢測到更多的皮卡丘。
全部新建立的帶有前面步驟中所提到的檢測框的幀副本,都用來構建新的視頻。要構建這個視頻,須要一個VideoWriter
對象,並在前面所提到的循環的每次迭代中,幀的副本將寫入這個對象(沒有任何聲音)。
這兩個視頻展現了模型的表現。
該模型在第一個視頻的檢測結果很是好。儘管皮卡丘在整個視頻中一直拿着番茄醬瓶子,但該模型在大多數場景中都能檢測到皮卡丘。另外一方面,在 0:22 處沒有檢測到皮卡丘,並且,0:40~0:44 這段出現飛天螳螂打碎番茄醬瓶子被檢測爲假正類。
該模型在第二個視頻的表現不如第一個視頻好,主要問題在於畫面上有兩個皮卡丘,在這種狀況下,這個模型彷佛將這兩個皮卡丘視爲一個,而不是每一個皮卡丘都檢測爲一個:一個明顯的例子就是在 0:13 處開始,兩個皮卡丘互相抽打耳光。
在本文中,我談到了如何使用 TensorFlow Object Detection 包在視頻中檢測皮卡丘。在本文開頭,我談論了之前的工做,說起我使用早期版本的模型在 Android 設備上進行檢測皮卡丘。該模型儘管發揮了做用,但仍存在一些我想解決的問題;這些改進讓我得以完成這個新項目,併爲視頻構建了一個檢測皮卡丘的模型。
這個新模型確實按照個人預期發揮了做用。固然,也有檢測不到的時候,這與假正類有關,但模型作到了它必須作的事。做爲將來的研究方向,我但願在個人訓練集中添加更多不一樣角度的皮卡丘圖像,例如,皮卡丘的側視圖和後視圖,以使數據更加多樣化,從而得到更好的結果。
原文連接:
https://towardsdatascience.com/detecting-pikachu-in-videos-using-tensorflow-object-detection-cd872ac42c1d