1. 程式人生 > >利用ImageAI庫只需幾行python程式碼超簡實現目標檢測

利用ImageAI庫只需幾行python程式碼超簡實現目標檢測

目錄

  • 什麼是目標檢測
  • 目標檢測演算法
    • Two Stages
    • One Stage
  • python實現
    • 依賴
    • 安裝
    • 使用
  • 附錄

什麼是目標檢測

目標檢測關注影象中特定的物體目標,需要同時解決解決定位(localization) + 識別(Recognition)。相比分類,檢測給出的是對圖片前景和背景的理解,我們需要從背景中分離出感興趣的目標,並確定這一目標的描述(類別和位置),因此檢測模型的輸出是一個列表,列表的每一項使用一個數組給出檢出目標的類別和位置(常用矩形檢測框的座標表示)。

通俗的說,Object Detection的目的是在目標圖中將目標用一個框框出來,並且識別出這個框中的是啥,而且最好的話是能夠將圖片的所有物體都框出來。

目標檢測演算法

目前目標檢測領域的深度學習方法主要分為兩類:兩階段(Two Stages)的目標檢測演算法;一階段(One Stage)目標檢測演算法。

Two Stages

首先由演算法(algorithm)生成一系列作為樣本的候選框,再通過卷積神經網路進行樣本(Sample)分類。也稱為基於候選區域(Region Proposal)的演算法。常見的演算法有R-CNN、Fast R-CNN、Faster R-CNN等等。

One Stage

不需要產生候選框,直接將目標框定位的問題轉化為迴歸(Regression)問題處理,也稱為基於端到端(End-to-End)的演算法。常見的演算法有YOLO、SSD等等。

python實現

本文主要講述如何實現目標檢測,至於背後的原理不過多贅述,可以去看相關的論文。

ImageAI是一個簡單易用的計算機視覺Python庫,使得開發者可以輕鬆的將最新的最先進的人工智慧功能整合進他們的應用。

ImageAI本著簡潔的原則,支援最先進的機器學習演算法,用於影象預測,自定義影象預測,物體檢測,視訊檢測,視訊物件跟蹤和影象預測訓練。

依賴

  • Python 3.5.1(及更高版本)
  • pip3
  • Tensorflow 1.4.0(及更高版本)
  • Numpy 1.13.1(及更高版本)
  • SciPy 0.19.1(及更高版本)
  • OpenCV
  • pillow
  • Matplotlib
  • h5py
  • Keras 2.x

安裝

  • 命令列安裝
pip3 install https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.1/imageai-2.0.1-py3-none-any.whl
  • 下載imageai-2.1.0-py3-none-any.whl 安裝檔案並在命令列中指定安裝檔案的路徑
pip3 install .\imageai-2.1.0-py3-none-any.whl

使用

Image支援的深度學習的演算法有RetinaNet,YOLOv3,TinyYoLOv3。ImageAI已經在COCO資料集上預先訓練好了對應的三個模型,根據需要可以選擇不同的模型。可以通過下面的連結進行下載使用:

  • Download RetinaNet Model - resnet50_coco_best_v2.0.1.h5
  • Download YOLOv3 Model - yolo.h5
  • Download TinyYOLOv3 Model - yolo-tiny.h5

以上模型可以檢測並識別以下80種不同的目標:

person,   bicycle,   car,   motorcycle,   airplane,
bus,   train,   truck,   boat,   traffic light,   fire hydrant, stop_sign,
parking meter,   bench,   bird,   cat,   dog,   horse,   sheep, cow,
elephant,   bear,   zebra,   giraffe,   backpack,   umbrella,
handbag,   tie,   suitcase, frisbee,   skis,   snowboard,  
sports ball,   kite,   baseball bat,   baseball glove,   skateboard,
surfboard,   tennis racket,   bottle,   wine glass,   cup,   fork,   knife,
spoon,   bowl, banana,   apple,   sandwich,   orange,   broccoli,   carrot,
hot dog,   pizza,   donot,   cake,   chair,   couch,   potted plant,   bed,
dining table,   toilet,   tv,   laptop,   mouse,   remote,   keyboard,
cell phone,   microwave,   oven,   toaster,   sink,   refrigerator,
book,   clock,   vase,   scissors,   teddy bear,   hair dryer,
toothbrush

先來看看完整的程式碼,使用YOLOv3演算法對13張照片進行目標識別。

from imageai.Detection import ObjectDetection
import os

detector = ObjectDetection()
detector.setModelTypeAsYOLOv3()
detector.setModelPath("./model/yolo.h5")
detector.loadModel()

path = os.getcwd()
input_image_list = os.listdir(path+"\pic\input")
input_image_list = sorted(input_image_list, key = lambda i:len(i),reverse = False)
size = len(input_image_list)
for i in range(size):
    input_image_path = os.path.join(path+"\pic\input", input_image_list[i])
    output_image_path = os.path.join(path+"\pic\output", input_image_list[i])
    detections, extract_detected_objects = detector.detectObjectsFromImage(input_image=input_image_path,
                                                 output_image_path=output_image_path,
                                                 extract_detected_objects=True)
    print('------------------- %d -------------------' % int(i + 1))
    for eachObject in detections:
        print(eachObject["name"], " : ", eachObject["percentage_probability"], " : ", eachObject["box_points"])
    print('------------------- %d -------------------' % int(i + 1))

首先第一行匯入ImageAI Object Detection類,在第二行匯入os庫。
然後建立了ObjectDetection類的新例項,接著就可以選擇要使用的演算法。分別有以下三個函式:

.setModelTypeAsRetinaNet() 
.setModelTypeAsYOLOv3()
.setModelTypeAsTinyYOLOv3()

選擇好演算法之後就要設定模型檔案路徑,這裡給出的路徑必須要和選擇的演算法一樣。

.setModelPath() 
- 引數path(必須):模型檔案的路徑

載入模型。

.loadModel()
- 引數detection_speed(可選):最多可以減少80%的時間,單身會導致精確度的下降。可選的值有: “normal”, “fast”, “faster”, “fastest” 和 “flash”。預設值是 “normal”。

通過os庫的函式得到輸入輸出檔案的路徑等,這不是本文重點,跳過不表。
開始對影象進行目標檢測。

.detectObjectsFromImage()
- 引數input_image(必須):待檢測影象的路徑
- 引數output_image(必須):輸出影象的路徑
- 引數parameter minimum_percentage_probability(可選):能接受的最低預測概率。預設值是50%。
- 引數display_percentage_probability(可選):是否展示預測的概率。預設值是True。
- 引數display_object_name(可選):是否展示識別物品的名稱。預設值是True。
- 引數extract_detected_objects(可選):是否將識別出的物品圖片儲存。預設是False。

返回值根據不同的引數也有不同,但都會返回一個an array of dictionaries。字典包括以下幾個屬性:

* name (string)
* percentage_probability (float)
* box_points (tuple of x1,y1,x2 and y2 coordinates)

前面說過可以識別80種目標,在這裡也可以選擇只識別自己想要的目標。

custom = detector.CustomObjects(person=True, dog=True)

detections = detector.detectCustomObjectsFromImage( custom_objects=custom, input_image=os.path.join(execution_path , "image3.jpg"), output_image_path=os.path.join(execution_path , "image3new-custom.jpg"), minimum_percentage_probability=30)

首先用定義自己想要的目標,其餘的目標會被設定為False。然後配合.detectCustomObjectsFromImage()進行目標檢測。

主要的程式碼基本如上所述,接下來看結果。先看看圖片中只有一個目標的效果。

------------------- 10 -------------------
dog  :  98.83476495742798  :  (117, 91, 311, 360)
dog  :  99.24255609512329  :  (503, 133, 638, 364)
dog  :  99.274742603302  :  (338, 38, 487, 379)
------------------- 10 -------------------

效果還是不錯的。再看看如果圖片中有多個目標識別的結果如何。

------------------- 4 -------------------
book  :  55.76887130737305  :  (455, 74, 487, 146)
book  :  82.22097754478455  :  (466, 11, 482, 69)
tv  :  99.34800863265991  :  (25, 40, 182, 161)
bed  :  88.7190580368042  :  (60, 264, 500, 352)
cat  :  99.54025745391846  :  (214, 125, 433, 332)
------------------- 4 -------------------

識別度還是很高的,背後人眼都看不清的書本都能被識別。

附錄

GitHub:https://github.com/Professorchen/Computer-Vision/tree/master/object-detec