1. 程式人生 > >目標檢測入門

目標檢測入門

原文連結

 https://www.analyticsvidhya.com/blog/2018/06/understanding-building-object-detection-model-python/

在外網上看到一篇非常好的目標檢測入門教程,特此翻譯過來,希望能對他人有所幫助,也加深下自己的記憶。(大部分機器都翻譯的可以,如有錯誤我會改正,各位也可以google看原文)

介紹

 

當我們看到一張影象時,我們的大腦會立即識別其中的物體。另一方面,機器識別這些物件需要大量的時間和訓練資料。但是隨著硬體和深度學習的進步,這個計算機視覺領域變得更加簡單和直觀。

 以下圖為例。該系統能夠以令人難以置信的精確度識別影象中的不同物體。

目標檢測技術在各行各業中得到了迅速的應用。
它幫助自動駕駛汽車在交通中安全行駛,在擁擠的地方發現暴力行為,幫助運動隊分析球探報告,確保製造過程中零部件的質量控制,等等。
而這些僅僅是物件檢測技術所能做的皮毛而已! 在本文中,我們將瞭解什麼是目標檢測,並研究幾種不同的方法來解決這個空間中的問題。
然後我們將深入研究用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/ 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,過濾掉警示標誌 解決目標檢測問題的不同方法 現在我們知道了問題陳述是什麼,那麼有什麼方法(或多種方法)可以解決它呢?
在本節中,我們將研究一些可以用於檢測影象中的目標的技術。
我們將從最簡單的方法開始,並從那裡找到我們的方法。
如果您對我們將在下面看到的方法有任何建議或替代方法,請在評論部分告訴我!
方法1:初始方法(分而治之) 我們可以採取的最簡單的方法是把影象分成四個部分: 1,左上角

2,右上角

 

3,左下角

4,右下角

現在,下一步是將這些部分分別輸入影象分類器。
這將給我們一個輸出,這部分影象是否有行人。
如果是,在原始影象中標記那個長方形。
輸出結果大致如下:

這是一個很好的方法,首先嚐試,但我們正在尋找一個更準確和更精確的系統。它需要識別整個物件(在本例中是一個人),因為僅定位物件的一部分可能會導致災難性的結果。

方法2:增加分部的數量

以前的系統執行得很好,但是我們還能做什麼呢?
我們可以通過成倍地增加我們輸入到系統中的分部的數量來改進它。
我們的輸出

這最終既是一種恩惠,也是一種詛咒。
當然,我們的解決方案似乎比天真的方法好一點,但它充滿了許多近似相同的邊界框。
這是一個問題,我們需要一個更有條理的方法來解決我們的問題。
方法3:執行結構化的劃分 為了以更結構化的方式構建我們的物件檢測系統,我們可以遵循以下步驟: 步驟1:將影象劃分為10×10的網格像這樣的:

步驟2:定義每個部分的質心步驟

3:對於每個質心,取三個不同高度和寬高比的部分

步驟4:通過影象分類器建立的所有部分獲得預測 那麼最終的輸出是什麼樣子的呢?
看看下面: 但是我們可以在這方面做得更好!
繼續閱讀,看看另一種方法將產生更好的結果。
方法4:變得更有效率 我們前面看到的方法在很大程度上是可以接受的,但是我們可以構建一個比它更有效的系統。
你能告訴我怎麼做嗎?
在我的腦海裡,我可以提出一個優化方案。
如果我們考慮方法3,我們可以做兩件事使我們的模型更好。 增加網格大小:因此,我們可以將網格大小從10增加到20:

在這裡,我們可以從一個錨點上取9個形狀,即3個不同高度的正方形斑塊和6個不同高度的垂直和水平矩形斑塊。
這將為我們提供不同的長寬比的補丁。

當然,這兩種方法都可以幫助我們達到更細粒度的層次。
但它將再次創造一個爆炸的所有補丁,我們必須通過我們的影象分類模型。 我們所能做的是,選擇有用的補丁而不是用全部補丁。
例如,我們可以構建一箇中間分類器,它試圖預測補丁是否具有背景,或者是否可能包含一個物件。
這將大大減少我們的影象分類模型必須看到的補丁。 我們可以做的另一個優化,是減少說“相同的事情”的預測。
讓我們再看一遍方法3的輸出: 正如您所看到的,這兩個邊界框預測基本上是同一個人的。
我們可以選擇其中任何一個。
所以為了做出預測,我們考慮所有“說同樣的話”的補丁,然後選擇最有可能發現一個人的補丁。 到目前為止,所有這些優化都給出了相當不錯的預測。
我們幾乎很有把握了,但是你能猜出少了什麼嗎?
當然是深度學習了!
方法5:使用深度學習進行特徵選擇並構建端到端方法 深度學習在目標檢測領域有著巨大的潛力。
你能推薦我們在哪裡以及如何利用它來解決我們的問題嗎?
我列出了一些方法如下: 我們可以將原始影象通過神經網路來減少尺寸,而不是從原始影象中獲取補丁
我們也可以使用神經網路來建議選擇的補丁
我們可以強化一種深度學習演算法,以給出儘可能接近原始邊界框的預測。
這將確保演算法提供更緊密和更精細的包圍框預測 現在我們不需要訓練不同的神經網路來解決每一個單獨的問題,我們可以用一個深層神經網路模型來嘗試解決所有的問題。
這樣做的好處是,每個較小的神經網路元件將有助於優化同一神經網路的其他部分。
這將有助於我們共同培養整個深度模型。 我們的輸出將提供到目前為止我們所看到的所有方法中最好的效能,有點類似於下面的影象。
我們將在下一節中看到如何使用Python建立它。

 

獲取技術:如何使用ImageAI庫構建物件檢測模型 現在我們知道了什麼是目標檢測,以及解決這個問題的最佳方法,讓我們構建自己的目標檢測系統吧!
我們將使用ImageAI,這是一個python庫,它支援用於計算機視覺任務的最先進的機器學習演算法。 執行一個物件檢測模型來獲得預測是相當簡單的。
我們不需要通過複雜的安裝指令碼才能開始。
我們甚至不需要GPU來生成預測!
我們將使用這個ImageAI庫來獲得我們在方法#5中看到的輸出預測。
我強烈建議您(在您自己的機器上)寫下下面的程式碼,因為這將使您能夠從本節中獲得最大限度的知識。 請注意,在建立物件檢測模型之前,您需要設定您的系統。
一旦您在本地系統中安裝了Anaconda,您就可以開始執行以下步驟。  使用python 3.6版本建立一個Anaconda環境。

conda create -n retinanet python=3.6 anaconda

啟用環境並安裝必要的包。

source activate retinanet
conda install tensorflow numpy scipy opencv pillow matplotlib h5py keras

然後安裝ImageAI庫。

pip install https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.1/imageai-2.0.1-py3-none-any.whl

步驟4:現在下載生成預測所需的預訓練模型。
這個模型是基於RetinaNet(一篇後續文章的主題)的。
點選連結下載-視網膜網路預訓練模型https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5

步驟5:將下載的檔案複製到當前工作資料夾 步驟6:從這個連結下載影象。
將影象命名為image.png 步驟7:開啟jupyter筆記本(在終端中輸入jupyter筆記本),執行以下程式碼:
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庫構建用於行人檢測的物件檢測模型。 只要稍微調整一下程式碼,您就可以輕鬆地轉換模型來解決您自己的物件檢測挑戰。
如果你確實用上述方法解決了這樣的問題,特別是為社會事業,請在下面的評論中告訴我!