Add Caffe importer interface implementation (#541)
authorDmitry Mozolev/AI Tools Lab /SRR/Engineer/삼성전자 <d.mozolev@samsung.com>
Tue, 10 Jul 2018 14:42:51 +0000 (17:42 +0300)
committerSergey Vostokov/AI Tools Lab /SRR/Staff Engineer/삼성전자 <s.vostokov@samsung.com>
Tue, 10 Jul 2018 14:42:51 +0000 (23:42 +0900)
Added initial version of Caffe importer interface implementation
that uses model visitor to create Model IR.

Signed-off-by: Dmitry Mozolev <d.mozolev@samsung.com>
contrib/nnc/libs/frontend/caffe/include/caffe_importer.h [new file with mode: 0644]
contrib/nnc/libs/frontend/caffe/src/caffe_importer.cpp [new file with mode: 0644]

diff --git a/contrib/nnc/libs/frontend/caffe/include/caffe_importer.h b/contrib/nnc/libs/frontend/caffe/include/caffe_importer.h
new file mode 100644 (file)
index 0000000..b8c12b0
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef NNCC_CAFFE_IMPORTER_H
+#define NNCC_CAFFE_IMPORTER_H
+
+#include <string>
+#include <memory>
+
+#include "caffe/proto/caffe.pb.h"
+
+#include "nn_importer.h"
+
+namespace nncc
+{
+namespace contrib
+{
+namespace frontend
+{
+namespace caffe
+{
+
+using namespace ::caffe;
+
+class CaffeImporter : public common::NNImporter
+{
+public:
+    explicit CaffeImporter(std::string filename) : modelFilename(std::move(filename)) {};
+
+    bool import() override;
+    void* createIR() override;
+    void dump() override;
+
+private:
+    std::string modelFilename;
+    std::unique_ptr<NetParameter> net;
+};
+
+} // namespace caffe
+} // namespace frontend
+} // namespace contrib
+} // namespace nncc
+
+#endif // NNCC_CAFFE_IMPORTER_H
diff --git a/contrib/nnc/libs/frontend/caffe/src/caffe_importer.cpp b/contrib/nnc/libs/frontend/caffe/src/caffe_importer.cpp
new file mode 100644 (file)
index 0000000..e126d3a
--- /dev/null
@@ -0,0 +1,50 @@
+#include <fstream>
+#include <sstream>
+
+#include "caffe_walker.h"
+#include "caffe_model_visitor.h"
+#include "caffe_dump_visitor.h"
+#include "caffe_importer.h"
+#include "proto_reader.h"
+
+namespace nncc
+{
+namespace contrib
+{
+namespace frontend
+{
+namespace caffe
+{
+
+bool CaffeImporter::import()
+{
+    GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+    net.reset(new NetParameter());
+
+    // import success flag is returned
+    return util::readProtoFromBinaryFile(modelFilename.c_str(), net.get());
+}
+
+void* CaffeImporter::createIR()
+{
+    ModelVisitor irCreator;
+    ModelWalker caffeWalker(&irCreator);
+
+    caffeWalker.walkNetParameter(*net);
+
+    return irCreator.getGraph();
+}
+
+void CaffeImporter::dump()
+{
+    DumpVisitor dumper;
+    ModelWalker caffeWalker(&dumper);
+
+    caffeWalker.walkNetParameter(*net);
+}
+
+} // namespace caffe
+} // namespace frontend
+} // namespace contrib
+} // namespace nncc