Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit0ae1190

Browse files
committed
print all missing layers
1 parent34f7f56 commit0ae1190

File tree

4 files changed

+77
-22
lines changed

4 files changed

+77
-22
lines changed

‎modules/dnn/src/debug_utils.cpp‎

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
#include"precomp.hpp"
66

7+
#include<sstream>
8+
79
#include<opencv2/dnn/layer_reg.private.hpp>
810
#include<opencv2/dnn/utils/debug_utils.hpp>
911
#include<opencv2/core/utils/logger.hpp>
@@ -33,23 +35,46 @@ void skipModelImport(bool skip)
3335
DNN_SKIP_REAL_IMPORT = skip;
3436
}
3537

36-
booldetail::LayerHandler::addMissing(const std::string& name,const std::string& type)
38+
voiddetail::LayerHandler::addMissing(const std::string& name,const std::string& type)
3739
{
3840
cv::AutoLocklock(getLayerFactoryMutex());
3941
auto& registeredLayers =getLayerFactoryImpl();
4042

4143
// If we didn't add it, but can create it, it's custom and not missing.
4244
if (layers.find(type) == layers.end() && registeredLayers.find(type) != registeredLayers.end())
4345
{
44-
returnfalse;
46+
return;
4547
}
4648

47-
if (layers.insert(type).second)
49+
layers[type].insert(name);
50+
}
51+
52+
booldetail::LayerHandler::contains(const std::string& type)const
53+
{
54+
return layers.find(type) != layers.end();
55+
}
56+
57+
voiddetail::LayerHandler::printMissing()
58+
{
59+
if (layers.empty())
4860
{
49-
CV_LOG_ERROR(NULL,"DNN: Node='" << name <<"':\nType='"<< type <<"' is not supported.");
61+
return;
5062
}
5163

52-
returntrue;
64+
std::stringstream ss;
65+
ss <<"DNN: Not supported types:\n";
66+
for (constauto& type_names : layers)
67+
{
68+
constauto& type = type_names.first;
69+
ss <<"Type='" << type <<"', affected nodes:\n[";
70+
for (constauto& name : type_names.second)
71+
{
72+
ss <<"'" << name <<"',";
73+
}
74+
ss.seekp(-2, std::ios_base::end);
75+
ss <<"]\n";
76+
}
77+
CV_LOG_ERROR(NULL, ss.str());
5378
}
5479

5580
LayerParamsdetail::LayerHandler::getNotImplementedParams(const std::string& name,const std::string& op)

‎modules/dnn/src/dnn_common.hpp‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
#ifndef __OPENCV_DNN_COMMON_HPP__
66
#define__OPENCV_DNN_COMMON_HPP__
77

8-
#include<set>
8+
#include<unordered_set>
9+
#include<unordered_map>
910

1011
#include<opencv2/dnn.hpp>
1112

@@ -56,11 +57,15 @@ Net readNetDiagnostic(Args&& ... args)
5657
classLayerHandler
5758
{
5859
public:
59-
booladdMissing(const std::string& name,const std::string& type);
60+
voidaddMissing(const std::string& name,const std::string& type);
61+
boolcontains(const std::string& type)const;
62+
voidprintMissing();
6063

6164
protected:
6265
LayerParamsgetNotImplementedParams(const std::string& name,const std::string& op);
63-
std::set<std::string> layers;
66+
67+
private:
68+
std::unordered_map<std::string, std::unordered_set<std::string>> layers;
6469
};
6570

6671
structNetImplBase

‎modules/dnn/src/onnx/onnx_importer.cpp‎

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ CV__DNN_INLINE_NS_BEGIN
4141

4242
externbool DNN_DIAGNOSTICS_RUN;
4343

44+
classONNXLayerHandler;
45+
4446
classONNXImporter
4547
{
4648
opencv_onnx::ModelProto model_proto;
@@ -69,7 +71,7 @@ class ONNXImporter
6971
voidpopulateNet();
7072

7173
protected:
72-
detail::LayerHandler layerHandler;
74+
std::unique_ptr<ONNXLayerHandler> layerHandler;
7375
Net& dstNet;
7476

7577
opencv_onnx::GraphProto graph_proto;
@@ -87,6 +89,7 @@ class ONNXImporter
8789
voidhandleNode(const opencv_onnx::NodeProto& node_proto);
8890

8991
private:
92+
friendclassONNXLayerHandler;
9093
typedefvoid (ONNXImporter::*ONNXImporterNodeParser)(LayerParams& layerParams,const opencv_onnx::NodeProto& node_proto);
9194
typedef std::map<std::string, ONNXImporterNodeParser> DispatchMap;
9295

@@ -140,8 +143,37 @@ class ONNXImporter
140143
voidparseCustomLayer (LayerParams& layerParams,const opencv_onnx::NodeProto& node_proto);
141144
};
142145

146+
classONNXLayerHandler :publicdetail::LayerHandler
147+
{
148+
public:
149+
explicitONNXLayerHandler(ONNXImporter* importer_);
150+
151+
voidfillRegistry(const opencv_onnx::GraphProto& net);
152+
153+
protected:
154+
ONNXImporter* importer;
155+
};
156+
157+
ONNXLayerHandler::ONNXLayerHandler(ONNXImporter* importer_) : importer(importer_){}
158+
159+
voidONNXLayerHandler::fillRegistry(const opencv_onnx::GraphProto &net)
160+
{
161+
int layersSize = net.node_size();
162+
for (int li =0; li < layersSize; li++) {
163+
const opencv_onnx::NodeProto &node_proto = net.node(li);
164+
std::string name = node_proto.output(0);
165+
std::string type = node_proto.op_type();
166+
if (importer->dispatch.find(type) == importer->dispatch.end())
167+
{
168+
addMissing(name, type);
169+
}
170+
}
171+
printMissing();
172+
}
173+
143174
ONNXImporter::ONNXImporter(Net& net,constchar *onnxFile)
144-
: layerHandler(), dstNet(net), dispatch(buildDispatchMap())
175+
: layerHandler(DNN_DIAGNOSTICS_RUN ?new ONNXLayerHandler(this) :nullptr),
176+
dstNet(net), dispatch(buildDispatchMap())
145177
{
146178
hasDynamicShapes =false;
147179
CV_Assert(onnxFile);
@@ -162,7 +194,7 @@ ONNXImporter::ONNXImporter(Net& net, const char *onnxFile)
162194
}
163195

164196
ONNXImporter::ONNXImporter(Net& net,constchar* buffer,size_t sizeBuffer)
165-
: layerHandler(), dstNet(net), dispatch(buildDispatchMap())
197+
: layerHandler(DNN_DIAGNOSTICS_RUN ?new ONNXLayerHandler(this) : nullptr), dstNet(net), dispatch(buildDispatchMap())
166198
{
167199
hasDynamicShapes =false;
168200
CV_LOG_DEBUG(NULL,"DNN/ONNX: processing in-memory ONNX model (" << sizeBuffer <<" bytes)");
@@ -517,16 +549,8 @@ void ONNXImporter::populateNet()
517549
dstNet.setInputsNames(netInputs);
518550

519551
if (DNN_DIAGNOSTICS_RUN) {
520-
for (int li =0; li < layersSize; li++) {
521-
const opencv_onnx::NodeProto &node_proto = graph_proto.node(li);
522-
std::string name = node_proto.output(0);
523-
std::string type = node_proto.op_type();
524-
if (dispatch.find(type) == dispatch.end())
525-
{
526-
layerHandler.addMissing(name, type);
527-
}
528-
}
529552
CV_LOG_INFO(NULL,"DNN/ONNX: start diagnostic run!");
553+
layerHandler->fillRegistry(graph_proto);
530554
}
531555

532556
for(int li =0; li < layersSize; li++)

‎modules/dnn/src/tensorflow/tf_importer.cpp‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2453,7 +2453,7 @@ void TFImporter::parseCustomLayer(tensorflow::GraphDef& net, const tensorflow::N
24532453
}
24542454

24552455
TFImporter::TFImporter(Net& net,constchar *model,constchar *config)
2456-
:layerHandler(DNN_DIAGNOSTICS_RUN ?new TFLayerHandler(this) :nullptr),
2456+
: layerHandler(DNN_DIAGNOSTICS_RUN ?new TFLayerHandler(this) :nullptr),
24572457
dstNet(net), dispatch(buildDispatchMap())
24582458
{
24592459
if (model && model[0])
@@ -2932,11 +2932,12 @@ void TFLayerHandler::fillRegistry(const tensorflow::GraphDef& net)
29322932
addMissing(name, type);
29332933
}
29342934
}
2935+
printMissing();
29352936
};
29362937

29372938
boolTFLayerHandler::handleMissing(const tensorflow::NodeDef& layer)
29382939
{
2939-
bool missing =addMissing(layer.name(),layer.op());
2940+
bool missing =!contains(layer.op());
29402941

29412942
if (missing)
29422943
{

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp