Add Caffe model visiting mechanism (#535)
authorDmitry Mozolev/AI Tools Lab /SRR/Engineer/삼성전자 <d.mozolev@samsung.com>
Fri, 6 Jul 2018 11:28:25 +0000 (14:28 +0300)
committerSergey Vostokov/AI Tools Lab /SRR/Staff Engineer/삼성전자 <s.vostokov@samsung.com>
Fri, 6 Jul 2018 11:28:25 +0000 (20:28 +0900)
Add Caffe model visiting mechanism

Used for traversing the model and doing something with
objects that it contains.

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

diff --git a/contrib/nnc/libs/frontend/caffe/include/caffe_visitor.h b/contrib/nnc/libs/frontend/caffe/include/caffe_visitor.h
new file mode 100644 (file)
index 0000000..c02c2a8
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef NNCC_CAFFE_VISITOR_H
+#define NNCC_CAFFE_VISITOR_H
+
+#include "caffe/proto/caffe.pb.h"
+
+namespace nncc
+{
+namespace contrib
+{
+namespace frontend
+{
+namespace caffe
+{
+
+using namespace ::caffe;
+
+class Visitor
+{
+public:
+    virtual ~Visitor() = default;
+
+    virtual void visit(const NetParameter&) = 0;
+    virtual void visit(const LayerParameter&) = 0;
+    virtual void visit(const BlobProto&) = 0;
+    virtual void visit(const BlobShape&) = 0;
+};
+
+} // namespace caffe
+} // namespace frontend
+} // namespace contrib
+} // namespace nncc
+
+#endif //NNCC_CAFFE_VISITOR_H
diff --git a/contrib/nnc/libs/frontend/caffe/include/caffe_walker.h b/contrib/nnc/libs/frontend/caffe/include/caffe_walker.h
new file mode 100644 (file)
index 0000000..4574a20
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef NNCC_CAFFE_WALKER_H
+#define NNCC_CAFFE_WALKER_H
+
+#include "caffe/proto/caffe.pb.h"
+
+#include "caffe_visitor.h"
+
+namespace nncc
+{
+namespace contrib
+{
+namespace frontend
+{
+namespace caffe
+{
+
+using namespace ::caffe;
+
+class ModelWalker
+{
+public:
+    ModelWalker(Visitor* visitor) : visitor(visitor) {};
+
+    void walkNetParameter(const NetParameter&);
+    void walkLayerParameter(const LayerParameter&);
+
+private:
+    Visitor* visitor;
+};
+
+} // namespace caffe
+} // namespace frontend
+} // namespace contrib
+} // namespace nncc
+
+#endif // NNCC_CAFFE_WALKER_H
diff --git a/contrib/nnc/libs/frontend/caffe/src/caffe_walker.cpp b/contrib/nnc/libs/frontend/caffe/src/caffe_walker.cpp
new file mode 100644 (file)
index 0000000..9b89dff
--- /dev/null
@@ -0,0 +1,40 @@
+#include "caffe_walker.h"
+
+namespace nncc
+{
+namespace contrib
+{
+namespace frontend
+{
+namespace caffe
+{
+
+void ModelWalker::walkNetParameter(const NetParameter& np)
+{
+    visitor->visit(np);
+
+    for (int i = 0; i < np.layer_size(); ++i)
+    {
+        walkLayerParameter(np.layer(i));
+    }
+
+    for (int i = 0; i < np.input_shape_size(); ++i)
+    {
+        visitor->visit(np.input_shape(i));
+    }
+}
+
+void ModelWalker::walkLayerParameter(const LayerParameter& lp)
+{
+    visitor->visit(lp);
+
+    for (int i = 0; i < lp.blobs_size(); ++i)
+    {
+        visitor->visit(lp.blobs(i));
+    }
+}
+
+} // namespace caffe
+} // namespace frontend
+} // namespace contrib
+} // namespace nncc