10行程式碼實現目標檢測,請收下這份教程
翻譯 | 林椿眄
編輯 | 阿司匹林
出品 | AI科技大本營(公眾號ID:rgznai100)
作為人工智慧的一個重要領域,計算機視覺是一門可以識別並理解影象和場景的計算機及軟體系統科學。該領域主要包括影象識別,目標檢測,影象生成,影象超解析度等多個方向。由於現實中存在眾多的實際案例,目標檢測應該是計算機視覺中最令人深刻的一個方向。在本教程中,我們將簡要介紹包括當前目標檢測的概念,軟體開發人員所面臨的挑戰,相應的解決方案以及執行高效能目標檢測的編碼教程等內容。
目標檢測是指計算機和軟體系統在影象/場景中定位並識別出每個目標的能力,已廣泛應用於人臉檢測,車輛檢測,行人計數,網路影象,安全系統和無人駕駛汽車等領域。當前有很多目標檢測方法能夠在實踐中應用。像其他任何計算機技術一樣,各種創造性和效果驚人的目標檢測方法都是來自計算機程式設計師和軟體開發人員的努力。
在應用程式和系統中使用目標檢測方法,並基於這些方法構建新的應用並不是一項直接的任務。在早期,目標檢測的實現包括一些經典演算法的使用,如在受歡迎的計算機視覺庫 OpenCV 中支援的演算法。然而,這些經典演算法無法在不同條件下達到同等優秀的工作效能。
2012 年之後,深度學習技術的突破性及其快速應用,帶來了諸如 R-CNN,Fast-RCNN,Faster-RCNN,RetinaNet 等諸多高精度目標檢測方法,以及以 SSD 和 YOLO 為代表的等快而準的目標檢測演算法。想要使用這些基於深度學習的目標檢測方法,我們需要對數學知識及深度學習框架的深刻理解。數百萬的專業計算機程式設計師和軟體開發人員想要整合和建立用於目標檢測的新產品。但是,理解並在實際中使用目標檢測產品需要額外且複雜的方法,這種技術超出了一般程式設計師的能力範圍。
在幾個月前,我的團隊就意識到了這個問題,這就是為什麼我和 John Olafenwa構建 ImageAI 的原因。這是一個基於 Python 程式庫,它允許程式設計師和軟體開發人員輕鬆地將最先進的計算機視覺技術整合到他們現有的或新的應用程式中。
想要使用 ImageAI 實現目標檢測任務,你需要做的就是:
1. 在計算機系統上安裝 Python
2. 安裝 ImageAI 及其依賴庫
3. 下載目標檢測的模型檔案
4. 執行示例程式碼 (只有 10 行)
現在讓我們開始吧~
1) 從 Python 官網上下載並安裝 Python 3:
https://python.org
2) 通過 pip 安裝以下依賴庫:
Ⅰ. Tensorflow:pip install tensorflow
II. NumPy:pip install numpy
III. SciPy:pip install scipy
IV. OpenCV:pip install opencv-python
Ⅴ. Pillow:pip install pillow
Ⅵ. Matplotlib: pip install matplotlib
Ⅶ. H5py:pip install h5py
Ⅷ. Keras:pip install keras
Ⅸ. ImageAI:pip install
https://github.com/OlafenwaMoses/ImageAI/releases
/download/2.0.1/imageai-2.0.1-py3-none-any.whl
3) 通過此連結下載用於目標檢測的 RetinaNet 模型檔案。
https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5
現在,你已經安裝了需要的依賴庫。接下來,你就可以編寫第一段目標檢測程式碼了。建立一個 Python 檔案併為其命名 (例如,FirstDetection.py),然後寫入下面的 10 行程式碼,並將 RetinaNet 模型檔案和需要檢測的影象複製到包含這個 python 檔案的資料夾中。
FirstDetection.py
from imageai.Detection import ObjectDetectionimport osexecution_path = os.getcwd()detector = ObjectDetection()detector.setModelTypeAsRetinaNet()detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))detector.loadModel()detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"))for eachObject in detections: print(eachObject["name"] + " : " + eachObject["percentage_probability"] )
然後執行程式碼,稍等片刻結果將顯示在控制檯中。一旦控制檯打印出結果後,轉到 FirstDetection.py 所在的資料夾,你將找到所儲存的新影象。如下是兩個原影象樣本,檢測後將儲存新影象。
Before Detection:
Image Credit: alzheimers.co.uk
Image Credit: Wikicommons
After Detection:
控制檯列印的檢測結果:
person : 55.8402955532074
person : 53.21805477142334
person : 69.25139427185059
person : 76.41745209693909
bicycle : 80.30363917350769
person : 83.58567953109741
person : 89.06581997871399
truck : 63.10953497886658
person : 69.82483863830566
person : 77.11606621742249
bus : 98.00949096679688
truck : 84.02870297431946
car : 71.98476791381836
控制檯列印的檢測結果:
person : 71.10445499420166
person : 59.28672552108765
person : 59.61582064628601
person : 75.86382627487183
motorcycle : 60.1050078868866
bus : 99.39600229263306
car : 74.05484318733215
person : 67.31776595115662
person : 63.53200078010559
person : 78.2265305519104
person : 62.880998849868774
person : 72.93365597724915
person : 60.01397967338562
person : 81.05944991111755
motorcycle : 50.591760873794556
motorcycle : 58.719027042388916
person : 71.69321775436401
bicycle : 91.86570048332214
motorcycle : 85.38855314254761
現在,我們來解釋下這 10 行程式碼是如何工作的。
from imageai.Detection import ObjectDetection
import os
execution_path = os.getcwd()
在上面 3 行程式碼種,第一行我們匯入了 ImageAI 目標檢測類,第二行匯入了 python 的 os 類,第三行定義了一個變數用來儲存我們的 python 檔案,其中 RetinaNet 模型檔案和影象都將存放在該資料夾路徑下。
detector = ObjectDetection()detector.setModelTypeAsRetinaNet()detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))detector.loadModel()detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"))
在上面的 5 行程式碼中,第一行定義了目標檢測類,第二行將模型的型別設定為 RetinaNet,並在第三行將模型路徑設定為 RetinaNet 模型的路徑,第四行將模型載入到的目標檢測類,第五行呼叫目標檢測函式,解析輸入的和輸出的影象路徑。
for eachObject in detections:
print(eachObject["name"] + " : " + eachObject["percentage_probability"] )
在上面的2行程式碼中,第一行迭代執行 detector.detectObjectsFromImage 函式並返回所有的結果,然後在第二行打印出所檢測到的每個目標的名稱及其概率值。
ImageAI 支援許多強大的目標檢測過程。其中之一就是能夠提取影象中檢測到的每個目標。如下所示,通過簡單地解析將 extra_detected_objects = True 變為 detectObjectsFromImage 函式,目標檢測類將為影象目標建立一個新的資料夾,提取每張影象,並將每張影象儲存到新建立的資料夾中,同時返回一個包含每張影象路徑的額外陣列。
detections, extracted_images = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"), extract_detected_objects=True)
下面我們來看看在第一張影象上取得的目標檢測結果:
所有包含行人的影象都能被提取出來了,我沒有儲存所有的目標,因為它們會佔用太多不必要的空間。
ImageAI 還提供了更多功能,可用於定製和生產功能部署所需的目標檢測任務。一些支援的功能如下:
Adjusting Minimum Probability:預設情況下,檢測概率低於 50% 的物件將不會顯示或報告。你可以增加高確定性目標的檢測概率,或者在需要檢測所有可能物件的情況下降低該概率值。
Custom Objects Detection:使用所提供的 CustomObject 類,如此檢測類函式將打印出一個或幾個唯一目標的檢測結果。
Detection Speed:通過將檢測速度設定為“fast”、“faster”和“fastest”,以便縮短目標檢測所需的時間。
Input Types:你可以指定並解析影象的檔案路徑,Numpy 陣列或影象檔案流作為輸入影象
Output Types:你可以指定 detectObjectsFromImage 函式所返回的影象格式,可以是以檔案或 Numpy 陣列的形式。
——【完】——
關注AI科技大本營,獲取更多精彩內容添。加小助手csdnai,加入讀者群