mirror of
https://github.com/opencv/opencv.git
synced 2026-07-31 08:13:04 +04:00
Merge remote-tracking branch 'upstream/3.4' into merge-3.4
This commit is contained in:
@@ -116,9 +116,9 @@ message PriorBoxParameter {
|
||||
CENTER_SIZE = 2;
|
||||
}
|
||||
// Minimum box size (in pixels). Required!
|
||||
optional float min_size = 1;
|
||||
repeated float min_size = 1;
|
||||
// Maximum box size (in pixels). Required!
|
||||
optional float max_size = 2;
|
||||
repeated float max_size = 2;
|
||||
// Various of aspect ratios. Duplicate ratios will be ignored.
|
||||
// If none is provided, we use default ratio 1.
|
||||
repeated float aspect_ratio = 3;
|
||||
|
||||
@@ -198,7 +198,7 @@ public:
|
||||
virtual bool supportBackend(int backendId) CV_OVERRIDE
|
||||
{
|
||||
return backendId == DNN_BACKEND_OPENCV ||
|
||||
(backendId == DNN_BACKEND_INFERENCE_ENGINE && !_locPredTransposed && _bboxesNormalized && !_clip);
|
||||
(backendId == DNN_BACKEND_INFERENCE_ENGINE && !_locPredTransposed && _bboxesNormalized);
|
||||
}
|
||||
|
||||
bool getMemoryShapes(const std::vector<MatShape> &inputs,
|
||||
@@ -936,6 +936,7 @@ public:
|
||||
|
||||
InferenceEngine::Builder::Layer l = ieLayer;
|
||||
l.getParameters()["eta"] = std::string("1.0");
|
||||
l.getParameters()["clip"] = _clip;
|
||||
|
||||
return Ptr<BackendNode>(new InfEngineBackendNode(l));
|
||||
}
|
||||
|
||||
@@ -796,7 +796,7 @@ struct AbsValFunctor
|
||||
#ifdef HAVE_INF_ENGINE
|
||||
InferenceEngine::Builder::Layer initInfEngineBuilderAPI()
|
||||
{
|
||||
return InferenceEngine::Builder::ReLULayer("").setNegativeSlope(-1);
|
||||
return InferenceEngine::Builder::ReLULayer("").setNegativeSlope(-0.999999f);
|
||||
}
|
||||
#endif // HAVE_INF_ENGINE
|
||||
|
||||
|
||||
@@ -181,21 +181,20 @@ public:
|
||||
PriorBoxLayerImpl(const LayerParams ¶ms)
|
||||
{
|
||||
setParamsFrom(params);
|
||||
_minSize = getParameter<float>(params, "min_size", 0, false, 0);
|
||||
_flip = getParameter<bool>(params, "flip", 0, false, true);
|
||||
_clip = getParameter<bool>(params, "clip", 0, false, true);
|
||||
_bboxesNormalized = getParameter<bool>(params, "normalized_bbox", 0, false, true);
|
||||
|
||||
_aspectRatios.clear();
|
||||
|
||||
getParams("min_size", params, &_minSize);
|
||||
getAspectRatios(params);
|
||||
getVariance(params);
|
||||
|
||||
_maxSize = -1;
|
||||
if (params.has("max_size"))
|
||||
{
|
||||
_maxSize = params.get("max_size").get<float>(0);
|
||||
CV_Assert(_maxSize > _minSize);
|
||||
getParams("max_size", params, &_maxSize);
|
||||
CV_Assert(_minSize.size() == _maxSize.size());
|
||||
for (int i = 0; i < _maxSize.size(); i++)
|
||||
CV_Assert(_minSize[i] < _maxSize[i]);
|
||||
}
|
||||
|
||||
std::vector<float> widths, heights;
|
||||
@@ -214,25 +213,28 @@ public:
|
||||
}
|
||||
else
|
||||
{
|
||||
CV_Assert(_minSize > 0);
|
||||
_boxWidths.resize(1 + (_maxSize > 0 ? 1 : 0) + _aspectRatios.size());
|
||||
_boxHeights.resize(_boxWidths.size());
|
||||
_boxWidths[0] = _boxHeights[0] = _minSize;
|
||||
|
||||
int i = 1;
|
||||
if (_maxSize > 0)
|
||||
CV_Assert(!_minSize.empty());
|
||||
for (int i = 0; i < _minSize.size(); ++i)
|
||||
{
|
||||
// second prior: aspect_ratio = 1, size = sqrt(min_size * max_size)
|
||||
_boxWidths[i] = _boxHeights[i] = sqrt(_minSize * _maxSize);
|
||||
i += 1;
|
||||
}
|
||||
float minSize = _minSize[i];
|
||||
CV_Assert(minSize > 0);
|
||||
_boxWidths.push_back(minSize);
|
||||
_boxHeights.push_back(minSize);
|
||||
|
||||
// rest of priors
|
||||
for (size_t r = 0; r < _aspectRatios.size(); ++r)
|
||||
{
|
||||
float arSqrt = sqrt(_aspectRatios[r]);
|
||||
_boxWidths[i + r] = _minSize * arSqrt;
|
||||
_boxHeights[i + r] = _minSize / arSqrt;
|
||||
if (_maxSize.size() > 0)
|
||||
{
|
||||
float size = sqrt(minSize * _maxSize[i]);
|
||||
_boxWidths.push_back(size);
|
||||
_boxHeights.push_back(size);
|
||||
}
|
||||
|
||||
// rest of priors
|
||||
for (size_t r = 0; r < _aspectRatios.size(); ++r)
|
||||
{
|
||||
float arSqrt = sqrt(_aspectRatios[r]);
|
||||
_boxWidths.push_back(minSize * arSqrt);
|
||||
_boxHeights.push_back(minSize / arSqrt);
|
||||
}
|
||||
}
|
||||
}
|
||||
CV_Assert(_boxWidths.size() == _boxHeights.size());
|
||||
@@ -272,8 +274,9 @@ public:
|
||||
virtual bool supportBackend(int backendId) CV_OVERRIDE
|
||||
{
|
||||
return backendId == DNN_BACKEND_OPENCV ||
|
||||
(backendId == DNN_BACKEND_INFERENCE_ENGINE && haveInfEngine()) ||
|
||||
(backendId == DNN_BACKEND_VKCOM && haveVulkan());
|
||||
(backendId == DNN_BACKEND_INFERENCE_ENGINE && haveInfEngine() &&
|
||||
( _explicitSizes || (_minSize.size() == 1 && _maxSize.size() <= 1)))
|
||||
|| (backendId == DNN_BACKEND_VKCOM && haveVulkan());
|
||||
}
|
||||
|
||||
bool getMemoryShapes(const std::vector<MatShape> &inputs,
|
||||
@@ -523,10 +526,9 @@ public:
|
||||
InferenceEngine::Builder::PriorBoxLayer ieLayer(name);
|
||||
|
||||
CV_Assert(!_explicitSizes);
|
||||
|
||||
ieLayer.setMinSize(_minSize);
|
||||
if (_maxSize > 0)
|
||||
ieLayer.setMaxSize(_maxSize);
|
||||
ieLayer.setMinSize(_minSize[0]);
|
||||
if (!_maxSize.empty())
|
||||
ieLayer.setMaxSize(_maxSize[0]);
|
||||
|
||||
CV_CheckEQ(_offsetsX.size(), (size_t)1, ""); CV_CheckEQ(_offsetsY.size(), (size_t)1, ""); CV_CheckEQ(_offsetsX[0], _offsetsY[0], "");
|
||||
ieLayer.setOffset(_offsetsX[0]);
|
||||
@@ -573,8 +575,8 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
float _minSize;
|
||||
float _maxSize;
|
||||
std::vector<float> _minSize;
|
||||
std::vector<float> _maxSize;
|
||||
|
||||
float _stepX, _stepY;
|
||||
|
||||
|
||||
@@ -465,6 +465,20 @@ void ONNXImporter::populateNet(Net dstNet)
|
||||
}
|
||||
layerParams.set("begin", DictValue::arrayInt(&begin[0], begin.size()));
|
||||
layerParams.set("end", DictValue::arrayInt(&end[0], end.size()));
|
||||
}
|
||||
else if (layer_type == "Split")
|
||||
{
|
||||
DictValue splits = layerParams.get("split");
|
||||
const int numSplits = splits.size();
|
||||
CV_Assert(numSplits > 1);
|
||||
|
||||
std::vector<int> slicePoints(numSplits - 1, splits.get<int>(0));
|
||||
for (int i = 1; i < splits.size() - 1; ++i)
|
||||
{
|
||||
slicePoints[i] = slicePoints[i - 1] + splits.get<int>(i - 1);
|
||||
}
|
||||
layerParams.set("slice_point", DictValue::arrayInt(&slicePoints[0], slicePoints.size()));
|
||||
layerParams.type = "Slice";
|
||||
}
|
||||
else if (layer_type == "Add" || layer_type == "Sum")
|
||||
{
|
||||
@@ -486,6 +500,11 @@ void ONNXImporter::populateNet(Net dstNet)
|
||||
layerParams.type = "Eltwise";
|
||||
}
|
||||
}
|
||||
else if (layer_type == "Max")
|
||||
{
|
||||
layerParams.type = "Eltwise";
|
||||
layerParams.set("operation", "max");
|
||||
}
|
||||
else if (layer_type == "Sub")
|
||||
{
|
||||
Mat blob = getBlob(node_proto, constBlobs, 1);
|
||||
@@ -741,6 +760,16 @@ void ONNXImporter::populateNet(Net dstNet)
|
||||
{
|
||||
layerParams.type = "Permute";
|
||||
replaceLayerParam(layerParams, "perm", "order");
|
||||
|
||||
CV_Assert(node_proto.input_size() == 1);
|
||||
if (constBlobs.find(node_proto.input(0)) != constBlobs.end())
|
||||
{
|
||||
std::vector<Mat> inputs(1, getBlob(node_proto, constBlobs, 0)), transposed;
|
||||
runLayer(layerParams, inputs, transposed);
|
||||
CV_Assert(transposed.size() == 1);
|
||||
constBlobs.insert(std::make_pair(layerParams.name, transposed[0]));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else if (layer_type == "Unsqueeze")
|
||||
{
|
||||
@@ -906,8 +935,10 @@ void ONNXImporter::populateNet(Net dstNet)
|
||||
}
|
||||
|
||||
int id = dstNet.addLayer(layerParams.name, layerParams.type, layerParams);
|
||||
layer_id.insert(std::make_pair(layerParams.name, LayerInfo(id, 0)));
|
||||
|
||||
for (int i = 0; i < node_proto.output_size(); ++i)
|
||||
{
|
||||
layer_id.insert(std::make_pair(node_proto.output(i), LayerInfo(id, i)));
|
||||
}
|
||||
|
||||
std::vector<MatShape> layerInpShapes, layerOutShapes, layerInternalShapes;
|
||||
for (int j = 0; j < node_proto.input_size(); j++) {
|
||||
@@ -924,8 +955,10 @@ void ONNXImporter::populateNet(Net dstNet)
|
||||
// Compute shape of output blob for this layer.
|
||||
Ptr<Layer> layer = dstNet.getLayer(id);
|
||||
layer->getMemoryShapes(layerInpShapes, 0, layerOutShapes, layerInternalShapes);
|
||||
CV_Assert(!layerOutShapes.empty());
|
||||
outShapes[layerParams.name] = layerOutShapes[0];
|
||||
for (int i = 0; i < node_proto.output_size() && i < (int)layerOutShapes.size(); ++i)
|
||||
{
|
||||
outShapes[node_proto.output(i)] = layerOutShapes[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user