手把手教你使用labview实现maskr-cnn图像实例分割(含源码)(代码片段)

author author     2023-03-22     723

关键词:

(文章目录)

前言

前面给大家介绍了使用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,进群请备注暗号:LabVIEW 机器学习。

手把手教你使用labview人工智能视觉工具包快速实现图像读取与采集

(文章目录)前言今天我们一起来使用LabVIEWAI视觉工具包快速实现图像的读取与颜色空间转换、从摄像头采集图像。工具包的安装与下载方法可见之前的两篇博客。一、工具包位置已经安装好的工具包位于程序框图-函数选板-Addons-V... 查看详情

小草手把手教你labview串口仪器控制—安装使用仪器现有驱动

声明:很多仪器是没有驱动的。所以,具体问题具体分析。另外声明:所谓的驱动,也就是封装好的底层的串口通信程序,也是程序而已,只不过别人帮你做成了子VI,让自己容易用。所以:不要弄混淆了概念。国外的很多仪器... 查看详情

手把手教你使用labview人工智能视觉工具包快速实现传统opencv算子的调用(含源码)

(文章目录)前言今天我们一起来使用LabVIEWAI视觉工具包快速实现图像的滤波与增强;图像灰度处理;阈值处理与设定;二值化处理;边缘提取与特征提取等基本操作。工具包的安装与下载方法可见之前的两篇博客。一、图像滤波... 查看详情

小草手把手教你labview串口仪器控制——初识visa串口

有些人,学习一样东西时候,喜欢现成的例子。很多人学习一门技术,都喜欢现成的例子开始,比如学单片机的啊,最开始都是修改的例子吧,学语言的也是。最开始都是模仿。这个年头看书上的理论知识太浪费时间了。所以啊... 查看详情

手把手教你在java后端使用bsdiff实现增量更新(代码片段)

之前写过一篇博客是:手把手教你在Android中使用bsdiff实现文件增量更新。由于AndroidStudio自带NDK的环境,所以实现JNI是比较简单的。但是在博客中也说到了,文件差分的功能肯定是要在服务端进行的。而服务端运行的... 查看详情

手把手教你在java后端使用bsdiff实现增量更新(代码片段)

之前写过一篇博客是:手把手教你在Android中使用bsdiff实现文件增量更新。由于AndroidStudio自带NDK的环境,所以实现JNI是比较简单的。但是在博客中也说到了,文件差分的功能肯定是要在服务端进行的。而服务端运行的... 查看详情

手把手教你实现一个vue进度条组件!

最近在个人的项目中,想对页面之间跳转的过程进行优化,想到了很多文档或npm等都用到的页面跳转进度条,于是便想自己去实现一个,特此记录。来看下npm搜索组件时候的效果:so下面咱们一起动手实现一下呗。 定义使用... 查看详情

手把手教你使用labviewopencvdnn实现物体识别(objectdetection)含源码(代码片段)

(文章目录)前言今天和大家一起分享如何使用LabVIEW调用pb模型实现物体识别,本博客中使用的智能工具包可到主页置顶博客LabVIEWAI视觉工具包(非NIVision)下载与安装教程中下载一、物体识别算法原理概述1、物体识别的概念物体... 查看详情

手把手教你使用java实现一个神经网络(代码片段)

首先看一下运行效果:下面是项目整体目录:0.实现神经网络总览神经网络由层、神经元、权重、激活函数和偏置组成。每层都有一个或者多个神经元,每一个神经元都和神经输入/输出连接,这些连接就是权重。需要重点强调一... 查看详情

手把手教你实现一个vue进度条组件!(代码片段)

最近在个人的项目中,想对页面之间跳转的过程进行优化,想到了很多文档或npm等都用到的页面跳转进度条,于是便想自己去实现一个,特此记录。来看下npm搜索组件时候的效果:so下面咱们一起动手实现一下呗。定义使用方式... 查看详情

android自己定义viewgroup手把手教你实现arcmenu

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37567907逛eoe发现这种UI效果,感觉非常不错,后来知道github上有这么个开源项目~~~~当然本篇不是教你怎样使用这个开源项目,而是教你怎样自己通过自己定义ViewGroup写这种... 查看详情

手把手教你利用springboot实现各种参数校验

前言本文会详细介绍SpringValidation各种场景下的最佳实践及其实现原理,死磕到底!一键获取源码地址简单使用JavaAPI规范(JSR303)定义了Bean校验的标准validation-api,但没有提供实现。hibernatevalidation是对这个规范的实现... 查看详情

手把手教你实现一个引导动画(代码片段)

前言最近看了一些文章,知道了实现引导动画的基本原理,所以决定来自己亲手做一个通用的引导动画类。我们先来看一下具体的效果:点这里原理通过维护一个Modal实例,使用Modal的mask来隐藏掉页面的其他元素。根据用户传入... 查看详情

layui手把手教你实现多页签打开页面

在项目需求中打开的模块页面总是在一个总视图中去显示,其实在用户体验中不算太好,因为用户在A页面操作时可能需要同时去查看B页面,并且在切换页面的时候页面会进行重新加载,比较耗时、耗性能。所以在页面比较多的... 查看详情

webrtc系列-手把手教你实现一个浏览器拍照室demo(代码片段)

1.WebRTC开发背景  由于业务需求,需要在项目中实现实时音视频通话功能,之前基于浏览器开发的Web项目要进行音视频通话,需要安装flash插件才能实现或者使用C/S客户端进行通信。随着互联网技术的驱动下,在很多场景下需... 查看详情

技术分享手把手教你使用powershell内置的端口扫描器

【技术分享】手把手教你使用PowerShell内置的端口扫描器  引言想做端口扫描,NMAP是理想的选择,但是有时候NMAP并不可用。有的时候仅仅是想看一下某个端口是否开放。在这些情况下,PowerShell确实能够大放异彩。接下来... 查看详情

游戏开发实战手把手教你在unity中使用lua实现红点系统(前缀树|数据结构|设计模式|算法|含工程源码)

文章目录一、前言二、环境说明三、红点系统设计1、红点系统规则2、科普:前缀树3、用前缀树组织红点四、红点系统具体实现1、前缀树封装1.1、节点:RedpointNode.lua1.2、树:RedpointTree.lua1.2.1、创建根节点1.2.2、定义... 查看详情

手把手教你用1行命令实现人脸识别

手把手教你用1行命令实现人脸识别转载2017年11月01日00:00:00 人脸识别很难吗?--Kangvcar本文导航? 环境要求00%? 环境搭建03%? 实现人脸识别19%? 示例一(1行命令实现人脸识别):19%? 示例二(识别图片中的所有... 查看详情