Mask R-CNN Keras 對象檢測 對象分割 像素掩碼

原文鏈接

Mask R-CNN Keras 對象檢測 對象分割 像素掩碼

在 2019年7月16日 上張貼 由 hotdog發表回覆

Mask R-CNN Keras
在本教程中,您將學習如何使用 Keras 和Mask R-CNN來執行實例分段(使用和不使用GPU)。
使用Mask R-CNN,我們可以執行以下兩項操作:

  1. 對象檢測,爲我們提供圖像中每個對象的(x,y)邊界框座標。
  2. 實例分割,使我們能夠爲圖像中的每個單獨對象獲取 像素掩碼

通過Mask R-CNN進行實例分割的示例可以在本教程頂部的圖像中看到 – 請注意我們不僅擁有圖像中對象的邊界框,而且還爲每個對象提供了像素方式的蒙版同樣,使我們能夠分割每個單獨的對象(僅對象檢測不會給我們的東西)。
實例分割與 Mask R-CNN 一起,推動了我們在計算機視覺中看到的“神奇”的一些最新進展,包括自動駕駛汽車,機器人等等。
在本教程的其餘部分中,您將學習如何將 Mask R-CNN 與 Keras 一起使用,包括如何在您自己的圖像上執行實例分割。
要了解有關Keras和Mask R-CNN的更多信息,請繼續閱讀!
尋找這篇文章的源代碼?
跳到下載部分。
Keras Mask R-CNN
在本教程的第一部分中,我們將簡要介紹Mask R-CNN架構。從那裏,我們將查看該項目的目錄結構,然後在我們的系統上安裝Keras + Mask R-CNN。
然後,我將向您展示如何使用 Python 實現Mask R-CNN和Keras。
最後,我們將Mask R-CNN應用於我們自己的圖像並檢查結果。
我還將分享有關如何在您自己的自定義數據集上訓練Mask R-CNN模型的資源。
Mask R-CNN 的歷史

圖1: He等人的Mask R-CNN架構。實現對象檢測和逐像素實例分割。這篇博文使用Keras來處理在COCO數據集上訓練的Mask R-CNN模型。
用於實例分割的Mask R-CNN模型已經從用於對象檢測的三個先前架構發展而來

  • R-CNN:向網絡呈現輸入圖像,在圖像上運行選擇性搜索,然後使用預先訓練的CNN將來自選擇性搜索的輸出區域用於特徵提取和分類。
  • Fast R-CNN仍然使用選擇性搜索算法來獲取區域提議,但添加了感興趣區域(ROI)池模塊。從要素圖中提取固定大小的窗口,並使用這些要素獲取最終的類標籤和邊界框。好處是網絡現在可以端到端訓練
  • Faster R-CNN引入區域提案網絡(RPN),將區域提案直接烘焙到架構中,減少了對選擇性搜索算法的需求。

Mask R-CNN 算法建立在之前 Faster R-CNN,使網絡能夠不僅執行對象檢測 而且對像素實例的分割.
項目結構
繼續使用今天博客文章的下載部分下載代碼和預先訓練的模型。讓我們來看看我們的Keras Mask R-CNN項目結構

我們的項目包括測試 圖像/ 目錄以及三個文件:

  • coco_labels .txt :由81個類別標籤的逐行列表組成。第一個標籤是“背景”類,所以通常我們說有80個類。
  • mask_rcnn_coco .h5 :我們預先訓練的Mask R-CNN模型權重文件,將從磁盤加載。
  • maskrcnn_predict .py :Mask R-CNN演示腳本加載標籤和模型/權重。從那裏,對通過命令行參數提供的測試圖像進​​行推斷。您可以使用我們自己的圖像或 “下載”中 包含的images /目錄中的任何一個進行測試 。

在我們回顧今天的腳本之前,我們將安裝Keras + Mask R-CNN,然後我們將簡要回顧COCO數據集。
安裝Keras Mask R-CNN
使用pip,git和setup .py直接引用Keras + Mask R-CNN安裝過程 。我建議您在今天的項目的專用虛擬環境中安裝這些軟件包,這樣您就不會使系統的軟件包樹複雜化。
首先,安裝所需的Python包
$ pip install numpy scipy
$ pip install pillow scikit-image matplotlib imutils
$ pip install "IPython[all]"
$ pip install tensorflow # or tensorflow-gpu
$ pip install keras h5py 如果您的計算機上安裝了GPU,CUDA和cuDNN,請務必安裝 tensorflow – gpu。
從那裏開始,通過pip從源代碼編譯來安裝OpenCV
$ pip install opencv-contrib-python接下來,我們將在Keras中安裝Mask R-CNN的Matterport實現
$ git clone https://github.com/matterport/Mask_RCNN.git
$ cd Mask_RCNN
$ python setup.py install最後,在虛擬環境中啓動Python解釋器,以驗證是否已成功安裝Mask R-CNN + Keras和OpenCV
$ python
>>> import mrcnn
>>> import cv2
>>>如果沒有導入錯誤,您的環境現在可以用於今天的博客文章。
Mask R-CNN和COCO
我們今天在這裏使用的Mask R-CNN模型是在COCO數據集上預先訓練的
此數據集包含總共80個類(加上一個背景類),您可以從輸入圖像中檢測和分割(第一個類是背景類)。我 在與此帖相關的下載中包含了名爲coco_labels .txt的標籤文件 ,但出於方便,我已將它們包含在此處:


在下一節中,我們將學習如何使用Keras和Mask R-CNN來檢測和分割這些類中的每一個。
用Keras和Python實現Mask R-CNN
讓我們開始實現Mask R-CNN分段腳本。
打開 maskrcnn_predict .py

第2-11行導入我們所需的包。
該 mrcnn 從Matterport 導入實現 Mask R-CNN的。從 mrcnn ,我們將使用 Config 創建一個自定義子類,我們的配置, modellib 加載我們的模型,以及 可視化 繪製我們的面具。
讓我們繼續並解析我們的命令行參數

我們的腳本需要三個命令行參數:

  • – weights 權重 :在COCO上預訓練的Mask R-CNN模型權重的路徑。
  • – labels :COCO類的路徑標記文本文件。
  • – image :我們的輸入圖像路徑。我們將對通過命令行提供的圖像執行實例分割。

使用第二個參數,讓我們繼續加載我們的 CLASS_NAMES 和 COLORS

第24行將COCO類標籤名稱直接從文本文件加載到列表中。
從那裏, 第28-31行爲 每個類標籤生成隨機的,不同的 顏色。該方法來自Matterport在GitHub上的Mask R-CNN實現
讓我們繼續構建我們的 SimpleConfig 類

我們的 SimpleConfig 類繼承自Matterport的Mask R-CNN Config (第33行)。
配置爲 NAME (第35行)。
從那裏我們設置 GPU_COUNT 和 IMAGES_PER_GPU (即批處理)。如果您安裝了GPU和tensorflow – gpu,那麼Keras + Mask R-CNN將自動使用您的GPU。如果沒有,將改爲使用您的CPU。
注意:我在使用單個Titan X GPU的機器上執行了今天的實驗,因此我將GPU_COUNT 設置 爲1 。雖然我的12GB GPU在技術上可以同時處理多個圖像(在訓練期間或在預測期間,如在此腳本中),但我決定設置 IMAGES_PER_GPU = 1, 因爲大多數讀者不會擁有具有儘可能多內存的GPU。如果您的GPU可以處理它,請隨意增加此值。
然後將我們的 NUM_CLASSES設置爲等於CLASS_NAMES 列表的長度 (第45行)。
接下來,我們將初始化配置並加載我們的模型

第48行實例化我們的 配置 。
然後,使用我們的 配置 , 第53-55行加載我們 在COCO數據集上預訓練的Mask R-CNN 模型。
讓我們繼續並 執行實例分割

第59-61行加載並預處理我們的 圖像 。我們的模型需要RGB格式的圖像,所以我們使用 cv2。cvtColor 交換顏色通道(相比之下OpenCV的默認BGR顏色通道排序)。
然後,65行 通過網絡執行圖像的前向傳遞, 以進行物體檢測和逐像素掩模預測。
剩下的兩個代碼塊將處理結果,以便我們可以使用OpenCV可視化對象的邊界框和掩碼

爲了可視化結果,我們首先循環對象檢測(第68行)。在循環內部,我們:

  • 獲取唯一的 classID 整數(第71行)。
  • 提取 當前檢測的 掩碼(第72行)。
  • 確定 用於 可視化 蒙版的 顏色(第73行)。
  • 使用半透明alpha 通道(第76行)在對象上 應用/繪製我們預測的像素方式蒙版

從這裏開始,我們將爲圖像中的每個對象繪製邊界框和類標籤+得分文本

第80行將我們的圖像轉換 回BGR(OpenCV的默認顏色通道排序)。
在 第83行,我們開始循環對象。在循環內部,我們:

  • 提取邊界框座標, classID , 標籤 和 分數 (第86-89行)。
  • 計算 邊界框和文本的 顏色(第90行)。
  • 繪製每個邊界框(第93行)。
  • 連接類/概率 文本 (第94行),然後在圖像頂部繪製它 (第95-97行)。

一旦完成該過程,結果輸出 圖像 將顯示在屏幕上,直到按下一個鍵(第100-101行)。
Mask R-CNN和Keras結果
現在我們已經實現了Mask R-CNN腳本,讓我們試一試。
確保您已使用本教程的下載部分下載源代碼。
您需要知道命令行參數的概念才能運行代碼。如果您不熟悉,請在嘗試執行代碼之前閱讀argparse和命令行參數
準備好後,打開終端並執行以下命令
$ python maskrcnn_predict.py --weights mask_rcnn_coco.h5 --labels coco_labels.txt \ --image images/30th_birthday.jpg


圖2:在COCO上訓練的面具R-CNN模型創建了侏羅紀公園吉普車(卡車)的像素圖,我的朋友和我在慶祝我的30歲生日時。
在我30歲生日那天,我的妻子找到了一個人帶着我們在費城的侏羅紀公園吉普車上駕駛我們- 這裏我和我最好的朋友都在自然科學院外面。
請注意,不僅爲每個對象(即人和吉普車)生成邊界框,而且還有像素方式的蒙版!
讓我們嘗試另一個圖像
$ python maskrcnn_predict.py --weights mask_rcnn_coco.h5 --labels coco_labels.txt \ --image images/couch.jpg


圖3:我的狗Janie已經使用Keras和Mask R-CNN深度學習模型從沙發和椅子上分割出來。
這是我的狗Janie的超級可愛照片,躺在沙發上:

  1. 儘管絕大多數沙發都不可見,但是 Mask R-CNN 仍然能夠將其標記爲這樣。
  2. Mask R-CNN能夠正確標記圖像中的狗。
  3. 即使我的咖啡杯幾乎看不見,Mask R-CNN也可以給杯子貼上標籤(如果你仔細觀察,你會看到我的咖啡杯是侏羅紀公園的杯子!)

Mask R-CNN無法正確標記的圖像的唯一部分是沙發的後部,它錯誤地作爲椅子 – 仔細觀察圖像,你可以看到Mask R-CNN如何犯錯誤(區域確實看起來很像椅子而不是沙發的一部分。
這是使用Keras + Mask R-CNN進行實例分割的另一個例子
$ python maskrcnn_predict.py --weights mask_rcnn_coco.h5 --labels coco_labels.txt \ --image images/page_az.jpg


圖4:Mask R-CNN分段圖像(使用Keras,TensorFlow和Matterport的Mask R-CNN實現創建)。
讓我們將Mask R-CNN應用於最終圖像
$ python maskrcnn_predict.py --weights mask_rcnn_coco.h5 --labels coco_labels.txt \ --image images/ybor_city.jpg


圖5: Keras + Mask R-CNN,帶有來自Ybor City的圖片的Python。
我最喜歡去美國的城市之一是Ybor City – 我喜歡這個地區(也許是公雞在這個城市受到保護並且可以自由地漫遊)。
在這裏你可以看到我和這樣一隻公雞 – 注意我們每個人如何被Mask R-CNN正確標記和分割。您還會注意到Mask R-CNN模型能夠對每輛車進行本地化標記總線!
Mask R-CNN可以實時運行嗎?
此時你可能想知道是否可以實時運行Keras + Mask R-CNN,對吧?
正如您在上面的Mask R-CNN的歷史部分所知,Mask R-CNN基於Faster R-CNN物體探測器。
Faster R-CNNs 令人難以置信的計算量很大,而當你在物體檢測的頂部添加例如分割,模型只變得計算昂貴,因此:

  • 在CPU上, Mask R-CNN無法實時運行。
  • 但是在GPU上, Mask R-CNN可以達到5-8 FPS。

如果您想半實時運行Mask R-CNN,則需要GPU。
摘要
在本教程中,您學習瞭如何使用Keras + Mask R-CNN來執行實例分段
與僅爲您提供圖像中對象的邊界框(x,y)座標的對象檢測不同,實例分割更進一步,爲每個對象生成像素方式的蒙版
使用實例分割我們實際上可以部分從圖像的對象。
爲了執行實例分割,我們使用了Matterport Keras + Mask R-CNN實現。
然後我們創建了一個Python腳本:

  1. 構建了Mask R-CNN的配置類(包括和不包含GPU)。
  2. 從磁盤加載Keras + Mask R-CNN架構
  3. 預處理我們的輸入圖像
  4. 檢測到圖像中的對象/蒙版
  5. 可視化結果

我希望你喜歡今天的帖子!
源代碼下載
下載鏈接 https://hotdog29.com/?p=643

原文鏈接

Mask R-CNN Keras 對象檢測 對象分割 像素掩碼


文章轉自 Adrian Rosebrock ,OpenCV Face Recognition,PyImageSearch,https://www.pyimagesearch.com/2018/09/24Keras Mask R-CNN/,2009年7月16日訪問
相關文章

 

張貼在技術博客opencv標籤:對象檢測Mask R-CNNKeras對象分割像素掩碼編輯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章