diff --git a/modules/dnn/src/caffe/caffe_importer.cpp b/modules/dnn/src/caffe/caffe_importer.cpp index 6606fc301b..50e1fbe93f 100644 --- a/modules/dnn/src/caffe/caffe_importer.cpp +++ b/modules/dnn/src/caffe/caffe_importer.cpp @@ -279,8 +279,8 @@ public: // Half precision floats. CV_Assert(raw_data.size() / 2 == (int)dstBlob.total()); - Mat halfs((int)shape.size(), &shape[0], CV_16SC1, (void*)raw_data.c_str()); - convertFp16(halfs, dstBlob); + Mat halfs((int)shape.size(), &shape[0], CV_16FC1, (void*)raw_data.c_str()); + halfs.convertTo(dstBlob, CV_32F); } else if (pbBlob.raw_data_type() == caffe::FLOAT) { diff --git a/modules/dnn/src/caffe/caffe_shrinker.cpp b/modules/dnn/src/caffe/caffe_shrinker.cpp index 99e0ef85c1..a23ff5deb3 100644 --- a/modules/dnn/src/caffe/caffe_shrinker.cpp +++ b/modules/dnn/src/caffe/caffe_shrinker.cpp @@ -44,8 +44,8 @@ void shrinkCaffeModel(const String& src, const String& dst, const std::vectordata_size() != 0); // float32 array. Mat floats(1, blob->data_size(), CV_32FC1, (void*)blob->data().data()); - Mat halfs(1, blob->data_size(), CV_16SC1); - convertFp16(floats, halfs); // Convert to float16. + Mat halfs(1, blob->data_size(), CV_16FC1); + floats.convertTo(halfs, CV_16F); // Convert to float16. blob->clear_data(); // Clear float32 data. diff --git a/modules/dnn/src/ie_ngraph.cpp b/modules/dnn/src/ie_ngraph.cpp index 7eeb62bcf6..18aa8cc3b6 100644 --- a/modules/dnn/src/ie_ngraph.cpp +++ b/modules/dnn/src/ie_ngraph.cpp @@ -502,7 +502,7 @@ void InfEngineNgraphNet::init(Target targetId) size_t total = ngraph::shape_size(constant->get_shape()); Mat floats(1, total, CV_32F, (void*)floatsData); Mat halfs; - cv::convertFp16(floats, halfs); + floats.convertTo(halfs, CV_16F); auto new_const = std::make_shared(ngraph::element::f16, constant->get_shape(), halfs.data); new_const->set_friendly_name(constant->get_friendly_name()); diff --git a/modules/dnn/src/int8layers/quantization_utils.cpp b/modules/dnn/src/int8layers/quantization_utils.cpp index ece2a2f355..146ad68257 100644 --- a/modules/dnn/src/int8layers/quantization_utils.cpp +++ b/modules/dnn/src/int8layers/quantization_utils.cpp @@ -135,10 +135,10 @@ public: inputs_.getUMatVector(inputs); outputs_.getUMatVector(outputs); - if (inputs_.depth() == CV_16S) + if (inputs_.depth() == CV_16F) { UMat inputFp32; - convertFp16(inputs[0], inputFp32); + inputs[0].convertTo(inputFp32, CV_32F); inputs[0] = inputFp32; // replace } @@ -264,10 +264,7 @@ public: UMat outputFp32; inputs[0].convertTo(outputFp32, CV_32F, scales[0], -(scales[0]*zeropoints[0])); - if (outputs_.depth() == CV_16S) - convertFp16(outputFp32, outputs[0]); - else - outputFp32.copyTo(outputs[0]); + outputFp32.convertTo(outputs[0], outputs_.depth()); return true; } #endif diff --git a/modules/dnn/src/layer.cpp b/modules/dnn/src/layer.cpp index 17de43db8e..e988166c22 100644 --- a/modules/dnn/src/layer.cpp +++ b/modules/dnn/src/layer.cpp @@ -176,7 +176,7 @@ void Layer::forward_fallback(InputArrayOfArrays inputs_arr, OutputArrayOfArrays CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (preferableTarget == DNN_TARGET_OPENCL_FP16 && inputs_arr.depth() == CV_16S) + if (preferableTarget == DNN_TARGET_OPENCL_FP16 && inputs_arr.depth() == CV_16F) { std::vector inputs; std::vector outputs; @@ -192,7 +192,7 @@ void Layer::forward_fallback(InputArrayOfArrays inputs_arr, OutputArrayOfArrays inputs.resize(orig_inputs.size()); for (size_t i = 0; i < orig_inputs.size(); i++) - convertFp16(orig_inputs[i], inputs[i]); + orig_inputs[i].convertTo(inputs[i], CV_32F); outputs.resize(orig_outputs.size()); for (size_t i = 0; i < orig_outputs.size(); i++) @@ -205,7 +205,7 @@ void Layer::forward_fallback(InputArrayOfArrays inputs_arr, OutputArrayOfArrays forward(inputs, outputs, internals); for (size_t i = 0; i < outputs.size(); i++) - convertFp16(outputs[i], orig_outputs[i]); + outputs[i].convertTo(orig_outputs[i], CV_16F); // sync results back outputs_arr.assign(orig_outputs); diff --git a/modules/dnn/src/layer_internals.hpp b/modules/dnn/src/layer_internals.hpp index f19b99f260..149fb14866 100644 --- a/modules/dnn/src/layer_internals.hpp +++ b/modules/dnn/src/layer_internals.hpp @@ -146,7 +146,7 @@ struct DataLayer : public Layer CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)) - bool isFP16 = outputs_arr.depth() == CV_16S; + bool isFP16 = outputs_arr.depth() == CV_16F; std::vector outputs, internals; outputs_arr.getMatVector(outputs); @@ -159,7 +159,7 @@ struct DataLayer : public Layer CV_Assert(mean == Scalar() || inputsData[i].size[1] <= 4); if (isFP16) - CV_CheckTypeEQ(outputs[i].type(), CV_16SC1, ""); + CV_CheckTypeEQ(outputs[i].type(), CV_16FC1, ""); else CV_CheckTypeEQ(outputs[i].type(), CV_32FC1, ""); @@ -175,7 +175,7 @@ struct DataLayer : public Layer { Mat input_f32; inputsData[i].convertTo(input_f32, CV_32F, scale, -mean[0] * scale); - convertFp16(input_f32, outputs[i]); + input_f32.convertTo(outputs[i], CV_16F); } else { @@ -194,7 +194,7 @@ struct DataLayer : public Layer { Mat input_f32; inp.convertTo(input_f32, CV_32F, scale, -mean[c] * scale); - convertFp16(input_f32, out); + input_f32.convertTo(out, CV_16F); } else { @@ -209,7 +209,7 @@ struct DataLayer : public Layer #ifdef HAVE_OPENCL bool forward_ocl(InputArrayOfArrays, OutputArrayOfArrays outputs_, OutputArrayOfArrays internals_) { - bool isFP16 = outputs_.depth() == CV_16S; + bool isFP16 = outputs_.depth() == CV_16F; std::vector outputs; outputs_.getUMatVector(outputs); @@ -223,7 +223,7 @@ struct DataLayer : public Layer CV_Assert(mean == Scalar() || inputData.size[1] <= 4); if (isFP16) - CV_CheckTypeEQ(outputs[i].type(), CV_16SC1, ""); + CV_CheckTypeEQ(outputs[i].type(), CV_16FC1, ""); else CV_CheckTypeEQ(outputs[i].type(), CV_32FC1, ""); @@ -239,7 +239,7 @@ struct DataLayer : public Layer { UMat input_i; inputData.convertTo(input_i, CV_32F, scale, -mean[0] * scale); - convertFp16(input_i, outputs[i]); + input_i.convertTo(outputs[i], CV_16F); } else { @@ -263,7 +263,7 @@ struct DataLayer : public Layer { UMat input_i; inp.convertTo(input_i, CV_32F, scale, -mean[c] * scale); - convertFp16(input_i, out); + input_i.convertTo(out, CV_16F); } else { diff --git a/modules/dnn/src/layers/attention_layer.cpp b/modules/dnn/src/layers/attention_layer.cpp index 64b39297f5..085ec734da 100644 --- a/modules/dnn/src/layers/attention_layer.cpp +++ b/modules/dnn/src/layers/attention_layer.cpp @@ -106,7 +106,7 @@ class AttentionLayerImpl CV_FINAL : public AttentionLayer { CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/batch_norm_layer.cpp b/modules/dnn/src/layers/batch_norm_layer.cpp index 1d95096e60..ccc8354b42 100644 --- a/modules/dnn/src/layers/batch_norm_layer.cpp +++ b/modules/dnn/src/layers/batch_norm_layer.cpp @@ -192,7 +192,7 @@ public: std::vector inputs; std::vector outputs; - bool use_half = (inputs_.depth() == CV_16S); + bool use_half = (inputs_.depth() == CV_16F); inputs_.getUMatVector(inputs); outputs_.getUMatVector(outputs); @@ -266,7 +266,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/concat_layer.cpp b/modules/dnn/src/layers/concat_layer.cpp index a5af16f32e..3b4b622b2a 100644 --- a/modules/dnn/src/layers/concat_layer.cpp +++ b/modules/dnn/src/layers/concat_layer.cpp @@ -165,14 +165,14 @@ public: for( i = 0; i < ninputs; i++ ) { Mat& inp = inputs[i]; - CV_Assert( inp.isContinuous() && (inp.type() == CV_32F || inp.type() == CV_16S || inp.type() == CV_8S) && + CV_Assert( inp.isContinuous() && (inp.type() == CV_32F || inp.type() == CV_16F || inp.type() == CV_8S) && inp.dims == 4 && inp.size[0] == output.size[0] && inp.size[2] == output.size[2] && inp.size[3] == output.size[3] ); nchannels += inp.size[1]; } CV_Assert( nchannels == output.size[1] ); - CV_Assert( output.isContinuous() && (output.type() == CV_32F || output.type() == CV_16S || output.type() == CV_8S) ); + CV_Assert( output.isContinuous() && (output.type() == CV_32F || output.type() == CV_16F || output.type() == CV_8S) ); cc.chptrs.resize(nchannels*batchsz); @@ -223,7 +223,7 @@ public: std::vector inputs; std::vector outputs; - bool use_half = (inps.depth() == CV_16S); + bool use_half = (inps.depth() == CV_16F); inps.getUMatVector(inputs); outs.getUMatVector(outputs); diff --git a/modules/dnn/src/layers/const_layer.cpp b/modules/dnn/src/layers/const_layer.cpp index 2a1e27db56..a3f510c496 100644 --- a/modules/dnn/src/layers/const_layer.cpp +++ b/modules/dnn/src/layers/const_layer.cpp @@ -62,12 +62,12 @@ public: { std::vector outputs; outs.getUMatVector(outputs); - if (outs.depth() == CV_16S) { + if (outs.depth() == CV_16F) { auto blob = blobs[0]; if (blob.type() != CV_32F) { blob.convertTo(blob, CV_32F); } - convertFp16(blob, outputs[0]); + blob.convertTo(outputs[0], CV_16F); } else blobs[0].convertTo(outputs[0], outputs[0].type()); diff --git a/modules/dnn/src/layers/convolution_layer.cpp b/modules/dnn/src/layers/convolution_layer.cpp index dd6fa7bc1d..3f4c5e4069 100644 --- a/modules/dnn/src/layers/convolution_layer.cpp +++ b/modules/dnn/src/layers/convolution_layer.cpp @@ -140,7 +140,7 @@ public: } const Mat &input = inputs[0]; - CV_Assert(((input.dims == 3 && kernel_size.size() == 1) || input.dims == 4 || input.dims == 5) && (input.type() == CV_32F || input.type() == CV_16S)); + CV_Assert(((input.dims == 3 && kernel_size.size() == 1) || input.dims == 4 || input.dims == 5) && (input.type() == CV_32F || input.type() == CV_16F)); for (size_t i = 0; i < outputs.size(); i++) { CV_Assert(inputs[i].type() == input.type()); @@ -1023,7 +1023,7 @@ public: std::vector inputs; std::vector outputs; - bool use_half = (inps.depth() == CV_16S); + bool use_half = (inps.depth() == CV_16F); inps.getUMatVector(inputs); outs.getUMatVector(outputs); @@ -1037,6 +1037,7 @@ public: umat_blobs.resize(n); for (size_t i = 0; i < n; i++) { + CV_Assert(!use_half); // TODO: not implemented inputs[i + 1].copyTo(umat_blobs[i]); } inputs.resize(1); @@ -1049,7 +1050,7 @@ public: for (size_t i = 0; i < n; i++) { if (use_half) - convertFp16(blobs[i], umat_blobs[i]); + blobs[i].convertTo(umat_blobs[i], CV_16F); else blobs[i].copyTo(umat_blobs[i]); } @@ -1130,7 +1131,7 @@ public: if (fusedWeights) { if (use_half) - convertFp16(weightsMat, umat_blobs[0]); + weightsMat.convertTo(umat_blobs[0], CV_16F); else weightsMat.copyTo(umat_blobs[0]); fusedWeights = false; @@ -1140,7 +1141,7 @@ public: if ( umat_blobs.size() < 2 ) umat_blobs.resize(2); if (use_half) - convertFp16(Mat(biasvec, true), umat_blobs[1]); + Mat(biasvec, true).convertTo(umat_blobs[1], CV_16F); else Mat(biasvec, true).copyTo(umat_blobs[1]); convolutionOp->setBias(true); @@ -1203,7 +1204,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; @@ -1883,7 +1884,7 @@ public: std::vector outputs; std::vector internals; - if (inputs_.depth() == CV_16S) + if (inputs_.depth() == CV_16F) return false; inputs_.getUMatVector(inputs); @@ -1990,7 +1991,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)); - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/crop_and_resize_layer.cpp b/modules/dnn/src/layers/crop_and_resize_layer.cpp index a6f58f8983..43373ca4de 100644 --- a/modules/dnn/src/layers/crop_and_resize_layer.cpp +++ b/modules/dnn/src/layers/crop_and_resize_layer.cpp @@ -55,7 +55,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/cumsum_layer.cpp b/modules/dnn/src/layers/cumsum_layer.cpp index f94fa2750e..ae1c825f19 100644 --- a/modules/dnn/src/layers/cumsum_layer.cpp +++ b/modules/dnn/src/layers/cumsum_layer.cpp @@ -37,7 +37,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/detection_output_layer.cpp b/modules/dnn/src/layers/detection_output_layer.cpp index 26f483a770..9a7a56fe7a 100644 --- a/modules/dnn/src/layers/detection_output_layer.cpp +++ b/modules/dnn/src/layers/detection_output_layer.cpp @@ -337,7 +337,7 @@ public: std::vector outputs; outs.getUMatVector(outputs); - bool use_half = (inps.depth() == CV_16S); + bool use_half = (inps.depth() == CV_16F); if (use_half) { std::vector orig_inputs; @@ -345,7 +345,7 @@ public: inputs.resize(orig_inputs.size()); for (size_t i = 0; i < orig_inputs.size(); i++) - convertFp16(orig_inputs[i], inputs[i]); + orig_inputs[i].convertTo(inputs[i], CV_32F); } else { @@ -410,7 +410,7 @@ public: if (use_half) { UMat half_umat; - convertFp16(umat, half_umat); + umat.convertTo(half_umat, CV_16F); outs.assign(std::vector(1, half_umat)); } @@ -428,7 +428,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)) } - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/einsum_layer.cpp b/modules/dnn/src/layers/einsum_layer.cpp index d5153a5ab7..6faaae7ae2 100644 --- a/modules/dnn/src/layers/einsum_layer.cpp +++ b/modules/dnn/src/layers/einsum_layer.cpp @@ -454,7 +454,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/elementwise_layers.cpp b/modules/dnn/src/layers/elementwise_layers.cpp index 746db69603..7de854c179 100644 --- a/modules/dnn/src/layers/elementwise_layers.cpp +++ b/modules/dnn/src/layers/elementwise_layers.cpp @@ -243,7 +243,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(this->preferableTarget), func.applyOCL(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { Layer::forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/eltwise_layer.cpp b/modules/dnn/src/layers/eltwise_layer.cpp index 49b3c02de3..32caf29530 100644 --- a/modules/dnn/src/layers/eltwise_layer.cpp +++ b/modules/dnn/src/layers/eltwise_layer.cpp @@ -590,7 +590,7 @@ public: std::vector inputs; std::vector outputs; - if ((inputs_.depth() == CV_16S && op != SUM) || (channelsMode != ELTWISE_CHANNNELS_SAME)) + if ((inputs_.depth() == CV_16F && op != SUM) || (channelsMode != ELTWISE_CHANNNELS_SAME)) return false; if (hasVecInput) @@ -610,7 +610,7 @@ public: size_t localsize[] = { 128 }; size_t globalsize[] = { (size_t)channels / 4 * localsize[0] }; String opts; - if (inputs_.depth() == CV_16S) + if (inputs_.depth() == CV_16F) opts = " -DDtype=half -DDtype4=half4 -DDtype8=half8"; else opts = " -DDtype=float -DDtype4=float4 -DDtype8=float8"; @@ -636,7 +636,7 @@ public: } else { - if (inputs_.depth() == CV_16S) + if (inputs_.depth() == CV_16F) return false; float coeff1 = coeffs.empty() ? 1.f : coeffs[0]; @@ -689,7 +689,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/expand_layer.cpp b/modules/dnn/src/layers/expand_layer.cpp index c31a932ae1..752e741a97 100644 --- a/modules/dnn/src/layers/expand_layer.cpp +++ b/modules/dnn/src/layers/expand_layer.cpp @@ -105,7 +105,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/fully_connected_layer.cpp b/modules/dnn/src/layers/fully_connected_layer.cpp index 809630188a..29090652e1 100644 --- a/modules/dnn/src/layers/fully_connected_layer.cpp +++ b/modules/dnn/src/layers/fully_connected_layer.cpp @@ -357,7 +357,7 @@ public: std::vector inputs; std::vector outputs; - bool use_half = (inps.depth() == CV_16S); + bool use_half = (inps.depth() == CV_16F); inps.getUMatVector(inputs); outs.getUMatVector(outputs); @@ -385,9 +385,9 @@ public: if (use_half) { - convertFp16(A, A_fp32); - convertFp16(B, B_fp32); - convertFp16(C, C_fp32); + A.convertTo(A_fp32, CV_32F); + B.convertTo(B_fp32, CV_32F); + C.convertTo(C_fp32, CV_32F); } else { @@ -398,9 +398,9 @@ public: cv::gemm(A_fp32, B_fp32, 1, noArray(), 0, C_fp32); if (use_half) { - convertFp16(A_fp32, A); - convertFp16(B_fp32, B); - convertFp16(C_fp32, C); + A_fp32.convertTo(A, CV_16F); + B_fp32.convertTo(B, CV_16F); + C_fp32.convertTo(C, CV_16F); } } return true; @@ -431,7 +431,7 @@ public: for (int i = 0; i < umat_blobs.size(); i++) { if (!umat_blobs[i].empty()) - convertFp16(umat_blobs[i], half_blobs[i]); + umat_blobs[i].convertTo(half_blobs[i], CV_16F); } } @@ -472,8 +472,8 @@ public: if (use_half) { - convertFp16(srcMat, srcMat_fp32); - convertFp16(dstMat, dstMat_fp32); + srcMat.convertTo(srcMat_fp32, CV_32F); + dstMat.convertTo(dstMat_fp32, CV_32F); } else { @@ -491,8 +491,8 @@ public: } if (use_half) { - convertFp16(srcMat_fp32, srcMat); - convertFp16(dstMat_fp32, dstMat); + srcMat_fp32.convertTo(srcMat, CV_16F); + dstMat_fp32.convertTo(dstMat, CV_16F); } } @@ -508,7 +508,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget) && !isMatMul, forward_ocl(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/gather_elements_layer.cpp b/modules/dnn/src/layers/gather_elements_layer.cpp index c7bc43ea1a..da3ae939df 100644 --- a/modules/dnn/src/layers/gather_elements_layer.cpp +++ b/modules/dnn/src/layers/gather_elements_layer.cpp @@ -70,7 +70,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/gather_layer.cpp b/modules/dnn/src/layers/gather_layer.cpp index 924b5fcbc1..32b76886a3 100644 --- a/modules/dnn/src/layers/gather_layer.cpp +++ b/modules/dnn/src/layers/gather_layer.cpp @@ -57,12 +57,12 @@ public: const Mat& inp = inputs[0]; int indicesType = inputs[1].type(); - CV_CheckType(indicesType, indicesType == CV_32FC1 || indicesType == CV_16SC1, ""); + CV_CheckType(indicesType, indicesType == CV_32FC1 || indicesType == CV_16FC1, ""); Mat indices32S; - if (indicesType == CV_16S/*FP16*/) + if (indicesType == CV_16F/*FP16*/) { Mat indicesF32; - convertFp16(inputs[1], indicesF32); + inputs[1].convertTo(indicesF32, CV_32F); indicesF32.convertTo(indices32S, CV_32S); } else diff --git a/modules/dnn/src/layers/gemm_layer.cpp b/modules/dnn/src/layers/gemm_layer.cpp index 821700c83e..496d3871a2 100644 --- a/modules/dnn/src/layers/gemm_layer.cpp +++ b/modules/dnn/src/layers/gemm_layer.cpp @@ -172,7 +172,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/group_norm_layer.cpp b/modules/dnn/src/layers/group_norm_layer.cpp index 006e8fe7f8..f8df14b98c 100644 --- a/modules/dnn/src/layers/group_norm_layer.cpp +++ b/modules/dnn/src/layers/group_norm_layer.cpp @@ -60,7 +60,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) { + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; } @@ -95,7 +95,7 @@ public: float inv_norm_size = 1.f / norm_size; // no fp16 support - if (input.depth() == CV_16S) { + if (input.depth() == CV_16F) { return false; } diff --git a/modules/dnn/src/layers/instance_norm_layer.cpp b/modules/dnn/src/layers/instance_norm_layer.cpp index b43e9bbb7a..b6427238f2 100644 --- a/modules/dnn/src/layers/instance_norm_layer.cpp +++ b/modules/dnn/src/layers/instance_norm_layer.cpp @@ -73,7 +73,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; @@ -107,7 +107,7 @@ public: float inv_norm_size = 1.f / norm_size; // no fp16 support - if (input.depth() == CV_16S) { + if (input.depth() == CV_16F) { return false; } diff --git a/modules/dnn/src/layers/layer_norm.cpp b/modules/dnn/src/layers/layer_norm.cpp index f3d2667a0a..6ea1bee42a 100644 --- a/modules/dnn/src/layers/layer_norm.cpp +++ b/modules/dnn/src/layers/layer_norm.cpp @@ -99,7 +99,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; @@ -140,7 +140,7 @@ public: const auto &bias = inputs.size() == 3 ? inputs[2] : UMat::zeros(norm_size, 1, CV_32F); // no fp16 support - if (input.depth() == CV_16S) { + if (input.depth() == CV_16F) { return false; } diff --git a/modules/dnn/src/layers/lrn_layer.cpp b/modules/dnn/src/layers/lrn_layer.cpp index f8de64cb32..7d212dc888 100644 --- a/modules/dnn/src/layers/lrn_layer.cpp +++ b/modules/dnn/src/layers/lrn_layer.cpp @@ -121,7 +121,7 @@ public: std::vector inputs; std::vector outputs; - bool use_half = (inps.depth() == CV_16S); + bool use_half = (inps.depth() == CV_16F); inps.getUMatVector(inputs); outs.getUMatVector(outputs); @@ -166,7 +166,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/matmul_layer.cpp b/modules/dnn/src/layers/matmul_layer.cpp index c6cea65d87..1e9a8dfebe 100644 --- a/modules/dnn/src/layers/matmul_layer.cpp +++ b/modules/dnn/src/layers/matmul_layer.cpp @@ -119,7 +119,7 @@ class MatMulLayerImpl CV_FINAL : public MatMulLayer { CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; @@ -154,7 +154,7 @@ class MatMulLayerImpl CV_FINAL : public MatMulLayer { std::vector inputs; std::vector outputs; - bool use_half = (inputs_arr.depth() == CV_16S); + bool use_half = (inputs_arr.depth() == CV_16F); inputs_arr.getUMatVector(inputs); outputs_arr.getUMatVector(outputs); @@ -192,9 +192,9 @@ class MatMulLayerImpl CV_FINAL : public MatMulLayer { } if (use_half) { - convertFp16(A, A_fp32); - convertFp16(B, B_fp32); - convertFp16(C, C_fp32); + A.convertTo(A_fp32, CV_32F); + B.convertTo(B_fp32, CV_32F); + C.convertTo(C_fp32, CV_32F); } else { A_fp32 = A; B_fp32 = B; @@ -203,9 +203,9 @@ class MatMulLayerImpl CV_FINAL : public MatMulLayer { cv::gemm(A_fp32, B_fp32, 1.f, noArray(), 0.f, C_fp32); if (use_half) { - convertFp16(A_fp32, A); - convertFp16(B_fp32, B); - convertFp16(C_fp32, C); + A_fp32.convertTo(A, CV_16F); + B_fp32.convertTo(B, CV_16F); + C_fp32.convertTo(C, CV_16F); } } return true; diff --git a/modules/dnn/src/layers/max_unpooling_layer.cpp b/modules/dnn/src/layers/max_unpooling_layer.cpp index 7ed6c64ae8..d00887db3c 100644 --- a/modules/dnn/src/layers/max_unpooling_layer.cpp +++ b/modules/dnn/src/layers/max_unpooling_layer.cpp @@ -75,7 +75,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/mvn_layer.cpp b/modules/dnn/src/layers/mvn_layer.cpp index 43c33d82af..10ef1cfb34 100644 --- a/modules/dnn/src/layers/mvn_layer.cpp +++ b/modules/dnn/src/layers/mvn_layer.cpp @@ -149,7 +149,7 @@ public: UMat& bnorm_bias = umat_shift; const unsigned LOCAL_SIZE = 128; - bool use_half = (inputs[0].depth() == CV_16S); + bool use_half = (inputs[0].depth() == CV_16F); String opts = format(" -DT=%s -DT4=%s -Dconvert_T=%s -DLOCAL_SIZE=%u", use_half ? "half" : "float", use_half ? "half4" : "float4", use_half ? "convert_half4" : "convert_float4", LOCAL_SIZE @@ -164,7 +164,7 @@ public: CV_Assert(newRows != 0); MatShape s = shape(newRows, inpMat.total() / newRows); - UMat meanMat = UMat(s[0], 1, (use_half) ? CV_16S : CV_32F); + UMat meanMat = UMat(s[0], 1, (use_half) ? CV_16F : CV_32F); UMat tmpMat = UMat(s[0], s[1], CV_32F); float alpha = 1.0f / s[1]; @@ -226,7 +226,7 @@ public: if (normVariance && (row_size % 4 == 0) && (plane_size % 4 == 0)) return fast_forward_ocl(inputs, outputs); - if (inputs[0].depth() == CV_16S) + if (inputs[0].depth() == CV_16F) return false; String opts = format(" -DT=float -DT4=float4 -Dconvert_T=convert_float4"); @@ -309,7 +309,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/nary_eltwise_layers.cpp b/modules/dnn/src/layers/nary_eltwise_layers.cpp index b22eb5bbf0..a3f2ba351b 100644 --- a/modules/dnn/src/layers/nary_eltwise_layers.cpp +++ b/modules/dnn/src/layers/nary_eltwise_layers.cpp @@ -638,7 +638,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/normalize_bbox_layer.cpp b/modules/dnn/src/layers/normalize_bbox_layer.cpp index 431eeab82d..723d3c7f7f 100644 --- a/modules/dnn/src/layers/normalize_bbox_layer.cpp +++ b/modules/dnn/src/layers/normalize_bbox_layer.cpp @@ -112,7 +112,7 @@ public: std::vector outputs; std::vector internals; - if (inputs_.depth() == CV_16S) + if (inputs_.depth() == CV_16F) return false; inputs_.getUMatVector(inputs); @@ -193,7 +193,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/padding_layer.cpp b/modules/dnn/src/layers/padding_layer.cpp index f66d44b222..edb7f92413 100644 --- a/modules/dnn/src/layers/padding_layer.cpp +++ b/modules/dnn/src/layers/padding_layer.cpp @@ -129,17 +129,7 @@ public: if (paddingType == "constant") { - if (inputs_arr.depth() == CV_16S) - { - std::vector paddingValue_fp32(1, paddingValue); - std::vector paddingValue_fp16(1); - cv::convertFp16(paddingValue_fp32, paddingValue_fp16); - outputs[0].setTo(paddingValue_fp16[0]); - } - else if (inputs_arr.depth() == CV_8S) - outputs[0].setTo(saturate_cast(paddingValue)); - else - outputs[0].setTo(paddingValue); + outputs[0].setTo(paddingValue); inputs[0].copyTo(outputs[0](dstRanges)); } else if (paddingType == "reflect" || paddingType == "edge") diff --git a/modules/dnn/src/layers/permute_layer.cpp b/modules/dnn/src/layers/permute_layer.cpp index 4e6ca2543d..b7c8bcfdaf 100644 --- a/modules/dnn/src/layers/permute_layer.cpp +++ b/modules/dnn/src/layers/permute_layer.cpp @@ -319,7 +319,7 @@ public: mnew_stride.copyTo(unew_stride); } - bool use_half = (inps.depth() == CV_16S); + bool use_half = (inps.depth() == CV_16F); String opts = format("-DDtype=%s", use_half ? "half" : "float"); for (size_t i = 0; i < inputs.size(); i++) { @@ -350,7 +350,7 @@ public: inputs_arr.depth() != CV_8S, forward_ocl(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/pooling_layer.cpp b/modules/dnn/src/layers/pooling_layer.cpp index fb980c4152..ba077bdcc4 100644 --- a/modules/dnn/src/layers/pooling_layer.cpp +++ b/modules/dnn/src/layers/pooling_layer.cpp @@ -293,7 +293,7 @@ public: std::vector inputs; std::vector outputs; - bool use_half = (inps.depth() == CV_16S); + bool use_half = (inps.depth() == CV_16F); inps.getUMatVector(inputs); outs.getUMatVector(outputs); @@ -353,7 +353,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)) } - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/prior_box_layer.cpp b/modules/dnn/src/layers/prior_box_layer.cpp index bf25927480..1dc40b48ce 100644 --- a/modules/dnn/src/layers/prior_box_layer.cpp +++ b/modules/dnn/src/layers/prior_box_layer.cpp @@ -346,7 +346,7 @@ public: std::vector inputs; std::vector outputs; - bool use_half = (inps.depth() == CV_16S); + bool use_half = (inps.depth() == CV_16F); inps.getUMatVector(inputs); outs.getUMatVector(outputs); @@ -431,7 +431,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/proposal_layer.cpp b/modules/dnn/src/layers/proposal_layer.cpp index 2f2a33cc6f..d9df09c642 100644 --- a/modules/dnn/src/layers/proposal_layer.cpp +++ b/modules/dnn/src/layers/proposal_layer.cpp @@ -186,7 +186,7 @@ public: std::vector outputs; std::vector internals; - if (inputs_.depth() == CV_16S) + if (inputs_.depth() == CV_16F) return false; inputs_.getUMatVector(inputs); @@ -269,7 +269,7 @@ public: OCL_PERFORMANCE_CHECK(ocl::Device::getDefault().isIntel()), forward_ocl(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/recurrent_layers.cpp b/modules/dnn/src/layers/recurrent_layers.cpp index dc973816ef..7448511816 100644 --- a/modules/dnn/src/layers/recurrent_layers.cpp +++ b/modules/dnn/src/layers/recurrent_layers.cpp @@ -390,7 +390,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; @@ -906,7 +906,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; @@ -1066,7 +1066,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/reduce_layer.cpp b/modules/dnn/src/layers/reduce_layer.cpp index 77d8898df4..30f8139c25 100644 --- a/modules/dnn/src/layers/reduce_layer.cpp +++ b/modules/dnn/src/layers/reduce_layer.cpp @@ -456,7 +456,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/region_layer.cpp b/modules/dnn/src/layers/region_layer.cpp index 38b809e0f9..159fd5f7e1 100644 --- a/modules/dnn/src/layers/region_layer.cpp +++ b/modules/dnn/src/layers/region_layer.cpp @@ -161,7 +161,7 @@ public: std::vector outputs; // TODO: implement a logistic activation to classification scores. - if (useLogistic || inps.depth() == CV_16S) + if (useLogistic || inps.depth() == CV_16F) return false; inps.getUMatVector(inputs); @@ -232,7 +232,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/reorg_layer.cpp b/modules/dnn/src/layers/reorg_layer.cpp index ac7d1abfb1..7281190cdd 100644 --- a/modules/dnn/src/layers/reorg_layer.cpp +++ b/modules/dnn/src/layers/reorg_layer.cpp @@ -184,7 +184,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/resize_layer.cpp b/modules/dnn/src/layers/resize_layer.cpp index fe27748319..5b8b9f812f 100644 --- a/modules/dnn/src/layers/resize_layer.cpp +++ b/modules/dnn/src/layers/resize_layer.cpp @@ -115,7 +115,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/scale_layer.cpp b/modules/dnn/src/layers/scale_layer.cpp index 2a4e1a05d5..00b1281399 100644 --- a/modules/dnn/src/layers/scale_layer.cpp +++ b/modules/dnn/src/layers/scale_layer.cpp @@ -107,7 +107,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/scatterND_layer.cpp b/modules/dnn/src/layers/scatterND_layer.cpp index 0ab02146cb..64ddcd0c4f 100644 --- a/modules/dnn/src/layers/scatterND_layer.cpp +++ b/modules/dnn/src/layers/scatterND_layer.cpp @@ -74,7 +74,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) { + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; } diff --git a/modules/dnn/src/layers/scatter_layer.cpp b/modules/dnn/src/layers/scatter_layer.cpp index 24e4b54bc8..b4bcdee82e 100644 --- a/modules/dnn/src/layers/scatter_layer.cpp +++ b/modules/dnn/src/layers/scatter_layer.cpp @@ -68,7 +68,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) { + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; } diff --git a/modules/dnn/src/layers/shuffle_channel_layer.cpp b/modules/dnn/src/layers/shuffle_channel_layer.cpp index 2a698d270f..0d0ee2dfef 100644 --- a/modules/dnn/src/layers/shuffle_channel_layer.cpp +++ b/modules/dnn/src/layers/shuffle_channel_layer.cpp @@ -107,7 +107,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/layers/slice_layer.cpp b/modules/dnn/src/layers/slice_layer.cpp index c44d18182e..08172f3cdb 100644 --- a/modules/dnn/src/layers/slice_layer.cpp +++ b/modules/dnn/src/layers/slice_layer.cpp @@ -621,7 +621,7 @@ public: { std::vector inpIdx(dimsNum, 0); std::vector outIdx(dimsNum, 0); - if (inpMat.type() == CV_16S) + if (inpMat.type() == CV_16F) getSliceRecursive(inpMat, inpIdx, finalSliceRanges[i], sliceSteps[i], 0, dimsNum, outputs[i], outIdx); else if (inpMat.type() == CV_8S) getSliceRecursive(inpMat, inpIdx, finalSliceRanges[i], sliceSteps[i], 0, dimsNum, outputs[i], outIdx); diff --git a/modules/dnn/src/layers/softmax_layer.cpp b/modules/dnn/src/layers/softmax_layer.cpp index ff559e980a..18f4d6b61e 100644 --- a/modules/dnn/src/layers/softmax_layer.cpp +++ b/modules/dnn/src/layers/softmax_layer.cpp @@ -132,7 +132,7 @@ public: std::vector outputs; std::vector internals; - bool use_half = (inputs_.depth() == CV_16S); + bool use_half = (inputs_.depth() == CV_16F); inputs_.getUMatVector(inputs); outputs_.getUMatVector(outputs); internals_.getUMatVector(internals); @@ -217,7 +217,7 @@ public: CV_OCL_RUN(IS_DNN_OPENCL_TARGET(preferableTarget), forward_ocl(inputs_arr, outputs_arr, internals_arr)) - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return; diff --git a/modules/dnn/src/net_impl.cpp b/modules/dnn/src/net_impl.cpp index 09258642f9..936299922b 100644 --- a/modules/dnn/src/net_impl.cpp +++ b/modules/dnn/src/net_impl.cpp @@ -514,7 +514,7 @@ void Net::Impl::allocateLayer(int lid, const LayersShapesMap& layersShapes) CV_Assert(layerShapesIt != layersShapes.end()); if (preferableBackend == DNN_BACKEND_OPENCV && preferableTarget == DNN_TARGET_OPENCL_FP16 && ld.dtype == CV_32F) - ld.dtype = CV_16S; + ld.dtype = CV_16F; std::vector pinsForInternalBlobs; blobManager.allocateBlobsForLayer(ld, layerShapesIt->second, pinsForInternalBlobs); @@ -572,7 +572,7 @@ void Net::Impl::allocateLayers(const std::vector& blobsToKeep_) preferableTarget == DNN_TARGET_OPENCL_FP16 && layers[0].dtype == CV_32F) { - layers[0].outputBlobs[i].create(inp.dims, inp.size, CV_16S); + layers[0].outputBlobs[i].create(inp.dims, inp.size, CV_16F); } inputShapes.push_back(shape(inp)); } @@ -656,8 +656,8 @@ void Net::Impl::forwardLayer(LayerData& ld) { UMat& u = umat_outputBlobs[i]; Mat m; - if (u.depth() == CV_16S) // FP16 - convertFp16(u, m); + if (u.depth() == CV_16F) // FP16 + u.convertTo(m, CV_32F); else m = u.getMat(ACCESS_READ); if (!checkRange(m)) @@ -679,8 +679,8 @@ void Net::Impl::forwardLayer(LayerData& ld) { UMat& u = umat_inputBlobs[i]; Mat m; - if (u.depth() == CV_16S) // FP16 - convertFp16(u, m); + if (u.depth() == CV_16F) // FP16 + u.convertTo(m, CV_32F); else m = u.getMat(ACCESS_READ); std::cout << "INPUT " << i << " " << cv::typeToString(u.type()) << " " << shape(m) << std::endl; @@ -690,8 +690,8 @@ void Net::Impl::forwardLayer(LayerData& ld) { UMat& u = umat_outputBlobs[i]; Mat m; - if (u.depth() == CV_16S) // FP16 - convertFp16(u, m); + if (u.depth() == CV_16F) // FP16 + u.convertTo(m, CV_32F); else m = u.getMat(ACCESS_READ); std::cout << "OUTPUT " << i << " " << cv::typeToString(u.type()) << " " << shape(m) << std::endl; @@ -701,8 +701,8 @@ void Net::Impl::forwardLayer(LayerData& ld) { UMat& u = umat_internalBlobs[i]; Mat m; - if (u.depth() == CV_16S) // FP16 - convertFp16(u, m); + if (u.depth() == CV_16F) // FP16 + u.convertTo(m, CV_32F); else m = u.getMat(ACCESS_READ); std::cout << "INTERNAL " << i << " " << shape(m) << std::endl; @@ -981,12 +981,12 @@ void Net::Impl::forward(OutputArrayOfArrays outputBlobs, const String& outputNam ld.outputBlobsWrappers[i]->copyToHost(); } } - if (ld.outputBlobs[0].depth() == CV_16S) + if (ld.outputBlobs[0].depth() == CV_16F) { std::vector& outputvec = *(std::vector*)outputBlobs.getObj(); outputvec.resize(ld.outputBlobs.size()); for (int i = 0; i < outputvec.size(); i++) - convertFp16(ld.outputBlobs[i], outputvec[i]); + ld.outputBlobs[i].convertTo(outputvec[i], CV_32F); } else { @@ -1009,7 +1009,7 @@ void Net::Impl::forward(OutputArrayOfArrays outputBlobs, const String& outputNam std::vector out_vec = OpenCLBackendWrapper::getUMatVector(ld.outputBlobsWrappers); outputvec.resize(out_vec.size()); for (int i = 0; i < out_vec.size(); i++) - convertFp16(out_vec[i], outputvec[i]); + out_vec[i].convertTo(outputvec[i], CV_32F); } } else @@ -1275,7 +1275,7 @@ void Net::Impl::updateLayersShapes() preferableTarget == DNN_TARGET_OPENCL_FP16 && inputLayerData.dtype == CV_32F) { - inp.create(inp.dims, inp.size, CV_16S); + inp.create(inp.dims, inp.size, CV_16F); } inputShapes.push_back(shape(inp)); } @@ -1344,10 +1344,10 @@ Mat Net::Impl::getBlob(const LayerPin& pin) const ld.outputBlobsWrappers[pin.oid]->copyToHost(); } - if (ld.outputBlobs[pin.oid].depth() == CV_16S) + if (ld.outputBlobs[pin.oid].depth() == CV_16F) { Mat output_blob; - convertFp16(ld.outputBlobs[pin.oid], output_blob); + ld.outputBlobs[pin.oid].convertTo(output_blob, CV_32F); return output_blob; } else diff --git a/modules/dnn/src/ocl4dnn/src/math_functions.cpp b/modules/dnn/src/ocl4dnn/src/math_functions.cpp index c924d66b12..1da14c4c63 100644 --- a/modules/dnn/src/ocl4dnn/src/math_functions.cpp +++ b/modules/dnn/src/ocl4dnn/src/math_functions.cpp @@ -156,7 +156,7 @@ static bool ocl4dnnFastImageGEMM(const CBLAS_TRANSPOSE TransA, CHECK_EQ(gemm_type == GEMM_TYPE_FAST_IMAGE_32_1 || gemm_type == GEMM_TYPE_FAST_IMAGE_32_2 || gemm_type == GEMM_TYPE_FAST_IMAGE_B_IMAGE, true) << "Invalid fast image gemm type." << std::endl; - bool halfPrecisionMode = (A.depth() == CV_16S); + bool halfPrecisionMode = (A.depth() == CV_16F); if (is_image_a) { @@ -439,7 +439,7 @@ static bool ocl4dnnFastBufferGEMM(const CBLAS_TRANSPOSE TransA, CHECK_EQ(gemm_type == GEMM_TYPE_FAST_BUFFER, true) << "Invalid fast buffer gemm type." << std::endl; - bool halfPrecisionMode = (A.depth() == CV_16S); + bool halfPrecisionMode = (A.depth() == CV_16F); size_t sub_group_size = 8; bool is_small_batch = (M == 2 || M == 4 || M == 8); @@ -544,7 +544,7 @@ bool ocl4dnnGEMMCommon(const CBLAS_TRANSPOSE TransB, const UMat B_image, UMat C, const size_t max_image_size) { - bool halfPrecisionMode = (A.depth() == CV_16S); + bool halfPrecisionMode = (A.depth() == CV_16F); gemm_type_t gemm_type = halfPrecisionMode ? GEMM_TYPE_FAST_BUFFER : GEMM_TYPE_FAST_IMAGE_32_1; if (gemm_type == GEMM_TYPE_FAST_IMAGE_32_1 || @@ -594,7 +594,7 @@ bool ocl4dnnGEMV(const CBLAS_TRANSPOSE TransA, const int32_t offy) { bool ret = false; - bool use_half = (A.depth() == CV_16S); + bool use_half = (A.depth() == CV_16F); String opts; if (use_half) opts = format("-DDtype=%s -DDtype4=%s -Dconvert_Dtype=convert_%s", "half", "half4", "half"); @@ -665,7 +665,7 @@ bool ocl4dnnAXPY(const int32_t N, const Dtype alpha, const UMat X, const int32_t offX, UMat Y, const int32_t offY) { - bool use_half = (X.depth() == CV_16S); + bool use_half = (X.depth() == CV_16F); String opts; if (use_half) opts = "-DDtype=half -DDtype4=half4 -Dconvert_Dtype=convert_half"; diff --git a/modules/dnn/src/ocl4dnn/src/ocl4dnn_conv_spatial.cpp b/modules/dnn/src/ocl4dnn/src/ocl4dnn_conv_spatial.cpp index 283a0b88e9..5df82b24e4 100644 --- a/modules/dnn/src/ocl4dnn/src/ocl4dnn_conv_spatial.cpp +++ b/modules/dnn/src/ocl4dnn/src/ocl4dnn_conv_spatial.cpp @@ -582,10 +582,10 @@ bool OCL4DNNConvSpatial::Forward(const UMat& bottom, } if (use_half_ && !bias.empty()) - CV_CheckTypeEQ(bias.type(), CV_16SC1, ""); + CV_CheckTypeEQ(bias.type(), CV_16FC1, ""); if (use_half_) - CV_CheckTypeEQ(weight.type(), CV_16SC1, ""); + CV_CheckTypeEQ(weight.type(), CV_16FC1, ""); prepareKernel(bottom, top, weight, bias, numImages); if (bestKernelConfig.empty()) @@ -740,7 +740,7 @@ bool OCL4DNNConvSpatial::swizzleWeight(const UMat &weight, if (swizzled_weights_umat.empty()) swizzled_weights_umat.create(1, (int)alignSize(num_output_, 16) * channels_ * kernel_h_ * (int)alignSize(kernel_w_, 2), - (use_half_) ? CV_16SC1 : CV_32FC1); + (use_half_) ? CV_16FC1 : CV_32FC1); if (!interleave) { int32_t channels = channels_ / group_; @@ -777,8 +777,8 @@ bool OCL4DNNConvSpatial::swizzleWeight(const UMat &weight, UMat weight_tmp; // FP32 in half mode, TODO implement FP16 repack if (use_half_) { - CV_CheckTypeEQ(weight.type(), CV_16SC1, ""); - convertFp16(weight, weight_tmp); + CV_CheckTypeEQ(weight.type(), CV_16FC1, ""); + weight.convertTo(weight_tmp, CV_32F); weightMat = weight_tmp.getMat(ACCESS_READ); swizzledWeightMat.create(shape(swizzled_weights_umat), CV_32F); } @@ -817,7 +817,7 @@ bool OCL4DNNConvSpatial::swizzleWeight(const UMat &weight, weightMat.release(); if (use_half_) - convertFp16(swizzledWeightMat, swizzled_weights_umat); + swizzledWeightMat.convertTo(swizzled_weights_umat, CV_16F); } return true; @@ -1140,7 +1140,7 @@ bool OCL4DNNConvSpatial::verifyResult(const UMat &bottom, //int32_t sz[4] = {numImages, num_output_, output_h_, output_w_}; CV_CheckEQ(top.total(), (size_t)numImages * num_output_ * output_h_ * output_w_, ""); - CV_CheckTypeEQ(top.type(), (use_half_) ? CV_16SC1 : CV_32FC1, ""); + CV_CheckTypeEQ(top.type(), (use_half_) ? CV_16FC1 : CV_32FC1, ""); top.setTo(Scalar::all(0)); bool saved_tuned = tuned_; @@ -1154,8 +1154,8 @@ bool OCL4DNNConvSpatial::verifyResult(const UMat &bottom, Mat mat_top, mat_verify_top; if (use_half_) { - convertFp16(top, new_top); - convertFp16(verifyTop, new_verify_top); + top.convertTo(new_top, CV_32F); + verifyTop.convertTo(new_verify_top, CV_32F); mat_top = new_top.getMat(ACCESS_READ); mat_verify_top = new_verify_top.getMat(ACCESS_READ); @@ -1827,7 +1827,7 @@ void OCL4DNNConvSpatial::prepareKernel(const UMat &bottom, UMat &top, if (loadTunedConfig()) // check external storage return; - UMat benchData(1, numImages * top_dim_, (use_half_) ? CV_16SC1 : CV_32FC1); + UMat benchData(1, numImages * top_dim_, (use_half_) ? CV_16FC1 : CV_32FC1); calculateBenchmark(bottom, benchData, weight, bias, numImages); diff --git a/modules/dnn/src/ocl4dnn/src/ocl4dnn_inner_product.cpp b/modules/dnn/src/ocl4dnn/src/ocl4dnn_inner_product.cpp index d45ff8c634..51b459ea1e 100644 --- a/modules/dnn/src/ocl4dnn/src/ocl4dnn_inner_product.cpp +++ b/modules/dnn/src/ocl4dnn/src/ocl4dnn_inner_product.cpp @@ -102,10 +102,10 @@ bool OCL4DNNInnerProduct::Forward(const UMat& bottom, UMat biasOneMat = UMat::ones(M_, 1, CV_32F); UMat newbias, tmpTop; - convertFp16(bias, newbias); - convertFp16(top, tmpTop); + bias.convertTo(newbias, CV_32F); + top.convertTo(tmpTop, CV_32F); cv::gemm(biasOneMat, newbias, 1, tmpTop, 1, tmpTop, 0); - convertFp16(tmpTop, top); + tmpTop.convertTo(top, CV_16F); } else { UMat biasOnesMat = UMat::ones(M_, 1, CV_32F); cv::gemm(biasOnesMat, bias, 1, top, 1, top, 0); diff --git a/modules/dnn/src/onnx/onnx_importer.cpp b/modules/dnn/src/onnx/onnx_importer.cpp index 72b93dfef3..7e3d1017e6 100644 --- a/modules/dnn/src/onnx/onnx_importer.cpp +++ b/modules/dnn/src/onnx/onnx_importer.cpp @@ -2443,7 +2443,7 @@ void ONNXImporter::parseCast(LayerParams& layerParams, const opencv_onnx::NodePr case opencv_onnx::TensorProto_DataType_FLOAT: type = CV_32F; break; case opencv_onnx::TensorProto_DataType_UINT8: type = CV_8U; break; case opencv_onnx::TensorProto_DataType_UINT16: type = CV_16U; break; - case opencv_onnx::TensorProto_DataType_FLOAT16: type = CV_16S; break; + case opencv_onnx::TensorProto_DataType_FLOAT16: type = CV_16F; break; case opencv_onnx::TensorProto_DataType_INT8: case opencv_onnx::TensorProto_DataType_INT16: case opencv_onnx::TensorProto_DataType_INT32: diff --git a/modules/dnn/src/tensorflow/tf_graph_simplifier.cpp b/modules/dnn/src/tensorflow/tf_graph_simplifier.cpp index 8ba1963512..45fcacbe34 100644 --- a/modules/dnn/src/tensorflow/tf_graph_simplifier.cpp +++ b/modules/dnn/src/tensorflow/tf_graph_simplifier.cpp @@ -915,22 +915,22 @@ Mat getTensorContentRef_(const tensorflow::TensorProto& tensor) } case tensorflow::DT_HALF: { - Mat halfs; if (!content.empty()) { static const int kHalfSize = 2; - halfs = Mat(1, content.size() / kHalfSize, CV_16UC1, (void*)content.c_str()); + Mat halfs(1, content.size() / kHalfSize, CV_16FC1, (void*)content.c_str()); + halfs.convertTo(m, CV_32F); } else { const RepeatedField& field = tensor.half_val(); CV_Assert(!field.empty()); Mat ints(1, field.size(), CV_32SC1, (void*)field.data()); + Mat halfs; ints.convertTo(halfs, CV_16UC1); + Mat halfsSigned(halfs.size(), CV_16FC1, halfs.data); + halfsSigned.convertTo(m, CV_32F); } - // Reinterpret as a signed shorts just for a convertFp16 call. - Mat halfsSigned(halfs.size(), CV_16SC1, halfs.data); - convertFp16(halfsSigned, m); break; } case tensorflow::DT_QUINT8: diff --git a/modules/dnn/src/tflite/tflite_importer.cpp b/modules/dnn/src/tflite/tflite_importer.cpp index 7feded69ce..ed51b4461a 100644 --- a/modules/dnn/src/tflite/tflite_importer.cpp +++ b/modules/dnn/src/tflite/tflite_importer.cpp @@ -101,7 +101,7 @@ Mat TFLiteImporter::parseTensor(const Tensor& tensor) dtype = CV_32S; break; case TensorType_FLOAT16: - dtype = CV_16S; + dtype = CV_16F; break; case TensorType_INT8: dtype = CV_8S; @@ -227,7 +227,7 @@ void TFLiteImporter::populateNet() if (!data.empty()) { // Dequantize a buffer Mat dataFP32; - convertFp16(data, dataFP32); + data.convertTo(dataFP32, CV_32F); allTensors[op_outputs->Get(0)] = dataFP32; continue; } diff --git a/modules/dnn/src/torch/torch_importer.cpp b/modules/dnn/src/torch/torch_importer.cpp index 9fe65e9817..be4f3fe851 100644 --- a/modules/dnn/src/torch/torch_importer.cpp +++ b/modules/dnn/src/torch/torch_importer.cpp @@ -84,7 +84,7 @@ enum TorchType TYPE_FLOAT = CV_32F, TYPE_BYTE = CV_8U, TYPE_CHAR = CV_8S, - TYPE_SHORT = CV_16S, + TYPE_SHORT = CV_16F, TYPE_INT = CV_32S, TYPE_LONG = CV_32SC2 }; @@ -276,7 +276,7 @@ struct TorchImporter THFile_readByteRaw(file, (uchar*)storageMat.data, size); break; case TYPE_SHORT: - storageMat.create(1, size, CV_16S); + storageMat.create(1, size, CV_16F); THFile_readShortRaw(file, (short*)storageMat.data, size); break; case TYPE_INT: diff --git a/modules/dnn/test/test_layers.cpp b/modules/dnn/test/test_layers.cpp index 744128544b..81c66b970f 100644 --- a/modules/dnn/test/test_layers.cpp +++ b/modules/dnn/test/test_layers.cpp @@ -1613,7 +1613,7 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - if (inputs_arr.depth() == CV_16S) + if (inputs_arr.depth() == CV_16F) { forward_fallback(inputs_arr, outputs_arr, internals_arr); return;