手把手教你使用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
def get_pytorch_onnx_model(original_model):
    model=original_model
    # define the directory for further converted model save
    onnx_model_path = dirname
    
    # define the name of further converted model
    onnx_model_name = "maskrcnn_resnet50.onnx"

    # create directory for further converted model
    os.makedirs(onnx_model_path, exist_ok=True)

    # get full path to the converted model
    full_model_path = os.path.join(onnx_model_path, onnx_model_name)
    model.eval()

    x = torch.rand(1, 3, 640, 640)
    # model export into ONNX format
    torch.onnx.export(
        original_model,
        x,
        full_model_path,
        input_names=["input"],
        output_names=["boxes", "labels", "scores", "masks"],
        dynamic_axes={"input": [0, 1, 2, 3],"boxes": [0, 1],"labels": [0],"scores": [0],"masks": [0, 1, 2, 3]},
        verbose=True,opset_version=11
    )

    return full_model_path

完整获取及模型转换python代码如下:

import os
import torch
import torch.onnx
from torch.autograd import Variable
from torchvision import models

dirname, filename = os.path.split(os.path.abspath(__file__))
print(dirname)

def get_pytorch_onnx_model(original_model):
    model=original_model
    # define the directory for further converted model save
    onnx_model_path = dirname
    
    # define the name of further converted model
    onnx_model_name = "maskrcnn_resnet50.onnx"

    # create directory for further converted model
    os.makedirs(onnx_model_path, exist_ok=True)

    # get full path to the converted model
    full_model_path = os.path.join(onnx_model_path, onnx_model_name)
    model.eval()

    x = torch.rand(1, 3, 640, 640)
    # model export into ONNX format
    torch.onnx.export(
        original_model,
        x,
        full_model_path,
        input_names=["input"],
        output_names=["boxes", "labels", "scores", "masks"],
        dynamic_axes={"input": [0, 1, 2, 3],"boxes": [0, 1],"labels": [0],"scores": [0],"masks": [0, 1, 2, 3]},
        verbose=True,opset_version=11
    )

    return full_model_path


model = models.detection.maskrcnn_resnet50_fpn(pretrained=True)
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。

如果文章对你有帮助,欢迎关注、点赞、收藏

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在要帮助用户了解Mask R-CNN图像分割方面的应用,特别是程和实现方法。首先,我需要整理已有的信息,确保回答符合用户的要求,同时正确引用提供的参考资料。 首先,用户提到了三个引用,其中引用[1]是关于LabVIEW调用Mask R-CNN的VI文件,引用[2]是视频程,关于训练自己的数据集,引用[3]涉及原理和应用,包括人体姿态估计和关键点检测。用户的问题集中在图像分割的应用、程和实现方法,所以需要结合这些内容来回答。 接下来,我需要按照用户给出的系统级指令来组织回答。必须使用中文,行内数学公式用$...$,独立公式用$$...$$,虽然当前问题可能不涉及数学公式,但需要注意这点。还要生成相关问题,并正确引用资料。 首先,回答的结构需要清晰,分步骤说明。可能需要包括:Mask R-CNN的概述,应用场景,实现步骤(数据准备、模型训练、部署应用),以及具体的实现方法如LabVIEW调用和Python代码示例。 需要确保引用正确,比如在提到数据标注时引用[2],在应用场景时引用[3],在LabVIEW实现时引用[1]。此外,用户要求生成相关问题,所以最后要列出相关问题。 需要注意的是,用户提供的引用中,引用[3]提到了人体姿态估计和关键点检测,这可能属于实例分割的扩展应用,所以可以提到这些作为应用场景的例子。 可能的回答结构: 1. Mask R-CNN概述:结合引用[3],说明其灵活性和应用领域。 2. 应用场景:医学图像、自动驾驶、卫星图像、人体姿态估计(引用[3])。 3. 实现步骤: a. 数据准备:使用VIA工具标注(引用[2])。 b. 模型训练:训练自己的数据集(引用[2])。 c. 部署应用:LabVIEW调用(引用[1])。 4. 代码示例:Python训练代码片段,可能参考引用[2]的程。 5. 相关工具:VIA标注工具、TensorFlow或PyTorch框架。 6. 相关问题:生成3个问题,如优化方法、医学应用、与U-Net比较等。 需要检查是否有遗漏的关键点,例如,引用[3]中提到关键点使用单点掩码,这可能是在实例分割之外的功能,但用户的问题主要关于图像分割,所以可能简要提及作为应用扩展。 另外,用户可能需要具体的程步骤,所以需要详细说明数据标注、训练流程、模型调参等,但根据引用[2],课程会如何使用VIA工具,所以可以推荐该程。 最后,确保引用标识正确放置,例如在提到训练数据集时引用[2],在应用实例时引用[3],在LabVIEW实现时引用[1]。</think>### Mask R-CNN图像分割中的应用与实现方法 #### 1. **Mask R-CNN概述** Mask R-CNN是基于Faster R-CNN的扩展模型,通过添加分支预测像素级掩码(mask),实现实例分割(Instance Segmentation)。其核心优势在于同时完成目标检测(物体定位与分类)和像素级分割。例如,在医学影像中,它可以精确分割肿瘤区域[^3]。 #### 2. **应用场景** - **医学影像分析**:如细胞分割、病理切片分析。 - **自动驾驶**:道路、行人及车辆的精细分割- **卫星图像处理**:建筑物或植被的提取。 - **人体姿态估计**:通过单点掩码预测关键点位置(如关节)[^3]。 #### 3. **实现步骤与程** ##### 3.1 **数据准备** - **标注工具**:使用VIA(VGG Image Annotator)工具标注图像,生成包目标边界框(Bounding Box)和掩码的JSON文件[^2]。 - **数据集格式**:需转换为COCO格式(常用)或自定义格式。 ##### 3.2 **模型训练** 1. **框架选择**:基于TensorFlow或PyTorch实现(如Detectron2、matterport/Mask_RCNN)。 2. **代码示例(Python)**: ```python from mrcnn.config import Config from mrcnn import model as modellib class CustomConfig(Config): NAME = "custom_dataset" NUM_CLASSES = 1 + 1 # 背景 + 目标类别数 STEPS_PER_EPOCH = 100 config = CustomConfig() model = modellib.MaskRCNN(mode="training", config=config, model_dir="./logs") model.load_weights("mask_rcnn_coco.h5", by_name=True, exclude=["mrcnn_class_logits", "mrcnn_bbox_fc", "mrcnn_bbox", "mrcnn_mask"]) model.train(train_dataset, val_dataset, learning_rate=config.LEARNING_RATE, epochs=10, layers='heads') ``` ##### 3.3 **部署应用** - **实时分割**:LabVIEW通过调用预训练的Mask R-CNN模型(`mask rcnn_camera.vi`)实现摄像头实时图像分割[^1]。 - **推理优化**:使用GPU加速或模型量化(如TensorRT)提升推理速度。 #### 4. **关键技术与引用** - **掩码预测**:在ROI(Region of Interest)基础上生成二元掩码,通过全卷积网络(FCN)实现像素级分类。 - **灵活性**:可扩展至人体姿态估计,通过单点掩码定义关键点。 #### 5. **相关工具与资源** - **程推荐**:参考视频程《Mask R-CNN图像实例分割实战:训练自己的数据集》系统学习数据标注与模型训练。 - **性能调优**:在COCO数据集预训练权重基础上进行微调(Fine-tuning),减少训练时间。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

virobotics

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值