短短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。在大資料文摘背景回複“檢測”可擷取代碼和模型檔案~
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
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原文釋出時間為:2018-07-02
本文作者:文摘菌
本文來自雲栖社群合作夥伴“
大資料文摘”,了解相關資訊可以關注“
”。