Маска RCNN OpenVino - API C++
Я хотел бы реализовать собственный классификатор изображений с использованием MaskRCNN.
Чтобы увеличить скорость сети, я бы хотел оптимизировать логический вывод.
Я уже использовал библиотеку DNC OpenCV, но я хотел бы сделать шаг вперед с OpenVINO.
Я успешно использовал Оптимизатор моделей OpenVINO (python) для создания файлов.xml и.bin, представляющих мою сеть.
Я успешно создал каталог OpenVINO Sample с 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
Затем я попытался воспроизвести этот проект в отдельном проекте... Сначала я должен был посмотреть зависимости...
<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)
С его помощью я создаю новый проект, со своими собственными классами и способом открытия изображений (мультикадр TIFF). Эта работа без проблем, тогда я не буду описывать (я использую с механизмом вывода 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
- у1= у2=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);
Image is resized from (4288, 2848) to (800, 800)
Detected class 62 with probability 1: [4288, 0], [4288, 0]
Тогда я не могу поместить маску в изображение и изменить ее размер, пока у меня нет правильной координаты bbox...
У кого-нибудь есть представление о том, что я делаю плохо?
Как правильно создать и связать проект OpenVINO, используя cpu_extension?
Спасибо!
0 ответов
Первая проблема с версией: посмотрите выше функцию 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])