目標檢測是指計算機和軟件系統對圖像或場景中的目標進行定位和識別的任務。
目標檢測已廣泛應用於人臉檢測、車輛檢測、人流量統計、網絡圖像、安防系統和無人駕駛等多個領域。
早期目標檢測的實現基於經典算法,比如流行的計算機視覺庫OpenCV中支持的算法。然而,這些經典算法在不同的條件下無法獲得穩定的性能。
2012年深度學習的突破性進展和迅速普及,使得R-CNN、Fast-RCNN、Faster-RCNN、RetinaNet以及快速、高度准確的SSD、YOLO等目標檢測算法應運而生。
這些基於深度學習、機器學習的算法,需要一定的數學以及深度學習框架基礎。有數百萬的專業計算機程序員和軟件開發人員想要集成和創建基於目標檢測算法的新產品。同時由於理解和實際使用較為復雜,一直無法實現。如何開發出高效的目標檢測代碼呢?
很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過后,不知道在哪里尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那么針對這三類人,我給大家提供一個好的學習平台,免費領取視頻教程,電子書籍,以及課程的源代碼!
QQ群:535820575
ImageAI就應運而生了。
01 ImageAI讓代碼變得簡潔
ImageAI是一個python庫,只需要幾行代碼,就可以讓程序員和軟件開發人員輕松地將最先進的計算機視覺技術集成到他們現有的或新的應用中,ImageAI已經在Github上開源。
Github地址: https://github.com/OlafenwaMoses/ImageAI
ImageAI目前支持使用在ImageNet-1000數據集上訓練的4種不同機器學習算法進行圖像預測和訓練。
ImageAI還支持使用在COCO數據集上訓練的RetinaNet,YOLOv3和TinyYOLOv3進行對象檢測,視頻檢測和對象跟蹤。最后,ImageAI允許訓練自定義模型,以執行新目標的檢測和識別。
ImageAI庫有依賴其他Python庫,所以在使用ImageAI開發之前還需要導入其他的包。
02准備工作
使用ImageAI實現目標檢測,只需進行以下4步:
- 在你的電腦上安裝Python
- 安裝ImageAI,配置依賴環境
- 下載目標檢測模塊文件
- 運行樣例代碼(只需10行)
下面一步步詳細展開:
(1)從Python官網下載並安裝Python3
鏈接地址:https://python.org
(2)用pip命令安裝以下依賴包:
pip install tensorflow pip install numpy pip install scipy pip install opencv-python pip install pillow pip install matplotlib pip install h5py pip install keras pip3 install imageai --upgrade
注意:第一次安裝ImageAI庫,需要下載對應版本的.whl文件,Python3的環境需要下載imageai-2.0.2-py3-none-any.whl 文件,然后轉移到相應的文件夾下,執行如下命令即可安裝:
pip install imageai-2.0.2-py3-none-any.whl
.whl文件鏈接地址:
https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.2/imageai-2.0.2-py3-none-any.whl
(3)下載用於目標檢測的RetinaNet模型文件
鏈接地址:
https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5
03開啟10行代碼的目標檢測
到這里你已經安裝好了所有的依賴項,可以開始編寫你的第一個目標檢測的代碼了。
創建一個Python文件並命名(如FirstDetection.py),然后將下面的代碼寫入該文件。將RetinaNet模型文件和要檢測的圖像復制到包含Python文件的文件夾中。
FirstDetection.py:
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所在的文件夾下找到保存下來的新圖像。
下面有兩個新圖像的示例。
目標檢測前:
目標檢測后:
在Spyder編譯器中運行結果如下所示:
輸出的目標檢測精度結果:
person : 57.20391869544983
person : 52.57977843284607
person : 70.81094980239868
person : 76.99859142303467
person : 79.40077781677246
bicycle : 81.0384213924408
person : 83.66722464561462
person : 89.41188454627991
truck : 60.61040759086609
person : 69.65749859809875
bus : 97.92424440383911
truck : 83.94358158111572
car : 72.50492572784424
在Spyder編譯器中運行結果如下所示:
輸出的目標檢測精度結果:person : 62.45866417884827
person : 58.67737531661987
person : 69.44932341575623
person : 71.84218168258667
person : 59.53381657600403
person : 54.65759038925171
motorcycle : 65.84504842758179
bus : 99.40318465232849
car : 72.41445779800415
person : 58.32530856132507
person : 54.449981451034546
person : 80.11815547943115
person : 74.30745959281921
person : 77.78302431106567
person : 71.15439772605896
bicycle : 69.92427110671997
person : 66.17957353591919
bicycle : 90.50283432006836
motorcycle : 94.09030675888062
04代碼解讀
下面來解釋一下這10行代碼的工作原理:
from imageai.Detection import ObjectDetectionimport osexecution_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"] )
在以上兩行代碼中,第一行用來對detector.detectObjectsFromImage 函數返回的所有結果進行迭代,第二行用來輸出圖片中檢測到的每個目標的名字及其概率。
05自定義目標檢測
除此外,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)
將其應用到第一張圖片上,得到如下結果:
所有行人都被很好地提取了出來,為了節約空間這里只顯示了一部分。
06 ImageAI的其他功能
ImageAI提供了許多功能,可用於目標檢測任務的自定義和部署。其支持的功能包括:
- 調整最小概率:默認情況下,概率小於50%的物體不會顯示。對於需要高精度的情況,可以增加此值;對於需要檢測所有可能對象的情況,可以減少此值。
- 自定義目標檢測:通過提供的CustomObject類,可以使檢測類檢測一個或幾個特定目標。
- 檢測速度:通過將檢測速度設置為“fast”、“faster”或“fastest”,可以減少檢測圖像所需的時間。
- 輸入類型:可指定並解析圖像的文件路徑,以Numpy數組或圖像文件流作為輸入
- 輸出類型:可指定detectObjectsFromImage函數以文件或Numpy數組的形式返回圖像
以上便是ImageAI這個目標檢測庫的介紹和演示。如果文章對你有幫助,歡迎轉發/點贊/收藏~
在這里推薦下我的Python開發學習群:535820575,群里都是學Python開發的,如果你想學或者正在學習Python ,歡迎你加入,大家都是軟件開發黨,不定期分享干貨(只有Python軟件開發相關的),包括我自己整理的一份最新的Python進階資料和高級開發教程,歡迎進階中和進想深入Python的小伙伴!
免責聲明:本文內容來源於網絡,文章版權歸原作者所有,意在傳播相關技術知識&行業趨勢,供大家學習交流,若涉及作品版權問題,請聯系刪除或授權事宜。