玩转OpenVINO之二:试运行mask_rcnn_demo

2024-03-15 22:48

本文主要是介绍玩转OpenVINO之二:试运行mask_rcnn_demo,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

调试open_model_zoo/mask_rcnn_demo

接前面一篇,编译好了DEMO,我们继续玩转OpenVINO,试一下open_model_zoo中的模型。

假设你要调试open_model_zoo中的某个模型(注意,下面的命令中,使用你自己想用的模型,我一般是好几个同时转换,完了随机测试的)。

先是要完成Optimizer工作,转换模型得到IR文件,

命令如下

python mo_tf.py --input_model 
E:/mask_rcnn_resnet50_atrous_coco_2018_01_28/frozen_inference_graph.pb
--tensorflow_use_custom_operations_config extensions/front/tf/mask_rcnn_support.json
--tensorflow_object_detection_api_pipeline_config E:/mask_rcnn_inception_resnet_v2_atrous_coco_2018_01_28/pipeline.config

喜欢用vscode调试的朋友可以看下面的launch.json文件,

{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "Python: 当前文件","type": "python","request": "launch","program": "${file}","console": "integratedTerminal","justMyCode": false,"args": ["--input_model","E:\\mask_rcnn_resnet50_atrous_coco_2018_01_28\\frozen_inference_graph.pb", "--tensorflow_use_custom_operations_config","D:/devOpenVino/openvino_2020.3.194/deployment_tools/model_optimizer/extensions/front/tf/mask_rcnn_support.json","--tensorflow_object_detection_api_pipeline_config","E:/mask_rcnn_inception_resnet_v2_atrous_coco_2018_01_28/pipeline.config"]}]
}

如果你和我一样,没有指定输出文件名,转换完成后得到的都是frozen_inference_graph.bin和frozen_inference_graph.xml文件,要注意改成相应的模型文件名,否则多了就弄混了。

下面,我们开始用VS2019中的C++ Demo来测试这些模型。这些DEMO在我们上一讲《玩转OpenVINO_cpp samples的编译》中已经编译好了,现在拿来用。

添加路径一

如果你使用debug版本,那么环境变量path路径设置中添加

C:\IntelSWTools\openvino_2020.3.194\deployment_tools\inference_engine\bin\intel64\Debug

同时,把opencv_world430d.dll拷贝到该文件夹下面(不想拷贝的话,自己添加路径也行,反正就是让程序能找到这个dll文件)

如果是release版本,则添加

C:\IntelSWTools\openvino_2020.3.194\deployment_tools\inference_engine\bin\intel64\Release,

同时,把opencv_world430.dll拷贝到该文件夹下面

总的来说,这里有不少dll文件是intel ineference_engine要用到的。

添加路径二

还有一些路径也是必须添加的,

C:\IntelSWTools\openvino_2020.3.194\deployment_tools\inference_engine\external\tbb\bin

C:\IntelSWTools\openvino_2020.3.194\deployment_tools\ngraph\lib

调试运行

运行的项目名称是mask_rcnn_demo。

具体可参考:https://docs.openvinotoolkit.org/latest/_demos_mask_rcnn_demo_README.html

我把说明摘录一部分如下(注意:这里是linux下的格式,我后面说明中用到的是windows系统中的格式,在命令使用上有点小小的差异)

./mask_rcnn_demo -h
InferenceEngine:API version ............ <version>Build .................. <number>
mask_rcnn_demo [OPTION]
Options:-h                                Print a usage message.-i "<path>"                       Required. Path to a .bmp image.-m "<path>"                       Required. Path to an .xml file with a trained model.-l "<absolute_path>"            Required for CPU custom layers. Absolute path to a shared library with the kernels implementations.Or-c "<absolute_path>"            Required for GPU custom kernels. Absolute path to the .xml file with the kernels descriptions.-d "<device>"                     Optional. Specify the target device to infer on (the list of available devices is shown below). Use "-d HETERO:<comma-separated_devices_list>" format to specify HETERO plugin. The demo will look for a suitable plugin for a specified device (CPU by default)-detection_output_name "<string>" Optional. The name of detection output layer. Default value is "reshape_do_2d"-masks_name "<string>"            Optional. The name of masks layer. Default value is "masks"

查看帮助文档: mask_rcnn_demo --h

C:\IntelSWTools\openvino_2020.3.194\deployment_tools\open_model_zoo\demos\dev\intel64\Debug>mask_rcnn_demo --h
InferenceEngine: 00007FFCC7C49BC8mask_rcnn_demo [OPTION]
Options:-h                                Print a usage message.-i "<path>"                       Required. Path to a .bmp image.-m "<path>"                       Required. Path to an .xml file with a trained model.-l "<absolute_path>"            Required for CPU custom layers. Absolute path to a shared library with the kernels implementations.Or-c "<absolute_path>"            Required for GPU custom kernels. Absolute path to the .xml file with the kernels descriptions.-d "<device>"                     Optional. Specify the target device to infer on (the list of available devices is shown below). Use "-d HETERO:<comma-separated_devices_list>" format to specify HETERO plugin. The demo will look for a suitable plugin for a specified device (CPU by default)-detection_output_name "<string>" Optional. The name of detection output layer. Default value is "reshape_do_2d"-masks_name "<string>"            Optional. The name of masks layer. Default value is "masks"Available target devices:  CPU  GNA

这里图片必须是bmp格式。

如何输入图片地址呢?官方给出的命令如下,

./mask_rcnn_demo -i <path_to_image>/inputImage.bmp -m <path_to_model>/mask_rcnn_inception_resnet_v2_atrous_coco.xml

事实上,用命令行输入的方式, OpenVINO中由一个叫args_helper.hpp的文件来处理,其中一段的代码如下,

/**
* @brief This function find -i/--images key in input args
*        It's necessary to process multiple values for single key
* @return files updated vector of verified input files
*/
inline void parseInputFilesArguments(std::vector<std::string> &files) {std::vector<std::string> args = gflags::GetArgvs();bool readArguments = false;for (size_t i = 0; i < args.size(); i++) {if (args.at(i) == "-i" || args.at(i) == "--images") {readArguments = true;continue;}if (!readArguments) {continue;}if (args.at(i).c_str()[0] == '-') {break;}readInputFilesArguments(files, args.at(i));}
}

就是说,输入图片的格式为以下两者都可以,

-i  xyz.bmp  或者  --images <没仔细研究,这里是要文件夹吧还是xyz.bmp>

在VS2019中调试运行的话,直接把项目的调试参数设置为上述格式即可,例如,

-i J:\BigData\default.bmp -m E:\mask_rcnn_resnet50_atrous_coco_2018_01_28\frozen_inference_graph.xml

我用纯CPU试了一下这个DEBUG模式,超级慢啊!在Release模式下,随便找了一张图,大约也花了好几秒,感觉不出来哪里加快了。

当然,要琢磨的地方还很多,这里暂不涉及这些细节了,先玩起来吧。

 

 

这篇关于玩转OpenVINO之二:试运行mask_rcnn_demo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/813518

相关文章

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上,或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景: 表单处理:通过 @ModelAttribute 将表单数据绑定到模型对象上预处理逻辑:在请求处理之前

玩转Web之servlet(三)---一张图看懂B/S架构

学WEB, 首先 要明白B/S架构,本文将简单说一下小编的愚见,若有不当,欢迎大家指正。 首先,什么是B/S架构?B/S是Broweser/Server的缩写,即浏览器/服务器模式,简单说就是客户端使用浏览器,服务端使用Web服务器,客户端与服务端之间使用http协议进行通讯。 那么,为什么要使用B/S架构呢?当然是其有一定的优点:           1.传统的C/S架构 需要单独安装客户

玩转Web之Json(四)---json与(Object/List/Map)的相互转化

在做web应用时,经常需要将json转化成Object/list/map或者将Object/List/map转化成json,通过简单封装可以在写代码是减轻很多负担。本文将给出json转化的一系列方法。 闲话不 多说,直接上代码: 先是Object /List /Map转化为Json /* 功能 :将一个对象转成json数组* 参数 :object对象* retu

玩转Web之Json(三)-----easy ui怎么把前台显示的dataGird中的所有数据序列化为json,返回到后台并解析

最近做一个项目时,需要在dataGird中插入<input>,即文本输入框,当点击提交时,需要把文本框里填的数据返以及其他列的一些信息以json数组的格式返回到后台,虽然我实现了该功能,但一直没找到简便的方法,今天终于在一位版主的点拨下找到了非常简单的方法。   var all = $("#dg").datagrid("getData");var json =JSON.

玩转Web之easyui(三)-----easy ui dataGird 重新指定url以获取不同数据源信息

如果已经写了一个dataGird并且已经通过url绑定数据源,能不能在其他地方改变url使其从不同数据源获取信息,从而实现查询等操作?答案当然是肯定的,而且仅需要几行代码 $('#btnq').bind('click', function(){ $('#dg').datagrid({ url: '../servlet/Student_search' });//重新指定url$('#dg'

玩转Web之easyui(二)-----easy ui 异步加载生成树节点(Tree),点击树生成tab(选项卡)

关于easy ui 异步加载生成树及点击树生成选项卡,这里直接给出代码,重点部分代码中均有注释 前台: $('#tree').tree({ url: '../servlet/School_Tree?id=-1', //向后台传送id,获取根节点lines:true,onBeforeExpand:function(node,param){ $('#tree').tree('options'

玩转Web之easyui(一)-----easy ui datagird 分页

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。   easy ui 中数据表格的分页其实是很简单的,分页是在数据表格可以正常显示数据的基础上进行的,在这里给出servlet的代码,其中selectAll()方法是从数据库中提取所有数据, 分页的一种思路是:从数据表中取出所

QT事件处理系统之二:窗口部件的事件拦截,以及事件的传递顺序

1、案例说明 在父窗口中为selfLineEdit窗口安装事件过滤器,这样我们可以在父窗口中首先拦截来自于selfLineEdit本身产生的事件,并且决定该事件最终是否继续传递到selfLineEdit窗口本身。 2、关键代码 selfLineEdit.cpp #include "selfLineEdit.h"#include <QDebug>selfLineEdit::selfLin

构建家庭NAS之二:TrueNAS Scale规划、安装与配置

首先声明一下,我用的版本是TrueNAS SCALE 24.04.1.1(目前的最新版本),其它版本的界面和操作方式或有不同。我安装使用过程中网上的一些教程里的操作方式和这个版本不一样,造成了一些困扰。 TrueNAS SCALE的最低硬件需求: 双核64位CPU8 GB内存(推荐16GB)16 GB SSD 系统盘2个相同容量的数据盘(其实1个盘也可以,后面细讲)不需要硬件RAID卡 存储

iOS 网络相关面试题(一个基于UDP的简单的聊天Demo)

一、分别用C语言、python、GCDAsyncUdpSocket来实现UDP通信 1、C语言方式 首先初始化socket对象,Udp要用SOCK_DGRAM然后初始化sockaddr_in网络通信对象,如果作为服务端要绑定socket对象与通信链接,来接收消息然后开启一个循环,循环调用recvfrom来接收消息收到消息后,保存下发消息对象的地址,以便之后回复消息 - (void)init