diff --git a/modules/dnn/src/layers/pooling_layer.cpp b/modules/dnn/src/layers/pooling_layer.cpp index ff62b6e55d..326e61ba64 100644 --- a/modules/dnn/src/layers/pooling_layer.cpp +++ b/modules/dnn/src/layers/pooling_layer.cpp @@ -1002,15 +1002,16 @@ virtual Ptr initNgraph(const std::vector >& inp std::vector inpShape(inputs[0].begin() + 2, inputs[0].end()); std::vector outShape(inputs[0].begin(), inputs[0].begin() + 2); - std::vector local_kernel = kernel_size.size() > inpShape.size() ? - std::vector(kernel_size.begin() + 1, kernel_size.end()) : kernel_size; - + std::vector local_kernel; if (globalPooling) { - for (int i = 0, j = kernel_size.size() - inpShape.size(); i < inpShape.size(); i++, j++) { - if (isGlobalPooling[j]) - local_kernel[i] = inpShape[i]; + for (int i = 0; i < inpShape.size(); i++) { + int idx = isGlobalPooling.size() - inpShape.size() + i; + local_kernel.push_back(isGlobalPooling[idx] ? inpShape[i] : kernel_size[idx]); } + } else { + local_kernel = kernel_size; } + if (type == ROI || type == PSROI) { outShape.push_back(pooledSize.height); @@ -1018,14 +1019,14 @@ virtual Ptr initNgraph(const std::vector >& inp } else if (padMode.empty()) { - for (int i = 0; i < pads_end.size(); i++) { + for (int i = 0; i < local_kernel.size(); i++) { float dst = (float)(inpShape[i] + pads_begin[i] + pads_end[i] - local_kernel[i]) / strides[i]; outShape.push_back(1 + (ceilMode ? ceil(dst) : floor(dst))); } // If we have padding, ensure that the last pooling starts strictly // inside the image (instead of at the padding); otherwise clip the last. - for (int i = 0; i < inpShape.size(); i++) { + for (int i = 0; i < pads_end.size(); i++) { if (pads_end[i] && (outShape[2 + i] - 1) * strides[i] >= inpShape[i] + pads_end[i]) { --outShape[2 + i]; CV_Assert((outShape[2 + i] - 1) * strides[i] < inpShape[i] + pads_end[i]);