手把手教你使用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图像实例分割

文章插图