OpenVINO部署Mask-RCNN实例分割网络
点击上方“3D视觉工坊”,选择“星标”
干货第一时间送达
极市导读
OpenVINO是英特尔推出的一款全面的工具套件,用于快速部署应用和解决方案,支持计算机视觉的CNN网络结构超过150余种。本文展示了用OpenVINO部署Mask-RCNN实例分割网络的详细过程及代码演示。
模型介绍
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坐标,左上角与右下角,基于输入的480x480name: 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; // 解析mask float* 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); }}
最终程序测试结果:
本文仅做学术分享,如有侵权,请联系删文。
下载1
在「3D视觉工坊」公众号后台回复:3D视觉,即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。
下载2
在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总,即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。
下载3
在「3D视觉工坊」公众号后台回复:相机标定,即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配,即可下载独家立体匹配学习课件与视频网址。
重磅!3DCVer-学术论文写作投稿 交流群已成立
扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。
同时也可申请加入我们的细分方向交流群,目前主要有3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。
一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。
▲长按加微信群或投稿
▲长按关注公众号
3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近3000星球成员为创造更好的AI世界共同进步,知识星球入口:
学习3D视觉核心技术,扫描查看介绍,3天内无条件退款
圈里有高质量教程资料、可答疑解惑、助你高效解决问题
觉得有用,麻烦给个赞和在看~
OpenVINO部署Mask-RCNN实例分割网络相关推荐
- 有空就学学的实例分割1——Tensorflow2搭建Mask R-CNN实例分割平台
有空就学学的实例分割1--Tensorflow2搭建Mask R-CNN实例分割平台 学习前言 什么是Mask R-CNN 源码下载 Mask R-CNN实现思路 一.预测部分 1.主干网络介绍 2. ...
- mask rcnn实例分割_使用Mask-RCNN的实例分割
mask rcnn实例分割 In this article, I will be creating my own trained model for detecting potholes. For d ...
- OpenCV4.0 Mask RCNN 实例分割示例 C++/Python实现
点击我爱计算机视觉标星,更快获取CVML新技术 前几天OpenCV4.0-Alpha发布,其中新增实例分割Mask RCNN模型是这次发布的亮点之一. 图像实例分割即将图像中目标检测出来并进行像素级分 ...
- 利用边缘监督信息加速Mask R-CNN实例分割训练
(欢迎关注"我爱计算机视觉"公众号,一个有价值有深度的公众号~) 今天跟大家分享一篇有意思的arXiv上新出的论文,作者来自德国宝马汽车公司(BMW Car IT GmbH,Ger ...
- mask rcnn 实例分割的数据集制作
这篇博客是 基于 Google Colab 的 mask rcnn 训练自己的数据集(以实例分割为例)文章中 数据集的制作 这部分的一些补充 温馨提示: 实例分割是针对同一个类别的不同个体或者不同部分 ...
- Ubuntu18.04 配置detectron2实现Faster RCNN目标检测和Mask RCNN实例分割(一)
1. 背景介绍 detectron2项目地址:https://github.com/facebookresearch/detectron2 FasterRCNN论文:https://arxiv.org ...
- Mask Rcnn目标分割-项目搭建及跑通测试代码
本文介绍了Mask Rcnn目标分割项目的搭建及运行过程,并对搭建过程中可能出现的问题进行了解答. 环境:Cuda10.2+tensorflow-gpu1.13.2 Mask R-CNN是一个实例分割 ...
- Mask Rcnn目标分割-训练自己数据集-详细步骤
本文接着介绍了Mask Rcnn目标分割算法如何训练自己数据集,对训练所需的文件以及训练代码进行详细的说明. 本文详细介绍在只有样本图片数据时,如果建立Mask Rcnn目标分割训练数据集的步骤.过程 ...
- 使用CityScapes数据集训练实例分割网络YOLACT
#2020开年第一篇,谁能预料新年伊始的世界如此脆弱,中国疫情肆虐,美伊箭拔弩张,英国愤懑脱欧,儿时的偶像科比和女儿也不幸离世,生命之渺小,生活之曲折,兄弟们,要充满阳光地活着啊,人间,值得.:-)今 ...
最新文章
- AI视频行为分析系统项目复盘——技术篇1:Ubuntu 18.04部署编译OpenCV+contrib、TensorFlow2.1、CUDA10.1+cuDNN7.6.5、tensorRT6.0.1等
- 26 进程优先级队列Queue
- python3入门到精通pdf-总算知道python3入门到精通
- C++中getline函数的使用
- python提供了方法用于读取文本文件内容_python提供了哪三种方法用于读取文本文件的内容?...
- linux文件读写 文件锁、select、poll【转】
- 点云插值:三维平面参数确定-不共线三点的平面方程
- 将 ASP.NET Core 2.1 升级到最新的长期支持版本ASP.NET Core 3.1
- Java----前端验证之验证码额实现
- CSS布局奇淫技巧之--各种居中
- 吃货阶段01 类的定义 方法的布局 0925
- 开源软件 依赖_新的开源依赖项管理器在场
- Spring IOC学习心得之Bean对IOC容器的感知
- python读取csv数据出错_在python中读取csv文件时出现错误“no such file or directory”...
- 十字链表法和邻接多重表法
- xp查看计算机mac地址查询,如何查看mac地址 xp系统查看查询mac地址方法介绍
- 深度学习(一)优化算法之随机梯度下降法(SGD)详解
- 通过log查看camera sensor型号
- BLDC无刷直流电机
- Java代码给csv文件加水印_如何给文件加上水印?
热门文章
- 【Java接口】限制App登录次数
- Jsch报错:com.jcraft.jsch.JSchException: session is down
- 前缀、真前缀、后缀、真后缀
- Sql Server 时间格式转换
- 抽象类可以只实现接口的一部分方法
- html_三种常见格式的特点
- 如何成为优秀的数据人经验分享
- ausu-fx80-efi黑苹果10.15.7
- mysql主从复制-介绍
- python集合和列表、安从小到大的顺序组合成一个字典_第3章 Python容器:列表、元组、字典与集合...