手把手教你使用LabVIEW實現Mask R-CNN影像實例分割
前面給大家介紹了使用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 機器學習。