diff --git a/modules/dnn/CMakeLists.txt b/modules/dnn/CMakeLists.txt index 8e6400853..7391f6426 100644 --- a/modules/dnn/CMakeLists.txt +++ b/modules/dnn/CMakeLists.txt @@ -14,11 +14,11 @@ else() message(FATAL_ERROR "Could not find PROTOBUF Compiler") endif() -include_directories(src/caffe) - file(GLOB PROTO_FILES src/*.proto) PROTOBUF_GENERATE_CPP(PROTO_HDRS PROTO_SRCS ${PROTO_FILES}) +include_directories(include src/caffe) + ocv_add_module(dnn opencv_imgproc opencv_core opencv_highgui WRAP python matlab) ocv_glob_module_sources(${PROTO_SRCS} ${PROTO_HDRS}) ocv_source_group("Src\\protobuf" FILES ${PROTO_SRCS} ${PROTO_HDRS}) diff --git a/modules/dnn/include/opencv2/dnn.hpp b/modules/dnn/include/opencv2/dnn.hpp index ad19c9060..626433b18 100644 --- a/modules/dnn/include/opencv2/dnn.hpp +++ b/modules/dnn/include/opencv2/dnn.hpp @@ -1,177 +1,13 @@ #ifndef __OPENCV_DNN_HPP__ #define __OPENCV_DNN_HPP__ -#include -#include -#include -#include "dnn/dict.hpp" +// This is an umbrealla header to include into you project. +// We are free to change headers layout in dnn subfolder, so please include +// this header for future compartibility -namespace cv -{ -namespace dnn -{ - class Layer; - class NetConfiguration; - class Net; - class Blob; - class LayerParams; +#include - //wrapper over cv::Mat and cv::UMat - class CV_EXPORTS Blob - { - public: - Blob(); - Blob(InputArray in); - void fill(InputArray in); - void fill(int ndims, const int *sizes, int type, void *data, bool deepCopy = true); - void create(int ndims, const int *sizes, int type = CV_32F); +#endif /* __OPENCV_DNN_HPP__ */ - bool empty() const; - Mat& getMatRef(); - const Mat& getMatRef() const; - Mat getMat(); - Mat getMat(int num, int channel); - - int cols() const; - int rows() const; - Size size() const; - - int channels() const; - int num() const; - - Vec4i shape() const; - - private: - Mat m; - }; - - class CV_EXPORTS LayerParams : public Dict - { - public: - - std::vector learnedBlobs; - }; - - class CV_EXPORTS LayerRegister - { - public: - - typedef Layer* (*Constuctor)(); - - static void registerLayer(const String &type, Constuctor constructor); - - static void unregisterLayer(const String &type); - - static Ptr createLayerInstance(const String &type); - - private: - LayerRegister(); - LayerRegister(const LayerRegister &lr); - - static std::map registeredLayers; - }; - - //this class allows to build new Layers - class CV_EXPORTS Layer - { - public: - - //TODO: this field must be declared as public if we want support possibility to change these params in runtime - std::vector learnedParams; - - virtual ~Layer(); - - //type of Layer - virtual String type() const; - - //setUp calls once (think that it's constructor) - virtual void setUp(LayerParams ¶ms); - - //after setUp the following two function must be able to return values - virtual int getNumInputs(); - virtual int getNumOutputs(); - - //maybe useless function - //shape of output blobs must be adjusted with respect to shape of input blobs - virtual void adjustShape(const std::vector &inputs, std::vector &outputs); - - virtual void forward(std::vector &inputs, std::vector &outputs); - }; - - //TODO: divide NetConfiguration interface and implementation, hide internal data - //TODO: maybe eliminate all int ids and replace them by string names - //Proxy class for different formats - //Each format importer must populate it - class CV_EXPORTS NetConfiguration - { - public: - - static Ptr create(); - - int addLayer(const String &name, const String &type); - - void deleteLayer(int layerId); - - void setLayerParams(int layerId, LayerParams ¶ms); - - //each output of each layer can be labeled by unique string label (as in Caffe) - //if label not specified then %layer_name%:c_%N% will be used - void setLayerOutputLabels(int layerId, const std::vector &outputNames); - - //version #1 - void addConnection(int fromLayer, int fromLayerOutput, int toLayer, int toLayerInput); - - //or maybe version #2 - inline int getBlobId(int layerId, int inputOutputNumber) - { - return (layerId << 16) + inputOutputNumber; - } - - void addConnection(int outputId, int inputId); - - void addConnections(const std::vector &outputIds, const std::vector &inputIds); - - private: - - int lastLayerId; - std::map< int, Ptr > layers; - std::map< int, std::vector > layerOutputLabels; - }; - - - class CV_EXPORTS Net - { - public: - - static Ptr create(Ptr config); - - virtual ~Net() = 0; - - virtual int getBlobId(int layerId, int outputId) = 0; - - virtual int getBlobId(const String &blobName) = 0; - - virtual void forward(std::vector< int, Ptr > &inputBlobs, std::vector > &outputBlobs) = 0; - - virtual void forward(int layer, std::vector > &layerOutputs) = 0; - }; - - class CV_EXPORTS Importer - { - public: - - virtual void populateNetConfiguration(Ptr config) = 0; - - virtual ~Importer(); - }; - - CV_EXPORTS Ptr createCaffeImporter(const String &prototxt, const String &caffeModel); - -} -} - -#include "dnn/dnn.inl.hpp" - -#endif diff --git a/modules/dnn/include/opencv2/dnn/dnn.hpp b/modules/dnn/include/opencv2/dnn/dnn.hpp new file mode 100644 index 000000000..7a58c29bd --- /dev/null +++ b/modules/dnn/include/opencv2/dnn/dnn.hpp @@ -0,0 +1,177 @@ +#ifndef __OPENCV_DNN_DNN_HPP__ +#define __OPENCV_DNN_DNN_HPP__ + +#include +#include +#include +#include + +namespace cv +{ +namespace dnn +{ + class Layer; + class NetConfiguration; + class Net; + class Blob; + class LayerParams; + + //wrapper over cv::Mat and cv::UMat + class CV_EXPORTS Blob + { + public: + Blob(); + Blob(InputArray in); + + void fill(InputArray in); + void fill(int ndims, const int *sizes, int type, void *data, bool deepCopy = true); + void create(int ndims, const int *sizes, int type = CV_32F); + + bool empty() const; + + Mat& getMatRef(); + const Mat& getMatRef() const; + Mat getMat(); + Mat getMat(int num, int channel); + + int cols() const; + int rows() const; + Size size() const; + + int channels() const; + int num() const; + + Vec4i shape() const; + + private: + Mat m; + }; + + class CV_EXPORTS LayerParams : public Dict + { + public: + + std::vector learnedBlobs; + }; + + class CV_EXPORTS LayerRegister + { + public: + + typedef Layer* (*Constuctor)(); + + static void registerLayer(const String &type, Constuctor constructor); + + static void unregisterLayer(const String &type); + + static Ptr createLayerInstance(const String &type); + + private: + LayerRegister(); + LayerRegister(const LayerRegister &lr); + + static std::map registeredLayers; + }; + + //this class allows to build new Layers + class CV_EXPORTS Layer + { + public: + + //TODO: this field must be declared as public if we want support possibility to change these params in runtime + std::vector learnedParams; + + virtual ~Layer(); + + //type of Layer + virtual String type() const; + + //setUp calls once (think that it's constructor) + virtual void setUp(LayerParams ¶ms); + + //after setUp the following two function must be able to return values + virtual int getNumInputs(); + virtual int getNumOutputs(); + + //maybe useless function + //shape of output blobs must be adjusted with respect to shape of input blobs + virtual void adjustShape(const std::vector &inputs, std::vector &outputs); + + virtual void forward(std::vector &inputs, std::vector &outputs); + }; + + //TODO: divide NetConfiguration interface and implementation, hide internal data + //TODO: maybe eliminate all int ids and replace them by string names + //Proxy class for different formats + //Each format importer must populate it + class CV_EXPORTS NetConfiguration + { + public: + + static Ptr create(); + + int addLayer(const String &name, const String &type); + + void deleteLayer(int layerId); + + void setLayerParams(int layerId, LayerParams ¶ms); + + //each output of each layer can be labeled by unique string label (as in Caffe) + //if label not specified then %layer_name%:c_%N% will be used + void setLayerOutputLabels(int layerId, const std::vector &outputNames); + + //version #1 + void addConnection(int fromLayer, int fromLayerOutput, int toLayer, int toLayerInput); + + //or maybe version #2 + inline int getBlobId(int layerId, int inputOutputNumber) + { + return (layerId << 16) + inputOutputNumber; + } + + void addConnection(int outputId, int inputId); + + void addConnections(const std::vector &outputIds, const std::vector &inputIds); + + private: + + int lastLayerId; + std::map< int, Ptr > layers; + std::map< int, std::vector > layerOutputLabels; + }; + + + class CV_EXPORTS Net + { + public: + + static Ptr create(Ptr config); + + virtual ~Net() = 0; + + virtual int getBlobId(int layerId, int outputId) = 0; + + virtual int getBlobId(const String &blobName) = 0; + + virtual void forward(std::vector< int, Ptr > &inputBlobs, std::vector > &outputBlobs) = 0; + + virtual void forward(int layer, std::vector > &layerOutputs) = 0; + }; + + class CV_EXPORTS Importer + { + public: + + virtual void populateNetConfiguration(Ptr config) = 0; + + virtual ~Importer(); + }; + + CV_EXPORTS Ptr createCaffeImporter(const String &prototxt, const String &caffeModel); + +} +} + +#include + +#endif /* __OPENCV_DNN_DNN_HPP__ */ diff --git a/modules/dnn/src/precomp.hpp b/modules/dnn/src/precomp.hpp index 630af81d2..7dcb7282e 100644 --- a/modules/dnn/src/precomp.hpp +++ b/modules/dnn/src/precomp.hpp @@ -1,2 +1,2 @@ #include -#include \ No newline at end of file +#include