當前位置:
首頁 > 新聞 > 用 TensorFlow 目標檢測 API 發現皮卡丘!

用 TensorFlow 目標檢測 API 發現皮卡丘!

雷鋒網按:本文為雷鋒字幕組編譯的技術博客,原文 Detecting Pikachu in videos using Tensorflow Object Detection ,作者 Juan De Dios Santos。

翻譯 | 於志鵬 整理 | 吳璇

在 TensorFlow 眾多功能和工具中,有一個名為 TensorFlow 目標檢測 API 的組件。這個庫的功能正如它的名字,是用來訓練神經網路檢測視頻幀中目標的能力,比如,一副圖像。

需要查看我之前的工作的話,,我解釋了在安卓設備上採用 TensorFlow 識別皮卡丘的整個過程。此外,我也介紹了這個庫和它的不同架構及其各自特點,以及演示如何使用 TensorBoard 評估訓練過程。

數月之後,我開始著手優化我之前訓練的檢測比卡丘的模型,目的是直接使用 Python、OpenCV、以及 TensorFlow 來檢測視頻中的目標。源代碼可以從我的 GitHub 中獲取。

用 TensorFlow 目標檢測 API 發現皮卡丘!

比卡丘

這篇文章就是解釋我所使用的步驟。首先,我會描述我在最初的模型中發現的問題,以及我是如何優化的。然後,我會講解如何使用這個新的經過優化的模型,我組建了一個視頻檢測系統。最後,你將會看到兩段檢測多個比卡丘的視頻。

但開始之前,這裡有一個簡短的 gif,顯示了一些快速檢測。

用 TensorFlow 目標檢測 API 發現皮卡丘!

比卡丘被檢測到

用 TensorFlow 目標檢測 API 發現皮卡丘!

這就是比卡丘

模型優化

如上面所述,在以前的工作中,我對比卡丘檢測模型做了初始的訓練,這個模型的目的是在安卓設備或 Python notebook 上進行皮卡丘檢測。然而,我對這個模型的性能並不安全滿意,這促使我優化這個系統,因此,寫下了這篇文章。

我當時主要關心的是用於構建這個系統的比卡丘數量,230 個。其中 70% 用於訓練,而剩餘 30% 用於測試。所以,用於訓練的數量不多,雖然這在技術上不是問題(因為模型是在執行「okayish」),但我在訓練集里增加了 70 張圖片(總數依然不是很多,不過總比沒有要好)。

結果是,由於我現在擁有更多的圖片,我不得不擴展這個模型的訓練,而不是從零開始。我使用了早期模型的訓練檢查點,然後從檢查點開始繼續進行;前者訓練了 15000 次,而新的則訓練了 20000 次。下面兩幅圖表顯示了總體的損失和精度 (從 TensorBoard 中獲得);很明顯,從 15000 次到 20000 次沒有太多改變(特別是在損失方面)。

用 TensorFlow 目標檢測 API 發現皮卡丘!

損失

用 TensorFlow 目標檢測 API 發現皮卡丘!

精度

我做的最後一個(也是小的)修正是修改了 Android 應用的檢測閾值。默認值是 0.6,增加到 0.85。

這個優化改變了什麼嗎? 即使將我的確認偏差放在一邊,我也會說,是的。我注意到了一個細小的優化。我注意到的最大變化是,Android 應用中誤報的數量有所減少,因為那些物體看起來像黃色的斑點;當然,這可能也是因為閾值增加了。

現在,使用最新的和優化後的模型,在視頻中檢測比卡丘。繼續之前,我需要說明,我將忽略模型凍結和導入的整個過程,因為我之前的工作中已做了解答。

從視頻中檢測

從視頻中進行目標檢測並不像聽到的那麼困難或奇特。從外行角度,我們可以講視頻是一組按順序排列的圖像,所以從視頻中進行目標檢測和在正常圖像中進行檢測是非常相似的。為什麼非常相似?好吧,由於視頻的性質,在將視頻輸入檢測模型之前,視頻幀的處理和準備需要多個步驟。我將在下面的章節中將對此做出解釋,另外在解釋下檢測過程,以及如何創建一個新的視頻來顯示它們。

我的大部分代碼都是基於 TensorFlow 目標檢測 repo 提供的 Python notebook 實現的。這些代碼完成了大部分困難的工作,因為它包括很多功能,可以簡化檢測過程。我建議你可以看下我的 Script,並作為你閱讀下面這幾個段落的指導。

從高層視角看,這段代碼包括三個主要任務:

載入資源

首先,必須載入凍結的模型、數據標籤和視頻。為簡單起見,我推薦了一個簡短、中等大小的視頻,因為處理完整部電影需要很多時間。

遍歷視頻

這個腳本的主要功能是基於一個循環,遍歷視頻的每一幀。每次遍歷過程中,讀取幀,並改變其色彩空間。接著,執行實際檢測過程,就是尋找所有那些漂亮的黃色皮卡丘。結果是,返回皮卡丘所在位置的邊界坐標(如果找到的話)和檢測結果的置信度。隨後,只要置信度高於給定的閾值,將會創建一個視頻幀的副本,其中包含了皮卡丘位置的邊界框。對於這個項目,我設置的置信度閾值非常低,20%,因為我發現檢測誤報數很低,所以決定冒性能的風險來檢測到更多的皮卡丘。

創建新的視頻

在前面的步驟中,使用新創建的幀副本重新組成一個新的視頻,這些幀攜帶了檢測的邊界框。為創建這個視頻,需要用到 VideoWriter 對象,每次遍歷時,幀的副本都會被寫入這個對象(不含聲音)。

結果和討論

這兩個視頻顯示了模型的運行過程:

第一個視頻的檢測非常好。儘管皮卡丘在整個視頻中一直舉著番茄醬瓶子,在大多數場景中這個模型都能探測到。另一方面,在時間 0:22 時有一個沒有被檢測到,此外,「大鐮刀」(綠螳螂的樣子)打碎了番茄醬瓶的鏡頭(0:40 到 0:44)是誤報。

在第二個視頻上,這個模型的性能並沒有在第一個視頻上表現的那麼好,主要問題是視頻中出現了兩個皮卡丘的場景。這種情況下,模型貌似將兩個皮卡丘作為一個來檢測,而不是分別檢測。一個明顯的例子是在 0:13 的時候,兩個皮卡丘在互相拍打 (悲傷的場景 :(,我知道)。

總結與回顧

在這篇文章中,我介紹了如何使用 TensorFlow 目標檢測庫在視頻中檢測比卡丘。文章開頭,介紹了一些我之前的工作,使用模型的早期版本在安卓設備上進行目標檢測。至於模型,儘管它做了該做的工作,但也有一些我想要解決的問題;這些優化使我完成了這個項目並建立了一個用於視頻的檢測模型。

新的模型如預想的那樣工作。當然,或多或少也有一些不足之處,導致誤判,或者沒有檢測到比卡丘,但模型還是完成了它應該做的工作。作為以後的工作方向,我會為訓練集合增加更多不同角度的比卡丘圖像。例如,側視和後視圖像,增加數據的多樣性,以獲得優異的性能。

感謝閱讀。我希望這篇指導文章對你能有所幫助。

來源 https://towardsdatascience.com/detecting-pikachu-in-videos-using-tensorflow-object-detection-cd872ac42c1d

用 TensorFlow 目標檢測 API 發現皮卡丘!

雷鋒網雷鋒網

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

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


請您繼續閱讀更多來自 雷鋒網 的精彩文章:

安防巨頭海康威視的「體育夢」
何愷明團隊最新力作:群組歸一化

TAG:雷鋒網 |