diff --git a/modules/dnn/src/layers/nll_loss_layer.cpp b/modules/dnn/src/layers/nll_loss_layer.cpp index b7ddd7929f..589bf3d891 100644 --- a/modules/dnn/src/layers/nll_loss_layer.cpp +++ b/modules/dnn/src/layers/nll_loss_layer.cpp @@ -52,7 +52,8 @@ public: } else { - out.assign(1, MatShape(1, 1)); + // Reduced (mean/sum) loss is a rank-0 scalar in ONNX, not a [1] tensor. + out.assign(1, MatShape::scalar()); } return false; } @@ -164,7 +165,7 @@ public: } } const float out = (reduction == LOSS_REDUCTION_SUM) ? static_cast(num) : static_cast((den > 0.0) ? (num / den) : 0.0); - out_loss.at(0) = out; + out_loss.ptr()[0] = out; } } diff --git a/modules/dnn/src/layers/softmax_cross_entropy_loss_layer.cpp b/modules/dnn/src/layers/softmax_cross_entropy_loss_layer.cpp index 4943d5abc5..ff3fc77691 100644 --- a/modules/dnn/src/layers/softmax_cross_entropy_loss_layer.cpp +++ b/modules/dnn/src/layers/softmax_cross_entropy_loss_layer.cpp @@ -49,7 +49,8 @@ public: for (size_t i = 2; i < x.size(); ++i) y.push_back(x[i]); out.push_back(y); } else { - out.push_back(MatShape(1,1)); + // Reduced (mean/sum) loss is a rank-0 scalar in ONNX, not a [1] tensor. + out.push_back(MatShape::scalar()); } if (requiredOutputs >= 2) @@ -325,7 +326,7 @@ public: const float out = (reduction == LOSS_REDUCTION_SUM) ? static_cast(num) : static_cast((den > 0.0) ? (num / den) : 0.0); - out_loss.at(0) = out; + out_loss.ptr()[0] = out; } } diff --git a/modules/python/src2/cv2_convert.cpp b/modules/python/src2/cv2_convert.cpp index 01d48a362d..a812e9654a 100644 --- a/modules/python/src2/cv2_convert.cpp +++ b/modules/python/src2/cv2_convert.cpp @@ -316,7 +316,22 @@ template<> PyObject* pyopencv_from(const cv::Mat& m) { if( !m.data ) + { + // Shaped Mat with a zero-length dim: return a matching empty array, not None. + if( m.dims >= 1 ) + { + int cn = m.channels(); + int typenum = cvDepthToNumpyType(m.depth()); + int dims = m.dims; + cv::AutoBuffer _sizes(dims + 1); + for( int i = 0; i < dims; i++ ) + _sizes[i] = (npy_intp)m.size[i]; + if( cn > 1 ) + _sizes[dims++] = cn; + return PyArray_SimpleNew(dims, _sizes.data(), typenum); + } Py_RETURN_NONE; + } // 0D (scalar) Mat: return a true 0D numpy array. if( m.dims == 0 ) {