天天看點

目标檢測必須要OpenCV?10行Python代碼也能實作,親測好用!

短短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行)

準備工作

文摘菌測試環境為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指令視窗,依次輸入下列安裝指令即可。

  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

  1. H5py

pip install h5py

  1. Keras

pip install keras

  1. 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”。

注:如果運作代碼時出現下列異常:

目标檢測必須要OpenCV?10行Python代碼也能實作,親測好用!

則需要安裝Numpy+MKL依賴,下載下傳對應的.whl檔案并放在Scripts檔案夾下,用pip安裝.whl檔案即可。

https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy

檢測結果

來看看下面這2張示例圖檔以及經過檢測後儲存的新圖檔。

檢測前:

目标檢測必須要OpenCV?10行Python代碼也能實作,親測好用!

檢測後:

目标檢測必須要OpenCV?10行Python代碼也能實作,親測好用!

檢測結果:

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

目标檢測必須要OpenCV?10行Python代碼也能實作,親測好用!

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

文摘菌測試了另外幾張圖檔,結果如下:

目标檢測必須要OpenCV?10行Python代碼也能實作,親測好用!
目标檢測必須要OpenCV?10行Python代碼也能實作,親測好用!
目标檢測必須要OpenCV?10行Python代碼也能實作,親測好用!

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

目标檢測必須要OpenCV?10行Python代碼也能實作,親測好用!

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)
           

我們用第一個示例圖檔提取出來的檢測結果如圖所示:

目标檢測必須要OpenCV?10行Python代碼也能實作,親測好用!

參數配置

為了滿足目标檢測的生産需求,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

本文作者:文摘菌

本文來自雲栖社群合作夥伴“

大資料文摘

”,了解相關資訊可以關注“

”。