Skip to content

Commit bd8e6b7

Browse files
committed
Make external cv::dnn::Importer usage is deprecated
1 parent 37ba1d6 commit bd8e6b7

File tree

17 files changed

+85
-149
lines changed

17 files changed

+85
-149
lines changed

modules/dnn/include/opencv2/dnn/all_layers.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN
5555
5656
Classes listed here, in fact, provides C++ API for creating intances of bult-in layers.
5757
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.
58-
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()).
58+
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()).
5959
6060
Bult-in layers partially reproduce functionality of corresponding Caffe and Torch7 layers.
6161
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:

modules/dnn/include/opencv2/dnn/dnn.hpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -598,23 +598,27 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN
598598
Ptr<Impl> impl;
599599
};
600600

601-
/** @brief Small interface class for loading trained serialized models of different dnn-frameworks. */
601+
/**
602+
* @deprecated Deprecated as external interface. Will be for internal needs only.
603+
* @brief Small interface class for loading trained serialized models of different dnn-frameworks. */
602604
class CV_EXPORTS_W Importer : public Algorithm
603605
{
604606
public:
605607

606608
/** @brief Adds loaded layers into the @p net and sets connections between them. */
607-
CV_WRAP virtual void populateNet(Net net) = 0;
609+
CV_DEPRECATED CV_WRAP virtual void populateNet(Net net) = 0;
608610

609611
virtual ~Importer();
610612
};
611613

612-
/** @brief Creates the importer of <a href="http://caffe.berkeleyvision.org">Caffe</a> framework network.
614+
/**
615+
* @deprecated Use @ref readNetFromCaffe instead.
616+
* @brief Creates the importer of <a href="http://caffe.berkeleyvision.org">Caffe</a> framework network.
613617
* @param prototxt path to the .prototxt file with text description of the network architecture.
614618
* @param caffeModel path to the .caffemodel file with learned network.
615619
* @returns Pointer to the created importer, NULL in failure cases.
616620
*/
617-
CV_EXPORTS_W Ptr<Importer> createCaffeImporter(const String &prototxt, const String &caffeModel = String());
621+
CV_DEPRECATED CV_EXPORTS_W Ptr<Importer> createCaffeImporter(const String &prototxt, const String &caffeModel = String());
618622

619623
/** @brief Reads a network model stored in Caffe model files.
620624
* @details This is shortcut consisting from createCaffeImporter and Net::populateNet calls.
@@ -631,13 +635,17 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN
631635
*/
632636
CV_EXPORTS_W Net readNetFromTorch(const String &model, bool isBinary = true);
633637

634-
/** @brief Creates the importer of <a href="http://www.tensorflow.org">TensorFlow</a> framework network.
638+
/**
639+
* @deprecated Use @ref readNetFromTensorflow instead.
640+
* @brief Creates the importer of <a href="http://www.tensorflow.org">TensorFlow</a> framework network.
635641
* @param model path to the .pb file with binary protobuf description of the network architecture.
636642
* @returns Pointer to the created importer, NULL in failure cases.
637643
*/
638-
CV_EXPORTS_W Ptr<Importer> createTensorflowImporter(const String &model);
644+
CV_DEPRECATED CV_EXPORTS_W Ptr<Importer> createTensorflowImporter(const String &model);
639645

640-
/** @brief Creates the importer of <a href="http://torch.ch">Torch7</a> framework network.
646+
/**
647+
* @deprecated Use @ref readNetFromTorch instead.
648+
* @brief Creates the importer of <a href="http://torch.ch">Torch7</a> framework network.
641649
* @param filename path to the file, dumped from Torch by using torch.save() function.
642650
* @param isBinary specifies whether the network was serialized in ascii mode or binary.
643651
* @returns Pointer to the created importer, NULL in failure cases.
@@ -663,7 +671,7 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN
663671
*
664672
* Also some equivalents of these classes from cunn, cudnn, and fbcunn may be successfully imported.
665673
*/
666-
CV_EXPORTS_W Ptr<Importer> createTorchImporter(const String &filename, bool isBinary = true);
674+
CV_DEPRECATED CV_EXPORTS_W Ptr<Importer> createTorchImporter(const String &filename, bool isBinary = true);
667675

668676
/** @brief Loads blob which was serialized as torch.Tensor object of Torch7 framework.
669677
* @warning This function has the same limitations as createTorchImporter().

modules/dnn/misc/java/test/DnnTensorFlowTest.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,7 @@ protected void setUp() throws Exception {
5151
sourceImageFile = f.toString();
5252
if(!f.exists()) throw new Exception("Test image is missing: " + sourceImageFile);
5353

54-
net = new Net();
55-
if(net.empty()) {
56-
Importer importer = Dnn.createTensorflowImporter(modelFileName);
57-
importer.populateNet(net);
58-
}
59-
54+
net = Dnn.readNetFromTensorflow(modelFileName);
6055
}
6156

6257
public void testGetLayerTypes() {

modules/dnn/src/caffe/caffe_importer.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -370,24 +370,15 @@ Ptr<Importer> createCaffeImporter(const String &prototxt, const String &caffeMod
370370
return Ptr<Importer>(new CaffeImporter(prototxt.c_str(), caffeModel.c_str()));
371371
}
372372

373-
#else //HAVE_PROTOBUF
374-
375-
Ptr<Importer> createCaffeImporter(const String&, const String&)
376-
{
377-
CV_Error(cv::Error::StsNotImplemented, "libprotobuf required to import data from Caffe models");
378-
return Ptr<Importer>();
379-
}
380-
381-
#endif //HAVE_PROTOBUF
382-
383373
Net readNetFromCaffe(const String &prototxt, const String &caffeModel /*= String()*/)
384374
{
385-
Ptr<Importer> caffeImporter = createCaffeImporter(prototxt, caffeModel);
375+
CaffeImporter caffeImporter(prototxt.c_str(), caffeModel.c_str());
386376
Net net;
387-
if (caffeImporter)
388-
caffeImporter->populateNet(net);
377+
caffeImporter.populateNet(net);
389378
return net;
390379
}
391380

381+
#endif //HAVE_PROTOBUF
382+
392383
CV__DNN_EXPERIMENTAL_NS_END
393384
}} // namespace

modules/dnn/src/tensorflow/tf_importer.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,10 +1045,9 @@ Ptr<Importer> createTensorflowImporter(const String&)
10451045

10461046
Net readNetFromTensorflow(const String &model)
10471047
{
1048-
Ptr<Importer> importer = createTensorflowImporter(model);
1048+
TFImporter importer(model.c_str());
10491049
Net net;
1050-
if (importer)
1051-
importer->populateNet(net);
1050+
importer.populateNet(net);
10521051
return net;
10531052
}
10541053

modules/dnn/src/torch/torch_importer.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,10 +1150,9 @@ Net readNetFromTorch(const String &model, bool isBinary)
11501150
{
11511151
CV_TRACE_FUNCTION();
11521152

1153-
Ptr<Importer> importer = createTorchImporter(model, isBinary);
1153+
TorchImporter importer(model, isBinary);
11541154
Net net;
1155-
if (importer)
1156-
importer->populateNet(net);
1155+
importer.populateNet(net);
11571156
return net;
11581157
}
11591158

modules/dnn/test/test_caffe_importer.cpp

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,14 @@ static std::string _tf(TString filename)
5757

5858
TEST(Test_Caffe, read_gtsrb)
5959
{
60-
Net net;
61-
{
62-
Ptr<Importer> importer = createCaffeImporter(_tf("gtsrb.prototxt"), "");
63-
ASSERT_TRUE(importer != NULL);
64-
importer->populateNet(net);
65-
}
60+
Net net = readNetFromCaffe(_tf("gtsrb.prototxt"));
61+
ASSERT_FALSE(net.empty());
6662
}
6763

6864
TEST(Test_Caffe, read_googlenet)
6965
{
70-
Net net;
71-
{
72-
Ptr<Importer> importer = createCaffeImporter(_tf("bvlc_googlenet.prototxt"), "");
73-
ASSERT_TRUE(importer != NULL);
74-
importer->populateNet(net);
75-
}
66+
Net net = readNetFromCaffe(_tf("bvlc_googlenet.prototxt"));
67+
ASSERT_FALSE(net.empty());
7668
}
7769

7870
TEST(Reproducibility_AlexNet, Accuracy)
@@ -81,9 +73,8 @@ TEST(Reproducibility_AlexNet, Accuracy)
8173
{
8274
const string proto = findDataFile("dnn/bvlc_alexnet.prototxt", false);
8375
const string model = findDataFile("dnn/bvlc_alexnet.caffemodel", false);
84-
Ptr<Importer> importer = createCaffeImporter(proto, model);
85-
ASSERT_TRUE(importer != NULL);
86-
importer->populateNet(net);
76+
net = readNetFromCaffe(proto, model);
77+
ASSERT_FALSE(net.empty());
8778
}
8879

8980
Mat sample = imread(_tf("grace_hopper_227.png"));
@@ -107,9 +98,8 @@ TEST(Reproducibility_FCN, Accuracy)
10798
{
10899
const string proto = findDataFile("dnn/fcn8s-heavy-pascal.prototxt", false);
109100
const string model = findDataFile("dnn/fcn8s-heavy-pascal.caffemodel", false);
110-
Ptr<Importer> importer = createCaffeImporter(proto, model);
111-
ASSERT_TRUE(importer != NULL);
112-
importer->populateNet(net);
101+
net = readNetFromCaffe(proto, model);
102+
ASSERT_FALSE(net.empty());
113103
}
114104

115105
Mat sample = imread(_tf("street.png"));
@@ -136,9 +126,8 @@ TEST(Reproducibility_SSD, Accuracy)
136126
{
137127
const string proto = findDataFile("dnn/ssd_vgg16.prototxt", false);
138128
const string model = findDataFile("dnn/VGG_ILSVRC2016_SSD_300x300_iter_440000.caffemodel", false);
139-
Ptr<Importer> importer = createCaffeImporter(proto, model);
140-
ASSERT_TRUE(importer != NULL);
141-
importer->populateNet(net);
129+
net = readNetFromCaffe(proto, model);
130+
ASSERT_FALSE(net.empty());
142131
}
143132

144133
Mat sample = imread(_tf("street.png"));

modules/dnn/test/test_layers.cpp

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,8 @@ void testLayerUsingCaffeModels(String basename, bool useCaffeModel = false, bool
108108

109109
cv::setNumThreads(cv::getNumberOfCPUs());
110110

111-
Net net;
112-
{
113-
Ptr<Importer> importer = createCaffeImporter(prototxt, (useCaffeModel) ? caffemodel : String());
114-
ASSERT_TRUE(importer != NULL);
115-
importer->populateNet(net);
116-
}
111+
Net net = readNetFromCaffe(prototxt, (useCaffeModel) ? caffemodel : String());
112+
ASSERT_FALSE(net.empty());
117113

118114
Mat inp = blobFromNPY(inpfile);
119115
Mat ref = blobFromNPY(outfile);
@@ -252,12 +248,8 @@ TEST(Layer_Test_Concat, Accuracy)
252248

253249
static void test_Reshape_Split_Slice_layers()
254250
{
255-
Net net;
256-
{
257-
Ptr<Importer> importer = createCaffeImporter(_tf("reshape_and_slice_routines.prototxt"));
258-
ASSERT_TRUE(importer != NULL);
259-
importer->populateNet(net);
260-
}
251+
Net net = readNetFromCaffe(_tf("reshape_and_slice_routines.prototxt"));
252+
ASSERT_FALSE(net.empty());
261253

262254
Mat input(6, 12, CV_32F);
263255
RNG rng(0);
@@ -276,12 +268,9 @@ TEST(Layer_Test_Reshape_Split_Slice, Accuracy)
276268

277269
TEST(Layer_Conv_Elu, Accuracy)
278270
{
279-
Net net;
280-
{
281-
Ptr<Importer> importer = createTensorflowImporter(_tf("layer_elu_model.pb"));
282-
ASSERT_TRUE(importer != NULL);
283-
importer->populateNet(net);
284-
}
271+
Net net = readNetFromTensorflow(_tf("layer_elu_model.pb"));
272+
ASSERT_FALSE(net.empty());
273+
285274
Mat inp = blobFromNPY(_tf("layer_elu_in.npy"));
286275
Mat ref = blobFromNPY(_tf("layer_elu_out.npy"));
287276

modules/dnn/test/test_tf_importer.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,8 @@ TEST(Test_TensorFlow, read_inception)
2929
Net net;
3030
{
3131
const string model = findDataFile("dnn/tensorflow_inception_graph.pb", false);
32-
Ptr<Importer> importer = createTensorflowImporter(model);
33-
ASSERT_TRUE(importer != NULL);
34-
importer->populateNet(net);
32+
net = readNetFromTensorflow(model);
33+
ASSERT_FALSE(net.empty());
3534
}
3635

3736
Mat sample = imread(_tf("grace_hopper_227.png"));
@@ -53,9 +52,8 @@ TEST(Test_TensorFlow, inception_accuracy)
5352
Net net;
5453
{
5554
const string model = findDataFile("dnn/tensorflow_inception_graph.pb", false);
56-
Ptr<Importer> importer = createTensorflowImporter(model);
57-
ASSERT_TRUE(importer != NULL);
58-
importer->populateNet(net);
55+
net = readNetFromTensorflow(model);
56+
ASSERT_FALSE(net.empty());
5957
}
6058

6159
Mat sample = imread(_tf("grace_hopper_227.png"));

modules/dnn/test/test_torch_importer.cpp

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,22 +66,17 @@ static std::string _tf(TStr filename, bool inTorchDir = true)
6666
TEST(Torch_Importer, simple_read)
6767
{
6868
Net net;
69-
Ptr<Importer> importer;
70-
71-
ASSERT_NO_THROW( importer = createTorchImporter(_tf("net_simple_net.txt"), false) );
72-
ASSERT_TRUE( importer != NULL );
73-
importer->populateNet(net);
69+
ASSERT_NO_THROW(net = readNetFromTorch(_tf("net_simple_net.txt"), false));
70+
ASSERT_FALSE(net.empty());
7471
}
7572

7673
static void runTorchNet(String prefix, String outLayerName = "",
7774
bool check2ndBlob = false, bool isBinary = false)
7875
{
7976
String suffix = (isBinary) ? ".dat" : ".txt";
8077

81-
Net net;
82-
Ptr<Importer> importer = createTorchImporter(_tf(prefix + "_net" + suffix), isBinary);
83-
ASSERT_TRUE(importer != NULL);
84-
importer->populateNet(net);
78+
Net net = readNetFromTorch(_tf(prefix + "_net" + suffix), isBinary);
79+
ASSERT_FALSE(net.empty());
8580

8681
Mat inp, outRef;
8782
ASSERT_NO_THROW( inp = readTorchBlob(_tf(prefix + "_input" + suffix), isBinary) );
@@ -200,9 +195,8 @@ TEST(Torch_Importer, ENet_accuracy)
200195
Net net;
201196
{
202197
const string model = findDataFile("dnn/Enet-model-best.net", false);
203-
Ptr<Importer> importer = createTorchImporter(model, true);
204-
ASSERT_TRUE(importer != NULL);
205-
importer->populateNet(net);
198+
net = readNetFromTorch(model, true);
199+
ASSERT_FALSE(net.empty());
206200
}
207201

208202
Mat sample = imread(_tf("street.png", false));

0 commit comments

Comments
 (0)