Classes listed here, in fact, provides C++ API for creating intances of bult-in layers.
In addition to this way of layers instantiation, there is a more common factory API (see @ref dnnLayerFactory), it allows to create layers dynamically (by name) and register new ones.
- You can use both API, but factory API is less convinient for native C++ programming and basically designed for use inside importers (see @ref Importer, @ref createCaffeImporter(), @ref createTorchImporter()).
+ You can use both API, but factory API is less convinient for native C++ programming and basically designed for use inside importers (see @ref readNetFromCaffe(), @ref readNetFromTorch(), @ref readNetFromTensorflow()).
Bult-in layers partially reproduce functionality of corresponding Caffe and Torch7 layers.
In partuclar, the following layers and Caffe @ref Importer were tested to reproduce <a href="http://caffe.berkeleyvision.org/tutorial/layers.html">Caffe</a> functionality:
Ptr<Impl> impl;
};
- /** @brief Small interface class for loading trained serialized models of different dnn-frameworks. */
+ /**
+ * @deprecated Deprecated as external interface. Will be for internal needs only.
+ * @brief Small interface class for loading trained serialized models of different dnn-frameworks. */
class CV_EXPORTS_W Importer : public Algorithm
{
public:
/** @brief Adds loaded layers into the @p net and sets connections between them. */
- CV_WRAP virtual void populateNet(Net net) = 0;
+ CV_DEPRECATED CV_WRAP virtual void populateNet(Net net) = 0;
virtual ~Importer();
};
- /** @brief Creates the importer of <a href="http://caffe.berkeleyvision.org">Caffe</a> framework network.
+ /**
+ * @deprecated Use @ref readNetFromCaffe instead.
+ * @brief Creates the importer of <a href="http://caffe.berkeleyvision.org">Caffe</a> framework network.
* @param prototxt path to the .prototxt file with text description of the network architecture.
* @param caffeModel path to the .caffemodel file with learned network.
* @returns Pointer to the created importer, NULL in failure cases.
*/
- CV_EXPORTS_W Ptr<Importer> createCaffeImporter(const String &prototxt, const String &caffeModel = String());
+ CV_DEPRECATED CV_EXPORTS_W Ptr<Importer> createCaffeImporter(const String &prototxt, const String &caffeModel = String());
/** @brief Reads a network model stored in Caffe model files.
* @details This is shortcut consisting from createCaffeImporter and Net::populateNet calls.
*/
CV_EXPORTS_W Net readNetFromTorch(const String &model, bool isBinary = true);
- /** @brief Creates the importer of <a href="http://www.tensorflow.org">TensorFlow</a> framework network.
+ /**
+ * @deprecated Use @ref readNetFromTensorflow instead.
+ * @brief Creates the importer of <a href="http://www.tensorflow.org">TensorFlow</a> framework network.
* @param model path to the .pb file with binary protobuf description of the network architecture.
* @returns Pointer to the created importer, NULL in failure cases.
*/
- CV_EXPORTS_W Ptr<Importer> createTensorflowImporter(const String &model);
+ CV_DEPRECATED CV_EXPORTS_W Ptr<Importer> createTensorflowImporter(const String &model);
- /** @brief Creates the importer of <a href="http://torch.ch">Torch7</a> framework network.
+ /**
+ * @deprecated Use @ref readNetFromTorch instead.
+ * @brief Creates the importer of <a href="http://torch.ch">Torch7</a> framework network.
* @param filename path to the file, dumped from Torch by using torch.save() function.
* @param isBinary specifies whether the network was serialized in ascii mode or binary.
* @returns Pointer to the created importer, NULL in failure cases.
*
* Also some equivalents of these classes from cunn, cudnn, and fbcunn may be successfully imported.
*/
- CV_EXPORTS_W Ptr<Importer> createTorchImporter(const String &filename, bool isBinary = true);
+ CV_DEPRECATED CV_EXPORTS_W Ptr<Importer> createTorchImporter(const String &filename, bool isBinary = true);
/** @brief Loads blob which was serialized as torch.Tensor object of Torch7 framework.
* @warning This function has the same limitations as createTorchImporter().
sourceImageFile = f.toString();
if(!f.exists()) throw new Exception("Test image is missing: " + sourceImageFile);
- net = new Net();
- if(net.empty()) {
- Importer importer = Dnn.createTensorflowImporter(modelFileName);
- importer.populateNet(net);
- }
-
+ net = Dnn.readNetFromTensorflow(modelFileName);
}
public void testGetLayerTypes() {
return Ptr<Importer>(new CaffeImporter(prototxt.c_str(), caffeModel.c_str()));
}
-#else //HAVE_PROTOBUF
-
-Ptr<Importer> createCaffeImporter(const String&, const String&)
-{
- CV_Error(cv::Error::StsNotImplemented, "libprotobuf required to import data from Caffe models");
- return Ptr<Importer>();
-}
-
-#endif //HAVE_PROTOBUF
-
Net readNetFromCaffe(const String &prototxt, const String &caffeModel /*= String()*/)
{
- Ptr<Importer> caffeImporter = createCaffeImporter(prototxt, caffeModel);
+ CaffeImporter caffeImporter(prototxt.c_str(), caffeModel.c_str());
Net net;
- if (caffeImporter)
- caffeImporter->populateNet(net);
+ caffeImporter.populateNet(net);
return net;
}
+#endif //HAVE_PROTOBUF
+
CV__DNN_EXPERIMENTAL_NS_END
}} // namespace
Net readNetFromTensorflow(const String &model)
{
- Ptr<Importer> importer = createTensorflowImporter(model);
+ TFImporter importer(model.c_str());
Net net;
- if (importer)
- importer->populateNet(net);
+ importer.populateNet(net);
return net;
}
{
CV_TRACE_FUNCTION();
- Ptr<Importer> importer = createTorchImporter(model, isBinary);
+ TorchImporter importer(model, isBinary);
Net net;
- if (importer)
- importer->populateNet(net);
+ importer.populateNet(net);
return net;
}
TEST(Test_Caffe, read_gtsrb)
{
- Net net;
- {
- Ptr<Importer> importer = createCaffeImporter(_tf("gtsrb.prototxt"), "");
- ASSERT_TRUE(importer != NULL);
- importer->populateNet(net);
- }
+ Net net = readNetFromCaffe(_tf("gtsrb.prototxt"));
+ ASSERT_FALSE(net.empty());
}
TEST(Test_Caffe, read_googlenet)
{
- Net net;
- {
- Ptr<Importer> importer = createCaffeImporter(_tf("bvlc_googlenet.prototxt"), "");
- ASSERT_TRUE(importer != NULL);
- importer->populateNet(net);
- }
+ Net net = readNetFromCaffe(_tf("bvlc_googlenet.prototxt"));
+ ASSERT_FALSE(net.empty());
}
TEST(Reproducibility_AlexNet, Accuracy)
{
const string proto = findDataFile("dnn/bvlc_alexnet.prototxt", false);
const string model = findDataFile("dnn/bvlc_alexnet.caffemodel", false);
- Ptr<Importer> importer = createCaffeImporter(proto, model);
- ASSERT_TRUE(importer != NULL);
- importer->populateNet(net);
+ net = readNetFromCaffe(proto, model);
+ ASSERT_FALSE(net.empty());
}
Mat sample = imread(_tf("grace_hopper_227.png"));
{
const string proto = findDataFile("dnn/fcn8s-heavy-pascal.prototxt", false);
const string model = findDataFile("dnn/fcn8s-heavy-pascal.caffemodel", false);
- Ptr<Importer> importer = createCaffeImporter(proto, model);
- ASSERT_TRUE(importer != NULL);
- importer->populateNet(net);
+ net = readNetFromCaffe(proto, model);
+ ASSERT_FALSE(net.empty());
}
Mat sample = imread(_tf("street.png"));
{
const string proto = findDataFile("dnn/ssd_vgg16.prototxt", false);
const string model = findDataFile("dnn/VGG_ILSVRC2016_SSD_300x300_iter_440000.caffemodel", false);
- Ptr<Importer> importer = createCaffeImporter(proto, model);
- ASSERT_TRUE(importer != NULL);
- importer->populateNet(net);
+ net = readNetFromCaffe(proto, model);
+ ASSERT_FALSE(net.empty());
}
Mat sample = imread(_tf("street.png"));
cv::setNumThreads(cv::getNumberOfCPUs());
- Net net;
- {
- Ptr<Importer> importer = createCaffeImporter(prototxt, (useCaffeModel) ? caffemodel : String());
- ASSERT_TRUE(importer != NULL);
- importer->populateNet(net);
- }
+ Net net = readNetFromCaffe(prototxt, (useCaffeModel) ? caffemodel : String());
+ ASSERT_FALSE(net.empty());
Mat inp = blobFromNPY(inpfile);
Mat ref = blobFromNPY(outfile);
static void test_Reshape_Split_Slice_layers()
{
- Net net;
- {
- Ptr<Importer> importer = createCaffeImporter(_tf("reshape_and_slice_routines.prototxt"));
- ASSERT_TRUE(importer != NULL);
- importer->populateNet(net);
- }
+ Net net = readNetFromCaffe(_tf("reshape_and_slice_routines.prototxt"));
+ ASSERT_FALSE(net.empty());
Mat input(6, 12, CV_32F);
RNG rng(0);
TEST(Layer_Conv_Elu, Accuracy)
{
- Net net;
- {
- Ptr<Importer> importer = createTensorflowImporter(_tf("layer_elu_model.pb"));
- ASSERT_TRUE(importer != NULL);
- importer->populateNet(net);
- }
+ Net net = readNetFromTensorflow(_tf("layer_elu_model.pb"));
+ ASSERT_FALSE(net.empty());
+
Mat inp = blobFromNPY(_tf("layer_elu_in.npy"));
Mat ref = blobFromNPY(_tf("layer_elu_out.npy"));
Net net;
{
const string model = findDataFile("dnn/tensorflow_inception_graph.pb", false);
- Ptr<Importer> importer = createTensorflowImporter(model);
- ASSERT_TRUE(importer != NULL);
- importer->populateNet(net);
+ net = readNetFromTensorflow(model);
+ ASSERT_FALSE(net.empty());
}
Mat sample = imread(_tf("grace_hopper_227.png"));
Net net;
{
const string model = findDataFile("dnn/tensorflow_inception_graph.pb", false);
- Ptr<Importer> importer = createTensorflowImporter(model);
- ASSERT_TRUE(importer != NULL);
- importer->populateNet(net);
+ net = readNetFromTensorflow(model);
+ ASSERT_FALSE(net.empty());
}
Mat sample = imread(_tf("grace_hopper_227.png"));
TEST(Torch_Importer, simple_read)
{
Net net;
- Ptr<Importer> importer;
-
- ASSERT_NO_THROW( importer = createTorchImporter(_tf("net_simple_net.txt"), false) );
- ASSERT_TRUE( importer != NULL );
- importer->populateNet(net);
+ ASSERT_NO_THROW(net = readNetFromTorch(_tf("net_simple_net.txt"), false));
+ ASSERT_FALSE(net.empty());
}
static void runTorchNet(String prefix, String outLayerName = "",
{
String suffix = (isBinary) ? ".dat" : ".txt";
- Net net;
- Ptr<Importer> importer = createTorchImporter(_tf(prefix + "_net" + suffix), isBinary);
- ASSERT_TRUE(importer != NULL);
- importer->populateNet(net);
+ Net net = readNetFromTorch(_tf(prefix + "_net" + suffix), isBinary);
+ ASSERT_FALSE(net.empty());
Mat inp, outRef;
ASSERT_NO_THROW( inp = readTorchBlob(_tf(prefix + "_input" + suffix), isBinary) );
Net net;
{
const string model = findDataFile("dnn/Enet-model-best.net", false);
- Ptr<Importer> importer = createTorchImporter(model, true);
- ASSERT_TRUE(importer != NULL);
- importer->populateNet(net);
+ net = readNetFromTorch(model, true);
+ ASSERT_FALSE(net.empty());
}
Mat sample = imread(_tf("street.png", false));
# workarounding lack of `__attribute__ ((visibility("default")))` in jni_md.h/JNIEXPORT
string(REPLACE "-fvisibility=hidden" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
-ocv_warnings_disable(CMAKE_CXX_FLAGS -Wunused-const-variable -Wundef)
+if(MSVC)
+ ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4996)
+else()
+ ocv_warnings_disable(CMAKE_CXX_FLAGS -Wunused-const-variable -Wundef -Wdeprecated-declarations)
+endif()
+
ocv_add_library(${the_module} SHARED ${handwritten_h_sources} ${handwritten_cpp_sources} ${generated_cpp_sources}
${copied_files}
unset(MODULE_NAME)
unset(MODULE_INSTALL_SUBDIR)
+
+if(MSVC)
+ ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4996)
+else()
+ ocv_warnings_disable(CMAKE_CXX_FLAGS -Wdeprecated-declarations)
+endif()
unset(MODULE_NAME)
unset(MODULE_INSTALL_SUBDIR)
+
+if(MSVC)
+ ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4996)
+else()
+ ocv_warnings_disable(CMAKE_CXX_FLAGS -Wdeprecated-declarations)
+endif()
# note that we do not strip "static" prefix, which does matter;
# it means class methods, not instance methods
decl_str = self.batch_replace(decl_str, [("virtual", ""), ("static inline", ""), ("inline", ""),\
- ("CV_EXPORTS_W", ""), ("CV_EXPORTS", ""), ("CV_CDECL", ""), ("CV_WRAP ", " "), ("CV_INLINE", "")]).strip()
+ ("CV_EXPORTS_W", ""), ("CV_EXPORTS", ""), ("CV_CDECL", ""), ("CV_WRAP ", " "), ("CV_INLINE", ""),
+ ("CV_DEPRECATED", "")]).strip()
static_method = False
context = top[0]
vector<cv::Vec3b> colors = readColors();
- //! [Create the importer of Caffe model]
- Ptr<dnn::Importer> importer;
- try //Try to import Caffe GoogleNet model
- {
- importer = dnn::createCaffeImporter(modelTxt, modelBin);
- }
- catch (const cv::Exception &err) //Importer can throw errors, we will catch them
- {
- cerr << err.msg << endl;
- }
- //! [Create the importer of Caffe model]
+ //! [Initialize network]
+ dnn::Net net = readNetFromCaffe(modelTxt, modelBin);
+ //! [Initialize network]
- if (!importer)
+ if (net.empty())
{
cerr << "Can't load network by using the following files: " << endl;
cerr << "prototxt: " << modelTxt << endl;
exit(-1);
}
- //! [Initialize network]
- dnn::Net net;
- importer->populateNet(net);
- importer.release(); //We don't need importer anymore
- //! [Initialize network]
-
//! [Prepare blob]
Mat img = imread(imageFile);
if (img.empty())
String modelConfiguration = parser.get<string>("proto");
String modelBinary = parser.get<string>("model");
- //! [Create the importer of Caffe model]
- Ptr<dnn::Importer> importer;
-
- // Import Caffe SSD model
- try
- {
- importer = dnn::createCaffeImporter(modelConfiguration, modelBinary);
- }
- catch (const cv::Exception &err) //Importer can throw errors, we will catch them
- {
- cerr << err.msg << endl;
- }
- //! [Create the importer of Caffe model]
+ //! [Initialize network]
+ dnn::Net net = readNetFromCaffe(modelConfiguration, modelBinary);
+ //! [Initialize network]
- if (!importer)
+ if (net.empty())
{
cerr << "Can't load network by using the following files: " << endl;
cerr << "prototxt: " << modelConfiguration << endl;
exit(-1);
}
- //! [Initialize network]
- dnn::Net net;
- importer->populateNet(net);
- importer.release(); //We don't need importer anymore
- //! [Initialize network]
-
cv::Mat frame = cv::imread(parser.get<string>("image"), -1);
if (frame.channels() == 4)
String classNamesFile = parser.get<String>("c_names");
String resultFile = parser.get<String>("result");
- //! [Create the importer of TensorFlow model]
- Ptr<dnn::Importer> importer;
- try //Try to import TensorFlow AlexNet model
- {
- importer = dnn::createTensorflowImporter(modelFile);
- }
- catch (const cv::Exception &err) //Importer can throw errors, we will catch them
- {
- std::cerr << err.msg << std::endl;
- }
- //! [Create the importer of Caffe model]
+ //! [Initialize network]
+ dnn::Net net = readNetFromTensorflow(modelFile);
+ //! [Initialize network]
- if (!importer)
+ if (net.empty())
{
std::cerr << "Can't load network by using the mode file: " << std::endl;
std::cerr << modelFile << std::endl;
exit(-1);
}
- //! [Initialize network]
- dnn::Net net;
- importer->populateNet(net);
- importer.release(); //We don't need importer anymore
- //! [Initialize network]
-
//! [Prepare blob]
Mat img = imread(imageFile);
if (img.empty())