Маска RCNN OpenVino - API C ++ - PullRequest
       33

Маска RCNN OpenVino - API C ++

0 голосов
/ 07 февраля 2019

Я хотел бы реализовать собственный классификатор изображений, используя MaskRCNN.

Чтобы увеличить скорость сети, я хотел бы оптимизировать логический вывод.

Я уже использовал OpenCV DNNбиблиотеки, но я хотел бы сделать шаг вперед с OpenVINO.

Я успешно использовал оптимизатор модели OpenVINO (python), чтобы создать файлы .xml и .bin, представляющие мою сеть.

IУспешно скомпилирован пример каталога OpenVINO с Visual Studio 2017 и запущен проект 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

Oiseau VINO CPP

Затем я попытался воспроизвести этот проект в отдельном проекте... Сначала я должен был наблюдать за зависимостями ...

<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)

С его помощью я создал новый проект, со своими собственными классами и способом открытия изображений (многокадровый тифф).Эту работу без проблем я не буду описывать (я использую с механизмом вывода CV DNN без проблем).

Я хотел построить тот же проект, что и 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.

Я добавилследующий dll к целевому каталогу проекта:

cpu_extension.dll
inference_engined.dll
libiomp5md.dll
mkl_tiny_omp.dll
MKLDNNPlugind.dll
opencv_world345d.dll
tiffd.dll
tiffxxd.dll

Я успешно скомпилировал и выполнил, но столкнулся с двумя проблемами:

СТАРЫЙ КОД:

 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);

ВЫХОД:

[ INFO ] Loading plugin
    API version ............ 1.5
    Build .................. win_20181005
    Description ....... MKLDNNPlugin

НОВЫЙ КОД:

    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);

ВЫХОД:

[INFO] - Loading VINO Plugin...
000001A242280A18  // Like memory adress ???

Второй выпуск:

Когда я пытаюсь извлечь свои ROI и маски из Нового кода, если у меня есть «соответствие», у меня всегда есть:

  • оценка = 1,0
  • x1 = x2 = 0.0
  • y1 = y2 = 1.0

Но маска выглядит хорошо извлеченной ...

Новый код:

        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);

Vino Mask

Image is resized from (4288, 2848) to (800, 800)
Detected class 62 with probability 1: [4288, 0], [4288, 0]

Тогда я не могу поместить маску в изображение и изменить ее размер, пока у меня нет правильной координаты bbox ...

СделатьУ кого-нибудь есть идеи о том, что я делаю плохо?

Как правильно создать и связать проект OpenVINO с помощью cpu_extension?

Спасибо!

1 Ответ

0 голосов
/ 17 апреля 2019

Первая проблема с версией: посмотрите выше функцию printPluginVersion, вы увидите перегруженные операторы std :: ostream для InferenceEngine и информацию о версии плагина.

Второе: вы можете попробовать отладить вашу модель, сравнив вывод после самого первогосвертка и выходной слой для оригинального каркаса и OV.Убедитесь, что он равен элемент за элементом.

В OV вы можете использовать network.addOutput ("layer_name"), чтобы добавить любой слой к выводу.Затем прочитайте вывод, используя: const Blob :: Ptr debug_blob = infer_request.GetBlob ("layer_name").

В большинстве случаев с такими проблемами я обнаруживаю отсутствие предварительной обработки ввода (среднее значение, нормализация и т. Д.).)

cpu_extensions - это динамическая библиотека, но вы все равно можете изменить скрипт cmake, чтобы сделать его статичным и связать его с вашим приложением.После этого вам нужно будет использовать путь вашего приложения с вызовом IExtensionPtr extension_ptr = make_so_pointer (argv [0])

...