本文转载自OpenCV学堂。

模型介绍

OpenVINO支持Mask-RCNN与yolact两种实例分割模型的部署,其中Mask-RCNN系列的实例分割网络是OpenVINO官方自带的,直接下载即可,yolact是来自第三方的公开模型库。

这里以instance-segmentation-security-0050模型为例说明,该模型基于COCO数据集训练,支持80个类别的实例分割,加上背景为81个类别。

OpenVINO支持部署Faster-RCNN与Mask-RCNN网络时候输入的解析都是基于两个输入层,它们分别是:

im_data : NCHW=[1x3x480x480]
im_info: 1x3 三个值分别是H、W、Scale=1.0

输出有四个,名称与输出格式及解释如下:

  • name: classes, shape: [100, ]
    预测的100个类别可能性,值在[0~1]之间

  • name: scores: shape: [100, ]
    预测的100个Box可能性,值在[0~1]之间

  • name: boxes, shape: [100, 4]
    预测的100个Box坐标,左上角与右下角,基于输入的480x480

  • name: raw_masks, shape: [100, 81, 28, 28]
    Box ROI区域的实例分割输出,81表示类别(包含背景),28x28表示ROI大小。

上面都是官方文档给我的关于模型的相关信息,但是我发现该模型的实际推理输raw_masks输出格式大小为:100x81x14x14这个算文档没更新吗?

代码演示

这边的代码输出层跟输入层都不止一个,所以为了简化,我用了两个for循环设置了输入与输出数据精度,然后直接通过hardcode来获取推理之后各个输出层对应的数据部分,首先获取类别,根据类别ID与Box的索引,直接获取实例分割mask,然后随机生成颜色,基于mask实现与原图BOX ROI的叠加,产生了实例分割之后的效果输出。完整的演示代码分为下面几步:

IE引擎初始化与模型加载

InferenceEngine::Core ie;
std::vector<std::string> coco_labels;
read_coco_labels(coco_labels);
cv::RNG rng(12345);cv::Mat src = cv::imread("D:/images/sport-girls.png");
cv::namedWindow("input", cv::WINDOW_AUTOSIZE);
int im_h = src.rows;
int im_w = src.cols;InferenceEngine::CNNNetwork network = ie.ReadNetwork(xml, bin);
InferenceEngine::InputsDataMap inputs = network.getInputsInfo();
InferenceEngine::OutputsDataMap outputs = network.getOutputsInfo();

设置输入与输出数据格式

std::string image_input_name = "";
std::string image_info_name = "";
int in_index = 0;
for (auto item : inputs) {if (in_index == 0) {image_input_name = item.first;auto input_data = item.second;input_data->setPrecision(Precision::U8);input_data->setLayout(Layout::NCHW);}else {image_info_name = item.first;auto input_data = item.second;input_data->setPrecision(Precision::FP32);}in_index++;
}for (auto item : outputs) {std::string output_name = item.first;auto output_data = item.second;output_data->setPrecision(Precision::FP32);std::cout << "output name: " << output_name << std::endl;
}

设置blob输入数据与推理

auto executable_network = ie.LoadNetwork(network, "CPU");
auto infer_request = executable_network.CreateInferRequest();auto input = infer_request.GetBlob(image_input_name);
matU8ToBlob<uchar>(src, input);auto input2 = infer_request.GetBlob(image_info_name);
auto imInfoDim = inputs.find(image_info_name)->second->getTensorDesc().getDims()[1];
InferenceEngine::MemoryBlob::Ptr minput2 = InferenceEngine::as<InferenceEngine::MemoryBlob>(input2);
auto minput2Holder = minput2->wmap();
float *p = minput2Holder.as<InferenceEngine::PrecisionTrait<InferenceEngine::Precision::FP32>::value_type *>();
p[0] = static_cast<float>(inputs[image_input_name]->getTensorDesc().getDims()[2]);
p[1] = static_cast<float>(inputs[image_input_name]->getTensorDesc().getDims()[3]);
p[2] = 1.0f;infer_request.Infer();

解析输出结果

auto scores = infer_request.GetBlob("scores");
auto boxes = infer_request.GetBlob("boxes");
auto clazzes = infer_request.GetBlob("classes");
auto raw_masks = infer_request.GetBlob("raw_masks");
const float* score_data = static_cast<PrecisionTrait<Precision::FP32>::value_type*>(scores->buffer());
const float* boxes_data = static_cast<PrecisionTrait<Precision::FP32>::value_type*>(boxes->buffer());
const float* clazzes_data = static_cast<PrecisionTrait<Precision::FP32>::value_type*>(clazzes->buffer());
const auto raw_masks_data = static_cast<PrecisionTrait<Precision::FP32>::value_type*>(raw_masks->buffer());
const SizeVector scores_outputDims = scores->getTensorDesc().getDims();
const SizeVector boxes_outputDims = boxes->getTensorDesc().getDims();
const SizeVector mask_outputDims = raw_masks->getTensorDesc().getDims();
const int max_count = scores_outputDims[0];
const int object_size = boxes_outputDims[1];
printf("mask NCHW=[%d, %d, %d, %d]\n", mask_outputDims[0], mask_outputDims[1], mask_outputDims[2], mask_outputDims[3]);
int mask_h = mask_outputDims[2];
int mask_w = mask_outputDims[3];
size_t box_stride = mask_h * mask_w * mask_outputDims[1];
for (int n = 0; n < max_count; n++) {float confidence = score_data[n];float xmin = boxes_data[n*object_size] * w_rate;float ymin = boxes_data[n*object_size + 1] * h_rate;float xmax = boxes_data[n*object_size + 2] * w_rate;float ymax = boxes_data[n*object_size + 3] * h_rate;if (confidence > 0.5) {cv::Scalar color(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));cv::Rect box;float x1 = std::min(std::max(0.0f, xmin), static_cast<float>(im_w));float y1 = std::min(std::max(0.0f,ymin), static_cast<float>(im_h));float x2 = std::min(std::max(0.0f, xmax), static_cast<float>(im_w));float y2 = std::min(std::max(0.0f, ymax), static_cast<float>(im_h));box.x = static_cast<int>(x1);box.y = static_cast<int>(y1);box.width = static_cast<int>(x2 - x1);box.height = static_cast<int>(y2 - y1);int label = static_cast<int>(clazzes_data[n]);std::cout <<"confidence: "<< confidence<<" class name: "<< coco_labels[label] << std::endl;// 解析maskfloat* mask_arr = raw_masks_data + box_stride * n + mask_h * mask_w * label;cv::Mat mask_mat(mask_h, mask_w, CV_32FC1, mask_arr);cv::Mat roi_img = src(box);cv::Mat resized_mask_mat(box.height, box.width, CV_32FC1);cv::resize(mask_mat, resized_mask_mat, cv::Size(box.width, box.height));cv::Mat uchar_resized_mask(box.height, box.width, CV_8UC3,color);roi_img.copyTo(uchar_resized_mask, resized_mask_mat <= 0.5);cv::addWeighted(uchar_resized_mask, 0.7, roi_img, 0.3, 0.0f, roi_img);cv::putText(src, coco_labels[label].c_str(), box.tl()+(box.br()-box.tl())/2, cv::FONT_HERSHEY_PLAIN, 1.0, cv::Scalar(0, 0, 255), 1, 8);}
}

最终程序测试结果:

END

备注:部署

模型压缩与应用部署交流群

模型压缩、网络压缩、神经网络加速、轻量级网络设计、知识蒸馏、应用部署、MNN、NCNN等技术,

若已为CV君其他账号好友请直接私信。

我爱计算机视觉

微信号:aicvml

QQ群:805388940

微博知乎:@我爱计算机视觉

投稿:amos@52cv.net

网站:www.52cv.net

在看,让更多人看到  

OpenVINO 部署 Mask-RCNN 实例分割相关推荐

  1. mask rcnn实例分割_使用Mask-RCNN的实例分割

    mask rcnn实例分割 In this article, I will be creating my own trained model for detecting potholes. For d ...

  2. 有空就学学的实例分割1——Tensorflow2搭建Mask R-CNN实例分割平台

    有空就学学的实例分割1--Tensorflow2搭建Mask R-CNN实例分割平台 学习前言 什么是Mask R-CNN 源码下载 Mask R-CNN实现思路 一.预测部分 1.主干网络介绍 2. ...

  3. OpenCV4.0 Mask RCNN 实例分割示例 C++/Python实现

    点击我爱计算机视觉标星,更快获取CVML新技术 前几天OpenCV4.0-Alpha发布,其中新增实例分割Mask RCNN模型是这次发布的亮点之一. 图像实例分割即将图像中目标检测出来并进行像素级分 ...

  4. 利用边缘监督信息加速Mask R-CNN实例分割训练

    (欢迎关注"我爱计算机视觉"公众号,一个有价值有深度的公众号~) 今天跟大家分享一篇有意思的arXiv上新出的论文,作者来自德国宝马汽车公司(BMW Car IT GmbH,Ger ...

  5. mask rcnn 实例分割的数据集制作

    这篇博客是 基于 Google Colab 的 mask rcnn 训练自己的数据集(以实例分割为例)文章中 数据集的制作 这部分的一些补充 温馨提示: 实例分割是针对同一个类别的不同个体或者不同部分 ...

  6. Ubuntu18.04 配置detectron2实现Faster RCNN目标检测和Mask RCNN实例分割(一)

    1. 背景介绍 detectron2项目地址:https://github.com/facebookresearch/detectron2 FasterRCNN论文:https://arxiv.org ...

  7. Mask Rcnn目标分割-项目搭建及跑通测试代码

    本文介绍了Mask Rcnn目标分割项目的搭建及运行过程,并对搭建过程中可能出现的问题进行了解答. 环境:Cuda10.2+tensorflow-gpu1.13.2 Mask R-CNN是一个实例分割 ...

  8. Mask Rcnn目标分割-训练自己数据集-详细步骤

    本文接着介绍了Mask Rcnn目标分割算法如何训练自己数据集,对训练所需的文件以及训练代码进行详细的说明. 本文详细介绍在只有样本图片数据时,如果建立Mask Rcnn目标分割训练数据集的步骤.过程 ...

  9. PaddleX---Mask RCNN实例分割

    PaddleX简介:PaddleX是飞桨全流程开发工具,集飞桨核心框架.模型库.工具及组件等深度学习开发所需全部能力于一身,打通深度学习开发全流程,并提供简明易懂的Python API,方便用户根据实 ...

  10. 何恺明团队推出Mask^X R-CNN,将实例分割扩展到3000类

    翻译 | AI科技大本营(ID:rgznai100) 参与 | shawn,刘畅 今年10月,何恺明的论文"Mask R-CNN"摘下ICCV 2017的最佳论文奖(Best Pa ...

最新文章

  1. numpy 数组抽取_Python 关于NumPy的用法介绍
  2. 【GNN】硬核!一文梳理经典图网络模型
  3. LPTHW 笨方法学习python 16章
  4. kafka启动_Kafka安装部署——单节点
  5. 鸿蒙系统的升级名单,定档6月2日!鸿蒙“首批”升级名单公布,共计11款华为机型!...
  6. 3.过滤——比较过滤结果、2D中的移动平均线_2
  7. 进阶Java架构师必看书:大型架构+框架+性能优化+中间件+分布式
  8. 再获国际顶级荣誉,平头哥首席科学家谢源荣获2020年度IEEE CS技术成就奖
  9. DBUtils的概述
  10. 支付宝批量转账接口使用全过程 一一介绍
  11. Fedora系统配置中文输入法
  12. 三门峡市新型智慧城市顶层设计方案通过专家评审
  13. 计算机无法同步,win7系统电脑无法同步时间的解决方法
  14. c语言输出行末无空格_三个简单的C语言程序
  15. java捕鱼增值版游戏下载_捕鱼游戏 java
  16. Apahce虚拟主机与伪静态
  17. FPGA之IP核的使用、搞懂功能仿真和时序仿真
  18. [Java高并发系列(5)][详细]Java中线程池(1)--基本概念介绍
  19. PostgreSQL 空间st_contains,st_within空间包含搜索优化 - 降IO和降CPU(bound box)
  20. 广州咏春拳的基本功1-3式

热门文章

  1. 时域补零对于DFT谱的影响
  2. ss模型复模态的物理意义及adams复模态振型求解
  3. 小波变换(wavelet transform)的通俗解释(二)
  4. 设定pic单片机端口为输入_PIC单片机IO端口的软件/硬件可靠性使用方法讨论
  5. springboot 做表白墙_经贸吐槽墙 |2020.12.13
  6. Code Blocks 10 05的安装及使用
  7. mac android通知中心,少数派一周快读:iOS 8 输入法大比拼,升级 Mac 新系统的 6 项准备,如何保持 Android 通知栏整洁...
  8. php无限评论回复_php如何制作无限级评论功能?
  9. mysql win10 无法配置文件_MySQL设置文件无法更改的处理方案详细说明(Win10)
  10. javascript map 排序_1Keys仅用1 kb的JavaScript制作钢琴