Create Model IR graph from Caffe model visitor (#635)
authorDmitry Mozolev/AI Tools Lab /SRR/Engineer/삼성전자 <d.mozolev@samsung.com>
Fri, 13 Jul 2018 13:48:37 +0000 (16:48 +0300)
committerSergey Vostokov/AI Tools Lab /SRR/Staff Engineer/삼성전자 <s.vostokov@samsung.com>
Fri, 13 Jul 2018 13:48:37 +0000 (22:48 +0900)
Implemented Caffe LayerParameter visiting function to call
Caffe to Model IR operation converter.

Signed-off-by: Dmitry Mozolev <d.mozolev@samsung.com>
contrib/nnc/libs/frontend/caffe/include/caffe_model_visitor.h
contrib/nnc/libs/frontend/caffe/include/caffe_op_creator.h
contrib/nnc/libs/frontend/caffe/src/caffe_model_visitor.cpp

index 87510be..2088201 100644 (file)
@@ -9,6 +9,7 @@
 #include "nnc/core/linalg/TensorVariant.h"
 
 #include "caffe_visitor.h"
+#include "caffe_op_creator.h"
 
 namespace nncc
 {
@@ -29,7 +30,7 @@ using nncc::core::ADT::tensor::Shape;
 class ModelVisitor : public Visitor
 {
 public:
-    ModelVisitor() : graph(new Graph()) {};
+    ModelVisitor() : graph(new Graph()), opCreator(graph) {};
 
     void visit(const NetParameter&) override;
     void visit(const LayerParameter&) override;
@@ -40,6 +41,7 @@ public:
 
 private:
     Graph* graph = nullptr;
+    OpCreator opCreator;
 
     std::vector<Shape> inputShapes;
     std::map<std::string, INode::Ref> opsForBlobsTheyOutput;
index 583ec46..61d9a3a 100644 (file)
@@ -13,7 +13,6 @@
 #include "nncc/core/ADT/tensor/Shape.h"
 
 #include "caffe/proto/caffe.pb.h"
-#include "caffe_model_visitor.h"
 
 namespace nncc
 {
index c5e1198..141c6d5 100644 (file)
@@ -1,6 +1,5 @@
 #include <vector>
 #include <cassert>
-#include <stdexcept>
 
 #include "nncc/core/ADT/tensor/Shape.h"
 #include "nnc/core/IR/model/operations/variable_op.h"
@@ -28,12 +27,59 @@ void ModelVisitor::visit(const NetParameter& np)
 
 void ModelVisitor::visit(const LayerParameter& lp)
 {
-  (void)lp;
-  throw std::runtime_error("Not yet implemented");
+  auto inputs = createOpInputs(lp);
+  auto params = createOpParams(lp);
+
+  std::vector<INode::Ref> outputs;
+
+  // TODO: support other layer types
+
+  // This is the Input layer
+  if (lp.has_input_param())
+  {
+    processInputLayer(lp);
+  }
+  else if (lp.has_convolution_param())
+  {
+    outputs = opCreator.createConv2D(inputs, params, lp.convolution_param());
+  }
+  else if (lp.has_inner_product_param())
+  {
+    outputs = opCreator.createFullyConnected(inputs, params, lp.inner_product_param());
+  }
+  else if (lp.has_pooling_param())
+  {
+    outputs = opCreator.createPool(inputs, params, lp.pooling_param());
+  }
+  else if (lp.has_concat_param())
+  {
+    outputs = opCreator.createConcat(inputs, params, lp.concat_param());
+  }
+  else if (lp.has_reshape_param())
+  {
+    outputs = opCreator.createReshape(inputs, params, lp.reshape_param());
+  }
+  else if (lp.has_relu_param() || lp.type() == "ReLU")
+  {
+    outputs = opCreator.createRelu(inputs, params, lp.relu_param());
+  }
+  else if (lp.has_softmax_param() || lp.type() == "Softmax")
+  {
+    outputs = opCreator.createSoftmax(inputs, params, lp.softmax_param());
+  }
+  else
+  {
+    throw PluginException("Encountered unsupported Caffe layer type");
+  }
+
+  for (auto item : outputs)
+  {
+    opsForBlobsTheyOutput[lp.top(0)] = item;
+  }
 }
 
-void ModelVisitor::visit(const BlobProto&) { throw std::runtime_error("Not yet implemented"); }
-void ModelVisitor::visit(const BlobShape&) { throw std::runtime_error("Not yet implemented"); }
+void ModelVisitor::visit(const BlobProto&) {}
+void ModelVisitor::visit(const BlobShape&) {}
 
 Graph *ModelVisitor::getGraph()
 {