IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 手把手教你使用LabVIEW实现Mask R-CNN图像实例分割 -> 正文阅读

[人工智能]手把手教你使用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图像实例分割源码??获取本次分享内容的完整项目源码及模型。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:28:48  更:2022-11-05 00:32:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年3日历 -2024/3/29 3:28:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码