手把手教你使用LabVIEW實現Mask R-CNN影象範例分割

2022-11-02 15:00:53

前言

前面給大家介紹了使用LabVIEW工具包實現影象分類,目標檢測,今天我們來看一下如何使用LabVIEW實現Mask R-CNN影象範例分割。


一、什麼是影象範例分割?

影象範例分割(Instance Segmentation)是在語意檢測(Semantic Segmentation)的基礎上進一步細化,分離物件的前景與背景,實現畫素級別的物件分離。並且影象的語意分割與影象的範例分割是兩個不同的概念,語意分割僅僅會區別分割出不同類別的物體,而範例分割則會進一步的分割出同一個類中的不同範例的物體。

計算機視覺中常見的一些任務(分類,檢測,語意分割,範例分割)

在這裡插入圖片描述

二、什麼是Mask R-CNN

在這裡插入圖片描述

Mask R-CNN是一個範例分割(Instance segmentation)演演算法,可以用來做「目標檢測」、「目標範例分割」、「目標關鍵點檢測」。 Mask R-CNN演演算法步驟:

  • 首先,輸入一幅你想處理的圖片,然後進行對應的預處理操作,或者預處理後的圖片;

  • 將其輸入到一個預訓練好的神經網路中(ResNeXt等)獲得對應的feature map;

  • 對這個feature map中的每一點設定預定的ROI,從而獲得多個候選ROI;

  • 將這些候選的ROI送入RPN網路進行二值分類(前景或背景)和BB迴歸,過濾掉一部分候選的ROI

  • 接著,對這些剩下的ROI進行ROIAlign操作(即先將原圖和feature map的pixel對應起來,然後

  • feature map和固定的feature對應起來);

  • 最後,對這些ROI進行分類(N類別分類)、BB迴歸和MASK生成(在每一個ROI裡面進行FCN操作)

三、LabVIEW呼叫Mask R-CNN影象範例分割模型

1、Mask R-CNN模型獲取及轉換

  • 安裝pytorch和torchvision

  • 獲取torchvision中的模型(我們獲取預訓練好的模型):

model = models.detection.maskrcnn_resnet50_fpn(pretrained=True) 
  • 轉onnx

 1 def get_pytorch_onnx_model(original_model):
 2     model=original_model
 3     # define the directory for further converted model save
 4     onnx_model_path = dirname
 5     
 6     # define the name of further converted model
 7     onnx_model_name = "maskrcnn_resnet50.onnx"
 8  9     # create directory for further converted model
10     os.makedirs(onnx_model_path, exist_ok=True)
11 12     # get full path to the converted model
13     full_model_path = os.path.join(onnx_model_path, onnx_model_name)
14     model.eval()
15 16     x = torch.rand(1, 3, 640, 640)
17     # model export into ONNX format
18     torch.onnx.export(
19         original_model,
20         x,
21         full_model_path,
22         input_names=["input"],
23         output_names=["boxes", "labels", "scores", "masks"],
24         dynamic_axes={"input": [0, 1, 2, 3],"boxes": [0, 1],"labels": [0],"scores": [0],"masks": [0, 1, 2, 3]},
25         verbose=True,opset_version=11
26     )
27 28     return full_model_path

 

完整獲取及模型轉換python程式碼如下:

 1 import os
 2 import torch
 3 import torch.onnx
 4 from torch.autograd import Variable
 5 from torchvision import models
 6  7 dirname, filename = os.path.split(os.path.abspath(__file__))
 8 print(dirname)
 9 10 def get_pytorch_onnx_model(original_model):
11     model=original_model
12     # define the directory for further converted model save
13     onnx_model_path = dirname
14     
15     # define the name of further converted model
16     onnx_model_name = "maskrcnn_resnet50.onnx"
17 18     # create directory for further converted model
19     os.makedirs(onnx_model_path, exist_ok=True)
20 21     # get full path to the converted model
22     full_model_path = os.path.join(onnx_model_path, onnx_model_name)
23     model.eval()
24 25     x = torch.rand(1, 3, 640, 640)
26     # model export into ONNX format
27     torch.onnx.export(
28         original_model,
29         x,
30         full_model_path,
31         input_names=["input"],
32         output_names=["boxes", "labels", "scores", "masks"],
33         dynamic_axes={"input": [0, 1, 2, 3],"boxes": [0, 1],"labels": [0],"scores": [0],"masks": [0, 1, 2, 3]},
34         verbose=True,opset_version=11
35     )
36 37     return full_model_path
38 39 40 model = models.detection.maskrcnn_resnet50_fpn(pretrained=True)
41 print(get_pytorch_onnx_model(model))

2、LabVIEW呼叫 Mask R-CNN (mask rcnn.vi)

注意:Mask R-CNN模型是沒辦法使用OpenCV dnn去載入的,因為有些運算元不支援,所以我們主要使用LabVIEW開放神經網路互動工具包(ONNX)來載入推理模型。

  • onnxruntime呼叫onnx模型並選擇加速方式

 

在這裡插入圖片描述

 

  • 影象預處理

 

    在這裡插入圖片描述

 

  • 執行推理 我們使用的模型是:maskrcnn_resnet50_fpn,其輸出有四層,分別為boxes,labels,scores,masks,資料型別如下:

 

在這裡插入圖片描述

 

  • 可以看到,labels的型別為INT64,所以我們的原始碼中需要「Get_Rresult_int64.vi,index為1,因為labels為第二層,即下標為1;

 

在這裡插入圖片描述

 

  • 另外三個輸出我們都可以使用float32來獲取了,masks雖然資料型別是uint8,但在實操過程中發現,它其實做過歸一化處理了,也可以使用float32.

 

在這裡插入圖片描述

 

  • 後處理並實現範例分割 因為後處理內容較多,所以直接封裝為了一個子VI, mask_rcnn_post_process.vi,原始碼如下:

 

在這裡插入圖片描述

 

  • 整體的程式框架如下:

 

在這裡插入圖片描述

 

 

在這裡插入圖片描述

 

  • 範例分割結果如下,我們會發現這個模型跑起來,他花的時間比之前就更長了。因為他不但要獲取每一個物件的區域,還要也要把這個區域的輪廓給框出來,我們可以看到五個人及籃球都框出來了,使用不同的顏色分割出來了。

在這裡插入圖片描述

3、LabVIEW呼叫 Mask R-CNN 實現實時影象分割(mask rcnn_camera.vi)

整體思想和上面檢測圖片的實力分割差不多,不過使用了攝像頭,並加了一個迴圈,對每一幀物件進行實力分割,3080系列顯示卡可選擇TensorRT加速推理,分割會更加流暢。我們發現這個模型其實很考驗檢測數量的,所以如果你只是對人進行分割,那可以選擇一個乾淨一些的背景,整體檢測速度就會快很多。 在這裡插入圖片描述 在這裡插入圖片描述

四、Mask-RCNN訓練自己的資料集(檢測行人)

1.準備工作

  • 訓練需要jupyterlab環境,沒有安裝的同學需要通過pip install jupyterlab 安裝

  • 如果無法解決jupyterlab環境 可以使用colab或者kaggle提供的免費gpu環境進行訓練

  • 訓練原始碼:mask-rcnn.ipynb

2.開始訓練

  • 根據提示執行這段程式碼,自動或手動下載依賴檔案資料集並建立資料集解析類

在這裡插入圖片描述

  • 定義單輪訓練的函數:網路結構直接採用torchvison裡現有的,不再重新定義

在這裡插入圖片描述

  • 出現如下輸出表示訓練進行中

在這裡插入圖片描述

  • 修改這個檔名,改成自己的圖片名字,執行看下訓練效果

在這裡插入圖片描述

3、訓練效果

在這裡插入圖片描述

4、匯出ONNX

在這裡插入圖片描述


總結

以上就是今天要給大家分享的內容。大家可關注微信公眾號: VIRobotics,回覆關鍵字:Mask R-CNN影象範例分割原始碼  獲取本次分享內容的完整專案原始碼及模型。

如果有問題可以在評論區裡討論,提問前請先點贊支援一下博主哦,如您想要探討更多關於LabVIEW與人工智慧技術,歡迎加入我們的技術交流群:705637299,進群請備註暗號:LabVIEW 機器學習。

如果文章對你有幫助,歡迎關注、點贊、收藏