[英]Mask RCNN OpenVino - C++ API
I would like to implement a custom image classifier using MaskRCNN. 我想使用MaskRCNN实现自定义图像分类器。
In order to increase the speed of the network, i would like to optimise the inference. 为了提高网络速度,我想优化推理。
I already used OpenCV DNN library, but i would like to do a step forward with OpenVINO. 我已经使用过OpenCV DNN库,但是我想使用OpenVINO向前迈出一步。
I used successfully OpenVINO Model optimiser (python), to build the .xml and .bin file representing my network. 我成功地使用OpenVINO模型优化器(python)构建了代表我的网络的.xml和.bin文件。
I successfully builded OpenVINO Sample directory with Visual Studio 2017 and run MaskRCNNDemo project. 我使用Visual Studio 2017成功构建了OpenVINO Sample目录并运行MaskRCNNDemo项目。
mask_rcnn_demo.exe -m .\Release\frozen_inference_graph.xml -i .\Release\input.jpg
InferenceEngine:
API version ............ 1.4
Build .................. 19154
[ INFO ] Parsing input parameters
[ INFO ] Files were added: 1
[ INFO ] .\Release\input.jpg
[ INFO ] Loading plugin
API version ............ 1.5
Build .................. win_20181005
Description ....... MKLDNNPlugin
[ INFO ] Loading network files
[ INFO ] Preparing input blobs
[ WARNING ] Image is resized from (4288, 2848) to (800, 800)
[ INFO ] Batch size is 1
[ INFO ] Preparing output blobs
[ INFO ] Loading model to the plugin
[ INFO ] Start inference (1 iterations)
Average running time of one iteration: 2593.81 ms
[ INFO ] Processing output blobs
[ INFO ] Detected class 16 with probability 0.986519: [2043.3, 1104.9], [2412.87, 1436.52]
[ INFO ] Image out.png created!
[ INFO ] Execution successful
Then i tried to reproduce this project in a separate project... First i had to watch dependancies... 然后,我尝试在一个单独的项目中重现该项目。首先,我不得不观察依赖关系。
<MaskRCNNDemo>
//References
<format_reader/> => Open CV Images, resize it and get uchar data
<ie_cpu_extension/> => CPU extension for un-managed layers (?)
//Linker
format_reader.lib => Format Reader Lib (VINO Samples Compiled)
cpu_extension.lib => CPU extension Lib (VINO Samples Compiled)
inference_engined.lib => Inference Engine lib (VINO)
opencv_world401d.lib => OpenCV Lib
libiomp5md.lib => Dependancy
... (other libs)
With it i've build a new project, with my own classes and way to open images (multiframe tiff). 有了它,我就建立了一个新项目,有了自己的类和打开图像的方式(多帧tiff)。 This work without problem then i will not describe (i use with a CV DNN inference engine without problem).
这项工作没有问题,那么我将不再描述(我与CV DNN推理引擎一起使用没有问题)。
I wanted to build the same project than MaskRCNNDemo : CustomIA 我想构建与MaskRCNNDemo相同的项目:CustomIA
<CustomIA>
//References
None => I use my own libtiff way to open image and i resize with OpenCV
None => I will just add include to cpu_extension source code.
//Linker
opencv_world345d.lib => OpenCV 3.4.5 library
tiffd.lib => Libtiff Library
cpu_extension.lib => CPU extension compiled with sample
inference_engined.lib => Inference engine lib.
I added the following dll to the project target dir : 我将以下dll添加到项目目标目录:
cpu_extension.dll
inference_engined.dll
libiomp5md.dll
mkl_tiny_omp.dll
MKLDNNPlugind.dll
opencv_world345d.dll
tiffd.dll
tiffxxd.dll
I successfully compiled and execute but i faced two issues : 我成功编译并执行,但是遇到两个问题:
OLD CODE: 旧代码:
slog::info << "Loading plugin" << slog::endl;
InferencePlugin plugin = PluginDispatcher({ FLAGS_pp, "../../../lib/intel64" , "" }).getPluginByDevice(FLAGS_d);
/** Loading default extensions **/
if (FLAGS_d.find("CPU") != std::string::npos) {
/**
* cpu_extensions library is compiled from "extension" folder containing
* custom MKLDNNPlugin layer implementations. These layers are not supported
* by mkldnn, but they can be useful for inferring custom topologies.
**/
plugin.AddExtension(std::make_shared<Extensions::Cpu::CpuExtensions>());
}
/** Printing plugin version **/
printPluginVersion(plugin, std::cout);
OUTPUT : 输出:
[ INFO ] Loading plugin
API version ............ 1.5
Build .................. win_20181005
Description ....... MKLDNNPlugin
NEW CODE: 新代码:
VINOEngine::VINOEngine()
{
// Loading Plugin
std::cout << std::endl;
std::cout << "[INFO] - Loading VINO Plugin..." << std::endl;
this->plugin= PluginDispatcher({ "", "../../../lib/intel64" , "" }).getPluginByDevice("CPU");
this->plugin.AddExtension(std::make_shared<Extensions::Cpu::CpuExtensions>());
printPluginVersion(this->plugin, std::cout);
OUTPUT : 输出:
[INFO] - Loading VINO Plugin...
000001A242280A18 // Like memory adress ???
Second Issue : 第二期:
When i try to extract my ROI and masks from New Code, if i have a "match", i always have : 当我尝试从新代码中提取投资回报率和蒙版时,如果我有一个“匹配项”,我总是会:
But the mask looks well extracted... 但是面膜看起来很好提取...
New Code : 新代码:
float score = box_info[2];
if (score > this->Conf_Threshold)
{
// On reconstruit les coordonnées de la box..
float x1 = std::min(std::max(0.0f, box_info[3] * Image.cols), static_cast<float>(Image.cols));
float y1 = std::min(std::max(0.0f, box_info[4] * Image.rows), static_cast<float>(Image.rows));
float x2 = std::min(std::max(0.0f, box_info[5] * Image.cols), static_cast<float>(Image.cols));
float y2 = std::min(std::max(0.0f, box_info[6] * Image.rows), static_cast<float>(Image.rows));
int box_width = std::min(static_cast<int>(std::max(0.0f, x2 - x1)), Image.cols);
int box_height = std::min(static_cast<int>(std::max(0.0f, y2 - y1)), Image.rows);
Image is resized from (4288, 2848) to (800, 800)
Detected class 62 with probability 1: [4288, 0], [4288, 0]
Then it is impossible for me to place the mask in the image and resize it while i don't have correct bbox coordinate... 然后当我没有正确的bbox坐标时,我不可能将蒙版放置在图像中并调整其大小...
Do anybody have an idea about what i make badly ? 有人对我做得不好有想法吗?
How to create and link correctly an OpenVINO project using cpu_extension ? 如何使用cpu_extension正确创建和链接OpenVINO项目?
Thanks ! 谢谢 !
First issue with version: look above printPluginVersion function, you will see overloaded std::ostream operators for InferenceEngine and plugin version info. 版本的第一个问题:在printPluginVersion函数上方,您将看到InferenceEngine和插件版本信息的重载std :: ostream运算符。
Second: You can try to debug your model by comparing output after very first convolution and output layer for original framework and OV. 第二:您可以尝试通过对原始框架和OV进行第一个卷积和输出层比较后的输出来调试模型。 Make sure it's equal element by element.
确保每个元素都相等。
In OV you can use network.addOutput("layer_name") to add any layer to output. 在OV中,您可以使用network.addOutput(“ layer_name”)将任何图层添加到输出中。 Then read output by using: const Blob::Ptr debug_blob = infer_request.GetBlob("layer_name").
然后使用以下命令读取输出:const Blob :: Ptr debug_blob = infer_request.GetBlob(“ layer_name”)。
Most of the time with issues like this i finding missing of input pre-processing (mean, normalization, etc.) 大多数时候,我会遇到诸如此类的问题,我发现缺少输入预处理(均值,规范化等)。
cpu_extensions is a dynamic library, but you still can change cmake script to make it static and link it with your application. cpu_extensions是一个动态库,但是您仍然可以更改cmake脚本以使其静态并与应用程序链接。 After that you would need to use your application path with call to IExtensionPtr extension_ptr = make_so_pointer(argv[0])
之后,您需要将应用程序路径与对IExtensionPtr的调用一起使用extension_ptr = make_so_pointer(argv [0])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.