![教你用10行Python代碼實現目標檢測(附代碼)](http://p2.ttnews.xyz/loading.gif)
本文約2729字,建議閱讀6分鐘。
本文介紹了一個名為ImageAI 的Python庫,集成了現今流行的深度學習框架和計算機視覺庫,手把手教你構建自己的目標檢測應用。
![教你用10行Python代碼實現目標檢測(附代碼)](http://p2.ttnews.xyz/loading.gif)
後臺私信回覆“0706”,可獲取代碼和模型文件。
短短10行代碼就可以實現目標檢測?!
本文作者和他的團隊構建了一個名為ImageAI 的Python庫,集成了現今流行的深度學習框架和計算機視覺庫。本文將手把手教你構建自己的第一個目標檢測應用,而且小編已經幫你踩過坑了,親測有效!
無人超市、人臉識別、無人駕駛,眾多的使用場景及案例,使得“目標檢測”正成為計算機視覺最有前景的方向。
聽起來似乎是個很難實現的技術,需要大量訓練數據和算法才能完成。事實上,本文作者開發了一個基於Python的函數庫,可以用十行代碼高效實現目標檢測。
還不熟悉的讀者,我們先來看看,目標檢測到底是什麼,以及軟件開發人員面臨的挑戰。
目標檢測是藉助於計算機和軟件系統在圖像/場景中,定位目標並識別出每個目標的類別的技術。 目前已廣泛用於人臉檢測、車輛檢測、行人計數、網絡圖像、安全系統和無人駕駛汽車等領域。隨著計算機技術不斷髮展和軟件開發人員的不懈努力,未來目標檢測技術將更廣泛的普及開來。
在應用程序和系統中使用先進的目標檢測方法,以及基於這些方法構建新的應用程序並不容易。早期目標檢測是基於經典算法而實現的,如 OpenCV(廣受歡迎的計算機視覺庫)所支持的一些算法。然而,這些經典算法的性能會因條件而受到限制。
2012年,深度學習領域取得眾多突破,學者們提出了一系列全新、高精度的目標檢測算法和方法,比如R-CNN, Fast-RCNN, Faster-RCNN, RetinaNet,以及既快又準的SSD和YOLO等。要使用這些基於深度學習的方法和算法(當然深度學習也是基於機器學習),需要對數學和深度學習框架有很深的理解。數百萬的軟件開發人員致力於整合目標檢測技術進行新產品的開發。但是想要理解這項技術並加以使用,對非深度學習領域的程序員來說並不容易。
一位自學了計算機的開發者Moses Olafenwa在幾個月前意識到了這個問題,並與同伴一起開發了一個名叫ImageAI的Python函數庫。
ImageAI可以讓程序員和軟件開發者只用幾行代碼,就能輕易地把最先進的計算機視覺技術整合到他們現有的以及新的應用程序裡面。
用ImageAI實現目標檢測,你只需要以下步驟:
- 安裝Python
- 安裝ImageAI和相關函數庫
- 下載目標檢測模型文件
- 運行示例代碼(只有10行)
準備工作
這個測試環境為Windows 64位系統,Python版本為3.6。
從Python官網下載並安裝Python 3,並安裝pip。
下載地址:
https://python.org
https://pip.pypa.io/en/stable/installing/
用pip安裝下列依賴
找到Pyhthon安裝目錄下的Scripts文件夾,如C:\XXX \Python\Python36\Scripts,打開cmd命令窗口,依次輸入下列安裝命令即可。
1. 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
7. H5py:
pip install h5py
8. Keras:
pip install keras
9. 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
下載用於目標檢測的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
檢測結果:
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
另外測試了幾張圖片,結果如下:
檢測前:
檢測後:
檢測結果:
car : 59.04694199562073
car : 50.62631368637085
car : 71.59191966056824
car : 52.60368585586548
person : 76.51243805885315
car : 56.73831105232239
car : 50.02853870391846
car : 94.18612122535706
car : 70.23521065711975
car : 75.06842017173767
car : 87.21032738685608
car : 89.46954607963562
person : 73.89532923698425
bicycle : 90.31689763069153
bus : 65.3587281703949
竟然可以檢測出牛……
檢測結果:
person : 55.15214800834656
person : 62.79672980308533
person : 69.01599168777466
person : 67.26776957511902
person : 75.51649808883667
person : 52.9820442199707
person : 67.23594665527344
person : 69.77047920227051
person : 83.80664587020874
person : 61.785924434661865
person : 82.354336977005
person : 93.08169484138489
cow : 84.69656705856323
檢測結果:
person : 65.07909297943115
person : 65.68368077278137
person : 68.6377465724945
person : 83.80006551742554
person : 85.69389581680298
person : 55.40691018104553
person : 56.62997364997864
person : 58.07020664215088
person : 70.90385556221008
person : 95.06895542144775
代碼解釋
下面我們來解釋一下這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數組。
詳細的說明文檔在GitHub上。
GitHub鏈接:
https://github.com/OlafenwaMoses/ImageAI
後臺私信回覆“0706”,可獲取代碼和模型文件。
相關報道:
https://towardsdatascience.com/object-detection-with-10-lines-of-code-d6cb4d86f606
閱讀更多 THU數據派 的文章