教你在Python中構建物體檢測系統(附程式碼、學習資料)
引言
當有一幅影象展示在面前時,我們的大腦會立即識別出其中包含的物體。而另一方面,機器卻需要花費大量時間並訓練資料以識別這些物體。但隨著最近硬體和深度學習的升級,計算機視覺領域變得更加容易和直觀。
請檢視下面示例圖片,該系統能夠以令人難以置信的準確度識別影象中的不同物體:
物體檢測技術已經在各行各業中得到了迅速應用,這有助於為自動駕駛汽車在交通中保駕護航,在擁擠的地方識別出暴力行為,協助體育團隊分析和建立球探報告,確保製造業中的各項環節得到適當的質量控制,以及其他許多事務。而這些還只是物體探測技術表面上可以做到的事情!
在本文中,我們將瞭解物體檢測技術是什麼以及可以用來解決此領域問題的幾種不同方法,接著深入研究在Python中如何構建我們自己的物件檢測系統。在本文結束時,您將擁有足夠的知識來獨自迎接不同的物體檢測挑戰!
注意:本教程預設您瞭解深度學習的基礎知識,並且在此之前已經解決了簡單的影象處理問題。如果您還沒有,或需要複習,我建議您先閱讀以下文章:
● 深度學習的基礎 - 從人工神經網路開始
https://www.analyticsvidhya.com/blog/2016/03/introduction-deep-learning-fundamentals-neural-networks/
● 計算機視覺的深度學習 - 卷積神經網路簡介
https://www.analyticsvidhya.com/blog/2016/04/deep-learning-computer-vision-introduction-convolution-neural-networks/
● 教程:使用Keras優化神經網路(帶影象識別案例研究)
https://www.analyticsvidhya.com/blog/2016/10/tutorial-optimizing-neural-networks-using-keras-with-image-recognition-case-study/
目錄
● 什麼是物體檢測?
● 我們可以使用不同的方法來解決物體檢測問題
● 方法1:原始的方式(分而治之)
● 方法2:增加分割數量
● 方法3:執行結構化劃分
● 方法4:提高效率
● 方法5:使用深度學習進行特徵選擇以構建端到端方法
● 獲取技術:如何使用ImageAI庫構建物體檢測模型
什麼是物體檢測?
在構建最先進的模型之前,讓我們先嚐試瞭解物體檢測是什麼。假使我們需要建立一個自動駕駛汽車的行人檢測系統,汽車捕獲的影象如下圖所示。你會如何描述這張圖片?
影象顯示汽車在一個廣場附近,有幾個人正在我們的車前過馬路。由於無法準確識別交通標誌,汽車的行人檢測系統應準確識別出人們行走的位置,以避開他們。
那麼汽車系統如何確保完美避開呢?它可以做的是圍繞這些人建立一個邊界框,以便系統根據人們在影象中的位置,決定採取哪條路徑,避免任何意外。
物體檢測的目標有兩個方面:
● 識別影象中存在的所有物件及其位置
● 過濾掉關注物件
解決物體檢測問題的不同方法
現在我們知道問題是什麼了,那麼可以採用哪種方法(或多種方法)來解決它呢?在本節中,我們將介紹一些可用於檢測影象物體的技術。先從最簡單的方法開始,從那裡找到我們的方式。如果您對下面提及的方法有任何建議或者有相應的替代方法,請在評論部分告訴我們!
方法1:原始的方式(分而治之)
最簡單方法是將影象分為四個部分:
現在,下一步就是把每一部分影象都交給影象分類器進行識別。這樣,我們會得到每一部分影象中是否有行人的輸出結果。如果有,便在原影象中標記該區域。輸出結果類似這樣:
這是開始嘗試的一個很好的方法,但我們在尋求更加精確和準確的系統。它需要識別整個物體(或者是在本例中的人),因為僅僅識別物體的某些部分可能會導致災難性的後果。
方法2:增加分割數量
先前的系統效果不錯,但是我們還能如何改進呢?我們可以通過指數地增加我們輸入系統的選框的數量來提高精確度。輸出結果應該是這樣:
這個方法有利有弊。儘管我們的解決方案看起來比原始的方法好一點點,但是它粗篩出很多的選框,實際結果基本一樣。這是一個問題,我們需要一個更有條理的方法來解決這個問題問題。
方法3:展示結構嚴密的分割槽
為了用一種更有條理的方法構建我們的物體檢測系統,我們可以按以下步驟操作:
步驟1:把影象劃分成10x10的格子,如圖所示:
步驟2:定義每個區域的質心。
步驟3:對於每一個質心,選取3個高度和縱橫比不同的區域如下:
步驟4:將所有這些建立的區域傳入影象分類器來獲得預測結果。
所以最終輸出結果是什麼樣呢?一個更加確定且嚴密有序的結果——見下圖:
但我們還可以進一步改進!繼續閱讀以瞭解另一種能產生更好結果的方法。
方法4:提高效率
先前我們看到的方法在很大程度上是可以接受的,但我們還可以構建一個比之前更加高效的系統。你能建議怎麼做嗎?在我腦海中,我能提出一個優化方案。如果我們思考一下 方法3 ,可以做兩件事來讓模型更好:
● 增加網格的大小: 將網格大小增加到20,替代原有的10:
● 以多種高度和縱橫比選取更多區域而不僅是3個區域: 在這裡,我們可以圍繞每一個錨定質心選取9種形狀的區域,即3個不同高度的正方形區域和6個不同高度的垂直和水平的矩形區域,這會給我們提供不同縱橫比的區域。
再次說明,這也是有利也有弊。儘管這些方法都能幫助我們達到一個更細緻的水平,但是由於我們不得不把所有區域傳入到影象分類模型中,這會再次造成計算爆炸。
我們能夠做的是,有選擇性地選取區域而不是全都選取。舉個例子,我們能夠構建一箇中間分類模型,它嘗試預測選區是否真的只有背景,還是潛在地包含一個物體,這會指數式地減少影象分類模型所需要判斷的區域。
還有另一種優化方案,就是 減少“同一物體”的預測 。讓我們再次回顧方法3:
就像你看到的一樣,基本上所有的選框預測的都是同一個人,我們可以選擇其中任意一個。因此,我們可以考慮從標記“同一物體”的所有選框中,任選一個最有可能檢測出一個人的選框輸入影象分類模型中,進行預測。
目前,所有這些優化方案都給了我們相當合適的預測結果。我們幾乎穩操勝券,但你猜出缺了什麼嗎?深度學習!
方法5:使用深度學習進行特徵選擇以構建端到端方法
深度學習在物體檢測領域有很大的潛力。你能否建議我們從哪裡以及如何使用深度學習解決我們的問題嗎?我已經列出一些方法,如下:
● 可以通過 神經網路輸入原始影象來減少維度 ,而不是輸入原始影象的所有區域。
● 還可以 使用神經網路來限定影象區域的選擇 。
● 可以 強化深度學習演算法 ,使預測儘可能地接近影象中物體的原始邊界框,這將確保演算法能夠更嚴格地、更精細地預測邊界框。
現在我們可以採用單個深度神經網路模型,來嘗試獨自解決所有問題,而不是訓練不同的神經網路來解決每一個問題。這樣做的好處是,神經網路中 每個較小的元件都將有助於優化該神經網路的其他部分 ,從而便於我們合作,共同訓練整個深層模型。
目前為止,在我們看過的所有方法中,我們的輸出結果能夠提供最佳效能,有點類似於下圖。我們將在下一節中看到如何使用Python建立它。
獲取技術:如何使用ImageAI庫
構建物體檢測模型
現在我們知道了什麼是物體檢測以及解決此問題的最佳方法,讓我們構建自己的物件檢測系統!我們即將使用的是ImageAI庫,這是一個python庫,支援計算機視覺任務中所有最先進的機器學習演算法。
執行物體檢測模型獲得預測是非常簡單的。我們不必從複雜的安裝指令碼來開始,甚至也不需要GPU來生成預測!我們將使用這個ImageAI庫來獲得在方法5中所看到的輸出結果。強烈建議您在自己的機器上輸入下面的程式碼,因為這可以幫助您能夠從本節中獲得最大的知識。
請注意,您需要在建立物體檢測模型之前設定系統。在本地系統中安裝Anaconda後,即可開始執行以下步驟。
步驟1:使用python 3.6版搭建Anaconda環境。
conda create -nretinanet python=3.6 anaconda
步驟2:啟用環境並安裝必要的軟體包。
source activateretinanet conda installtensorflow numpy scipy opencv pillow matplotlib h5py keras
步驟3:安裝ImageAI庫
pip install https://github.com/OlafenwaMoses /ImageAI/releases/download/2.0.1/imageai-2.0.1-py3-none-any.whl
步驟4:下載獲得預測所需的預訓練模型。該模型基於RetinaNet(未來文章的主題)。訪問連結下載——RetinaNet預訓練模型:
https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5
步驟5:將下載的檔案複製到當前工作資料夾。
步驟6:從以下連結下載影象,將影象命名為image.png:
https://s3-ap-south-1.amazonaws.com/av-blog-media/wp-content/uploads/2018/06/I1_2009_09_08_drive_0012_001351-768x223.png
步驟7:開啟jupyter筆記本(在終端中鍵入jupyter notebook)並執行以下程式碼:
from imageai.Detection import ObjectDetection
import os
execution_path = os.getcwd()
detector = ObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()
custom_objects = detector.CustomObjects(person=True, car=False)
detections = detector.detectCustomObjectsFromImage(input_image=os.path.join(execution_path , "image.png"), output_image_path=os.path.join(execution_path , "image_new.png"), custom_objects=custom_objects, minimum_percentage_probability=65)
for eachObject in detections:
print(eachObject["name"] + " : " + eachObject["percentage_probability"] )
print("--------------------------------")
這將建立一個名為image_new.png的修改後的影象檔案,其中包含物體的邊界框。
步驟8:如需要列印影象,請使用以下程式碼:
from IPython.display import Image Image("image_new.png")
恭喜!您已為行人檢測建立了自己的物體檢測模型。這太棒啦!
結語
在本文中,我們瞭解了什麼是物體檢測以及建立物體檢測模型的思路,還學習瞭如何使用ImageAI庫構建行行人檢測模型。
通過微調程式碼,您可以輕鬆地轉換模型以解決自己的物體檢測挑戰。如果您已經使用過上述方法解決了這樣的問題,特別是社會方面的,請在下面的評論中告訴我們!
原文釋出時間為:2018-10-24
本文作者:FAIZANSHAIKH
本文來自雲棲社群合作伙伴“ ofollow,noindex">資料派THU ”,瞭解相關資訊可以關注“ 資料派THU ”。