盤點一下不到100行的給力程式碼

景略集智發表於2018-07-22

本文首發自集智專欄

盤點一下不到100行的給力程式碼

只需10行Python程式碼,我們就能實現計算機視覺中目標檢測。

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"] )
複製程式碼

沒錯,用這寥寥10行程式碼,就能實現目前AI產品中應用廣泛的目標檢測技術。

看完了程式碼,下面容我們聊聊目標檢測背後的技術背景,並解讀這10行Python程式碼的由來和實現原理。

目標檢測簡介

人工智慧的一個重要領域就是計算機視覺,它是指計算機及軟體系統識別和理解影象與視訊的科學。計算機視覺包含很多細分方向,比如影象識別、目標檢測、影象生成和影象超解析度等。其中目標檢測由於用途廣泛,在計算機視覺領域的意義最為深遠。

目標檢測是指計算機和軟體系統能夠定位出影象/畫面中的物體,並識別出它們。目標檢測技術已經廣泛應用於人臉檢測、車輛檢測、人流量統計、網路影象、安防系統和無人車等領域。和其它計算機視覺技術一樣,目標檢測未來會進一步成為人工智慧的重要組成部分,有著廣闊的發展前景。

不過,在軟體應用和系統中使用現代目標檢測方法以及根據這些方法建立應用,並非簡單直接。早期的目標檢測實現主要是應用一些經典演算法,比如OpenCV中支援的演算法。然而這些演算法的表現並不穩定,在不同情況下差異巨大。

2012年深度學習技術的突破性進展,催生了一大批高度精準的目標檢測演算法,比如R-CNN,Fast-RCNN,Faster-RCNN,RetinaNet和既快又準的SSD及YOLO。使用這些基於深度學習的方法和演算法,需要理解大量的數學和深度學習框架。現在全世界有數以百萬計的開發者在藉助目標檢測技術創造新產品新專案,但由於理解和使用較為複雜困難,仍有很多人不得要領。

為了解決這個困擾開發者們的問題,計算機視覺專家Moses Olafenwa帶領團隊推出了Python庫ImageAI,能讓開發人員只需寥寥數行程式碼就能很容易的將最先進的計算機視覺技術應用到自己的專案和產品中。

我們開頭所示的10行程式碼實現,就是要用到ImageAI。

如何藉助ImageAI輕鬆實現目標檢測

使用ImageAI執行目標檢測,你只需以下4步:

1.在電腦上安裝Python

2.安裝ImageAI及其環境依賴

3.下載目標檢測模組檔案

4.執行示例程式碼,就是我們展示的那10行

下面我們一步步詳細講解。

1)從Python官網下載和安裝Python 3

python.org/

2)通過pip安裝如下環境依賴

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
複製程式碼

github.com

3)通過該連結下載RetinaNet 模型檔案用於目標檢測。

到了這裡我們已經安裝好了所有依賴,就可以準備寫自己的首個目標檢測程式碼了。 建立一個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所在的資料夾,你就會發現有新的影象儲存在了裡面。比如下面兩張示例影象,以及執行目標檢測後儲存的兩張新影象。

目標檢測之前:

盤點一下不到100行的給力程式碼
盤點一下不到100行的給力程式碼
目標檢測之後:
盤點一下不到100行的給力程式碼
盤點一下不到100行的給力程式碼

我們可以看到影象上顯示了檢測出的物體名稱及概率。

解讀10行程式碼

下面我們解釋一下這10行程式碼的工作原理。

from imageai.Detection import ObjectDetection
import os

execution_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.detectObjectFromImage函式返回的所有結果,然後列印出第二行中模型對影象上每個物體的檢測結果(名稱和概率)。

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)
複製程式碼

我們用前面的第一張影象作為例子,可以得到影象中檢測到的各個物體的單獨影象:

盤點一下不到100行的給力程式碼

ImageAI提供了很多功能,能夠用於各類目標檢測任務的自定義和生產部署。包括:

-調整最小概率:預設概率小於50%的物體不會顯示,如有需要,你可以自行調整這個數字。

-自定義目標檢測:使用提供的CustomObject類,你可以檢測一個或多個特定物體。

-調整檢測速度:可以通過將檢測速度設為“快”“更快”“最快”三個不同等級,調整檢測速度。

-輸入輸出型別:你可以自定義影象的路徑,Numpy陣列或影象的檔案流為輸入輸出。

誠然,單看這10行程式碼每一行,談不上驚豔,也藉助了不少庫,但是僅用10行程式碼就能讓我們輕鬆實現之前很麻煩的目標檢測,還是能談得上“給力”二字。

更多功能和詳情,請檢視GitHub

參考資料:towardsdatascience.com


0806期《人工智慧-從零開始到精通》

限時折扣中!

戳這裡看詳情

談笑風生 線上程式設計 瞭解一下? (前25位同學還可領取¥200優惠券哦)

盤點一下不到100行的給力程式碼

相關文章