短短10行程式碼就可以實現標的檢測?!
本文作者和他的團隊構建了一個名為ImageAI 的Python庫,集成了現今流行的深度學習框架和計算機視覺庫。本文將手把手教你構建自己的第一個標的檢測應用,而且文摘菌已經幫你踩過坑了,親測有效!
無人超市、人臉識別、無人駕駛,眾多的使用場景及案例,使得【標的檢測】正成為計算機視覺最有前景的方向。
聽起來似乎是個很難實現的技術,需要大量訓練資料和演演算法才能完成。事實上,本文作者開發了一個基於Python的函式庫,可以用十行程式碼高效實現標的檢測。
還不熟悉的讀者,我們先來看看,標的檢測到底是什麼,以及軟體開發人員面臨的挑戰。
標的檢測是藉助於計算機和軟體系統在影象/場景中,定位標的並識別出每個標的的類別的技術。目前已廣泛用於人臉檢測、車輛檢測、行人計數、網路影象、安全系統和無人駕駛汽車等領域。隨著計算機技術不斷發展和軟體開發人員的不懈努力,未來標的檢測技術將更廣泛的普及開來。
在應用程式和系統中使用先進的標的檢測方法,以及基於這些方法構建新的應用程式並不容易。早期標的檢測是基於經典演演算法而實現的,如 OpenCV(廣受歡迎的計算機視覺庫)所支援的一些演演算法。然而,這些經典演演算法的效能會因條件而受到限制。
2012年,深度學習領域取得眾多突破,學者們提出了一系列全新、高精度的標的檢測演演算法和方法,比如R-CNN, Fast-RCNN, Faster-RCNN, RetinaNet,以及既快又準的SSD和YOLO等。要使用這些基於深度學習的方法和演演算法(當然深度學習也是基於機器學習),需要對數學和深度學習框架有很深的理解。數百萬的軟體開發人員致力於整合標的檢測技術進行新產品的開發。但是想要理解這項技術並加以使用,對非深度學習領域的程式員來說並不容易。
一位自學了計算機的開發者Moses Olafenwa在幾個月前意識到了這個問題,並與同伴一起開發了一個名叫ImageAI的Python函式庫。
ImageAI可以讓程式員和軟體開發者只用幾行程式碼,就能輕易地把最先進的計算機視覺技術整合到他們現有的以及新的應用程式裡面。
用ImageAI實現標的檢測,你只需要以下步驟:
1、安裝Python
2、安裝ImageAI和相關函式庫
3、下載標的檢測模型檔案
4、執行示例程式碼(只有10行)
5、準備工作
測試環境為Windows 64位系統,Python版本為3.6。在大資料文摘後臺回覆“檢測”可獲取程式碼和模型檔案~
1) 從Python官網下載並安裝Python 3,並安裝pip。
下載地址:
https://python.org
https://pip.pypa.io/en/stable/installing/
2)用pip安裝下列依賴
找到Pyhthon安裝目錄下的Scripts檔案夾,如C:XXX PythonPython36Scripts,開啟cmd命令視窗,依次輸入下列安裝命令即可。
Tensorflow:
pip install tensorflow
2.Numpy:
pip install numpy
3.SciPy
pip install scipy
4.OpenCV
pip install opencv-python
5.Pillow
pip install pillow
6.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
註:在安裝ImageAI時如果出現異常,可先下載.whl檔案,並放在Scripts檔案夾下,用下列命令進行安裝:
pip install 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),然後將下述程式碼寫入此檔案。接著將RetinaNet模型檔案、FirstDetection.py和你想檢測的圖片放在同一路徑下,並將圖片命名為“image.jpg”。
下麵是FirstDetection.py中的10行程式碼:
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()
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執行程式碼,並稍等片刻,識別結果就會在控制檯打印出來。一旦結果在控制檯輸出,在包含FirstDetection.py的檔案夾裡,你會發現一張新儲存的圖片,檔案名為“imagenew.jpg”。
註:如果執行程式碼時出現下列異常
則需要安裝Numpy+MKL依賴,下載對應的.whl檔案並放在Scripts檔案夾下,用pip安裝.whl檔案即可。
下載地址:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy
檢測結果
來看看下麵這2張示例圖片以及經過檢測後儲存的新圖片。
檢測前:
檢測後:
檢測結果:
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
程式碼解釋
下麵我們來解釋一下這10行程式碼的含義。
from imageai.Detection import ObjectDetection
import os
execution_path = os.getcwd()
上面3行程式碼中,第一行匯入ImageAI的標的檢測類,第二行匯入Python的os類,第三行定義一個變數,用來儲存Python檔案、RetianNet模型檔案和圖片所在檔案夾的路徑。
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還支援配置標的檢測過程中的其他功能。例如,將檢測到的每個標的的圖片單獨提取出來。透過簡單地把extract_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%,如果檢測結果的機率值低於50%,則不顯示檢測結果。你可以根據具體需求對該閾值進行修改。
Custom Objects Detection(自定義標的檢測)
使用提供的CustomObject類,你可以讓檢測結果只顯示特定型別的標的。
Detection Speeds(檢測速度)
可以將檢測速度設定為“fast”、“ faster”和“fastest”,以減少檢測圖片所需的時間。
Input Types(輸入型別)
你可以解析並修改影象的檔案路徑,其中,Numpy陣列,或是圖片檔案流都可以作為輸入型別。
Output Types(輸出型別)
你可以修改detectObjectsFromImage 函式的傳回結果,例如傳回圖片檔案或Numpy陣列。
本文作者:文摘菌
源自:
https://yq.aliyun.com/articles/604457?utm_content=m_1000004720