手把手教你使用LabVIEW實現Mask R-CNN圖像實例分割

前言前面給大家介紹了使用LabVIEW工具包實現圖像分類,目標檢測,今天我們來看一下如何使用LabVIEW實現Mask R-CNN圖像實例分割 。
一、什么是圖像實例分割?圖像實例分割(Instance Segmentation)是在語義檢測(Semantic Segmentation)的基礎上進一步細化,分離對象的前景與背景,實現像素級別的對象分離 。并且圖像的語義分割與圖像的實例分割是兩個不同的概念,語義分割僅僅會區別分割出不同類別的物體,而實例分割則會進一步的分割出同一個類中的不同實例的物體 。
計算機視覺中常見的一些任務(分類,檢測,語義分割,實例分割)

手把手教你使用LabVIEW實現Mask R-CNN圖像實例分割

文章插圖
二、什么是Mask R-CNN
手把手教你使用LabVIEW實現Mask R-CNN圖像實例分割

文章插圖
Mask R-CNN是一個實例分割(Instance segmentation)算法 , 可以用來做“目標檢測”、“目標實例分割”、“目標關鍵點檢測” 。Mask R-CNN算法步驟:
  • 首先,輸入一幅你想處理的圖片,然后進行對應的預處理操作,或者預處理后的圖片;
  • 將其輸入到一個預訓練好的神經網絡中(ResNeXt等)獲得對應的feature map;
  • 對這個feature map中的每一點設定預定的ROI,從而獲得多個候選ROI;
  • 【手把手教你使用LabVIEW實現Mask R-CNN圖像實例分割】將這些候選的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): 2model=original_model 3# define the directory for further converted model save 4onnx_model_path = dirname 5 6# define the name of further converted model 7onnx_model_name = "maskrcnn_resnet50.onnx" 8 ? 9# create directory for further converted model10os.makedirs(onnx_model_path, exist_ok=True)11 ?12# get full path to the converted model13full_model_path = os.path.join(onnx_model_path, onnx_model_name)14model.eval()15 ?16x = torch.rand(1, 3, 640, 640)17# model export into ONNX format18torch.onnx.export(19original_model,20x,21full_model_path,22input_names=["input"],23output_names=["boxes", "labels", "scores", "masks"],24dynamic_axes={"input": [0, 1, 2, 3],"boxes": [0, 1],"labels": [0],"scores": [0],"masks": [0, 1, 2, 3]},25verbose=True,opset_version=1126)27 ?28return 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):11model=original_model12# define the directory for further converted model save13onnx_model_path = dirname1415# define the name of further converted model16onnx_model_name = "maskrcnn_resnet50.onnx"17 ?18# create directory for further converted model19os.makedirs(onnx_model_path, exist_ok=True)20 ?21# get full path to the converted model22full_model_path = os.path.join(onnx_model_path, onnx_model_name)23model.eval()24 ?25x = torch.rand(1, 3, 640, 640)26# model export into ONNX format27torch.onnx.export(28original_model,29x,30full_model_path,31input_names=["input"],32output_names=["boxes", "labels", "scores", "masks"],33dynamic_axes={"input": [0, 1, 2, 3],"boxes": [0, 1],"labels": [0],"scores": [0],"masks": [0, 1, 2, 3]},34verbose=True,opset_version=1135)36 ?37return full_model_path38 ?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模型并選擇加速方式

手把手教你使用LabVIEW實現Mask R-CNN圖像實例分割

文章插圖
  • 圖像預處理

手把手教你使用LabVIEW實現Mask R-CNN圖像實例分割

文章插圖