From e483747877944b0a80955394144f7b945febcbd5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Dmitry=20Mozolev/AI=20Tools=20Lab=20/SRR/Engineer/=EC=82=BC?= =?utf8?q?=EC=84=B1=EC=A0=84=EC=9E=90?= Date: Tue, 24 Jul 2018 11:37:29 +0300 Subject: [PATCH] Add nnc Caffe importer plugin (#746) Incorporated nnc Caffe importer to the nnc plugin system. Signed-off-by: Dmitry Mozolev --- .../nnc/libs/frontend/caffe/src/caffe_plugin.cpp | 110 +++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 contrib/nnc/libs/frontend/caffe/src/caffe_plugin.cpp diff --git a/contrib/nnc/libs/frontend/caffe/src/caffe_plugin.cpp b/contrib/nnc/libs/frontend/caffe/src/caffe_plugin.cpp new file mode 100644 index 0000000..5719f65 --- /dev/null +++ b/contrib/nnc/libs/frontend/caffe/src/caffe_plugin.cpp @@ -0,0 +1,110 @@ +#include +#include +#include + +#include "PluginType.h" +#include "PluginInstance.h" +#include "PluginException.h" +#include "ConfigException.h" + +#include "caffe_importer.h" + +namespace +{ + +const std::string pluginName = "Caffe importer"; +const std::string pluginVersion = "0.0.1"; +const std::string pluginDesc = "Converts Caffe model to Model IR"; + +const auto pluginType = nncc::contrib::plugin::typeFrontEnd; + +const auto inputFilenameOption = "input-filename"; + +using namespace nncc::contrib::config; +using namespace nncc::contrib::plugin; + +class ImporterPlugin : public AbstractPluginInstance +{ +public: + ImporterPlugin &operator=(const ImporterPlugin &) = delete; + ImporterPlugin(const ImporterPlugin &) = delete; + + static AbstractPluginInstance &getInstance(); + void fillSession() override; + void checkConfig() override; + void *execute(void *data) override; + + void setParam(const std::string &name) override; + void setParam(const std::string &name, const std::string &value) override; + +private: + std::string _filename; + +private: + ImporterPlugin() = default; + ~ImporterPlugin() override = default; +}; + +AbstractPluginInstance &ImporterPlugin::getInstance() +{ + static ImporterPlugin instance; + return instance; +} + +void ImporterPlugin::fillSession() +{ + static std::map info = {{"module description", pluginDesc}}; + + static std::vector moduleParams = + {{inputFilenameOption, "path to Caffe model file", false}}; + + AbstractPluginInstance::fillSessionBase(pluginType, pluginVersion, pluginName); + + for (auto &i : info) + getSession()->addInfo(i.first, i.second); + + for (auto &p : moduleParams) + getSession()->registerParam(p); +} + +void ImporterPlugin::checkConfig() +{ +} + +void *ImporterPlugin::execute(void *) +{ + nncc::contrib::frontend::caffe::CaffeImporter importer{_filename}; + + bool success = importer.import(); + + if (!success) + { + throw nncc::contrib::PluginException("Could not load model: " + _filename + "\n"); + }; + + return importer.createIR(); +} + +void ImporterPlugin::setParam(const std::string &name) +{ + throw nncc::contrib::ConfigException("unsupported parameter <" + name + ">"); +} + +void ImporterPlugin::setParam(const std::string &name, const std::string &value) +{ + if (name == inputFilenameOption) + { + _filename = value; + } + else + { + throw nncc::contrib::ConfigException("unsupported parameter <" + name + ">"); + } +} + +} // anonymous namespace + +extern "C" AbstractPluginInstance *get_instance() +{ + return &ImporterPlugin::getInstance(); +} -- 2.7.4