From 48b8099214c53693cd8e8cc8494df761497b35a4 Mon Sep 17 00:00:00 2001 From: Andrei Fedorov Date: Wed, 10 Jun 2026 13:55:20 +0200 Subject: [PATCH] added more perf tests for blobFromImages --- modules/dnn/perf/perf_utils.cpp | 339 ++++++++++++++++++++++++++++++++ 1 file changed, 339 insertions(+) diff --git a/modules/dnn/perf/perf_utils.cpp b/modules/dnn/perf/perf_utils.cpp index 1ab544b3eb..c6a1887afb 100644 --- a/modules/dnn/perf/perf_utils.cpp +++ b/modules/dnn/perf/perf_utils.cpp @@ -63,4 +63,343 @@ INSTANTIATE_TEST_CASE_P(/**/, Utils_blobFromImages, std::vector{16, 2048, 2048}) ); +// NCHW, 8U->32F, C3, mean+scale+swapRB at 640x640 +using Utils_blobFromImage_8U_NCHW = TestBaseWithParam>; +PERF_TEST_P_(Utils_blobFromImage_8U_NCHW, MeanScale_SwapRB) { + std::vector input_shape = GetParam(); + + Mat input(input_shape, CV_8UC3); + randu(input, 0, 255); + + TEST_CYCLE() { + Mat blob = blobFromImage(input, 1.0/255.0, Size(), Scalar(104, 117, 123), true, false, CV_32F); + } + + SANITY_CHECK_NOTHING(); +} + +INSTANTIATE_TEST_CASE_P(/**/, Utils_blobFromImage_8U_NCHW, + Values(std::vector{ 640, 640}) +); + +// NHWC, 8U->32F, C3 +using Utils_blobFromImage_8U_NHWC = TestBaseWithParam>; +PERF_TEST_P_(Utils_blobFromImage_8U_NHWC, SwapRB) { + std::vector input_shape = GetParam(); + + Mat input(input_shape, CV_8UC3); + randu(input, 0, 255); + + Image2BlobParams params; + params.scalefactor = Scalar::all(1.0); + params.swapRB = true; + params.datalayout = DNN_LAYOUT_NHWC; + + TEST_CYCLE() { + Mat blob = blobFromImageWithParams(input, params); + } + + SANITY_CHECK_NOTHING(); +} + +PERF_TEST_P_(Utils_blobFromImage_8U_NHWC, MeanScale_SwapRB) { + std::vector input_shape = GetParam(); + + Mat input(input_shape, CV_8UC3); + randu(input, 0, 255); + + Image2BlobParams params; + params.scalefactor = Scalar::all(1.0/255.0); + params.mean = Scalar(104, 117, 123); + params.swapRB = true; + params.datalayout = DNN_LAYOUT_NHWC; + + TEST_CYCLE() { + Mat blob = blobFromImageWithParams(input, params); + } + + SANITY_CHECK_NOTHING(); +} + +INSTANTIATE_TEST_CASE_P(/**/, Utils_blobFromImage_8U_NHWC, + Values(std::vector{ 224, 224}, + std::vector{ 640, 640}) +); + +// NHWC, 32F->32F, C3 +using Utils_blobFromImage_32F_NHWC = TestBaseWithParam>; +PERF_TEST_P_(Utils_blobFromImage_32F_NHWC, SwapRB) { + std::vector input_shape = GetParam(); + + Mat input(input_shape, CV_32FC3); + randu(input, 0.0f, 1.0f); + + Image2BlobParams params; + params.scalefactor = Scalar::all(1.0); + params.swapRB = true; + params.datalayout = DNN_LAYOUT_NHWC; + + TEST_CYCLE() { + Mat blob = blobFromImageWithParams(input, params); + } + + SANITY_CHECK_NOTHING(); +} + +PERF_TEST_P_(Utils_blobFromImage_32F_NHWC, MeanScale_SwapRB) { + std::vector input_shape = GetParam(); + + Mat input(input_shape, CV_32FC3); + randu(input, 0.0f, 1.0f); + + Image2BlobParams params; + params.scalefactor = Scalar::all(1.0/0.226); + params.mean = Scalar(0.485, 0.456, 0.406); + params.swapRB = true; + params.datalayout = DNN_LAYOUT_NHWC; + + TEST_CYCLE() { + Mat blob = blobFromImageWithParams(input, params); + } + + SANITY_CHECK_NOTHING(); +} + +INSTANTIATE_TEST_CASE_P(/**/, Utils_blobFromImage_32F_NHWC, + Values(std::vector{ 224, 224}, + std::vector{ 640, 640}) +); + +// Resize+crop, 8U->32F, C3, mean+scale+swapRB to 640x640 +using Utils_blobFromImage_8U_Resize = TestBaseWithParam>; +PERF_TEST_P_(Utils_blobFromImage_8U_Resize, NHWC_Crop_MeanScale_SwapRB) { + std::vector input_shape = GetParam(); + + Mat input(input_shape, CV_8UC3); + randu(input, 0, 255); + + Image2BlobParams params; + params.scalefactor = Scalar::all(1.0/255.0); + params.size = Size(640, 640); + params.mean = Scalar(104, 117, 123); + params.swapRB = true; + params.datalayout = DNN_LAYOUT_NHWC; + params.paddingmode = DNN_PMODE_CROP_CENTER; + + TEST_CYCLE() { + Mat blob = blobFromImageWithParams(input, params); + } + + SANITY_CHECK_NOTHING(); +} + +PERF_TEST_P_(Utils_blobFromImage_8U_Resize, NCHW_Crop_MeanScale_SwapRB) { + std::vector input_shape = GetParam(); + + Mat input(input_shape, CV_8UC3); + randu(input, 0, 255); + + TEST_CYCLE() { + Mat blob = blobFromImage(input, 1.0/255.0, Size(640, 640), Scalar(104, 117, 123), true, true, CV_32F); + } + + SANITY_CHECK_NOTHING(); +} + +INSTANTIATE_TEST_CASE_P(/**/, Utils_blobFromImage_8U_Resize, + Values(std::vector{ 720, 1280}, + std::vector{ 1080, 1920}, + std::vector{ 2160, 3840}) +); + +// Resize+crop, NCHW, 32F->32F, C3, mean+scale+swapRB to 300x300 +using Utils_blobFromImage_32F_NCHW_Resize = TestBaseWithParam>; +PERF_TEST_P_(Utils_blobFromImage_32F_NCHW_Resize, Crop_MeanScale_SwapRB_To300) { + std::vector input_shape = GetParam(); + + Mat input(input_shape, CV_32FC3); + randu(input, 0.0f, 1.0f); + + TEST_CYCLE() { + Mat blob = blobFromImage(input, 1.0/0.226, Size(300, 300), Scalar(0.485, 0.456, 0.406), true, true, CV_32F); + } + + SANITY_CHECK_NOTHING(); +} + +INSTANTIATE_TEST_CASE_P(/**/, Utils_blobFromImage_32F_NCHW_Resize, + Values(std::vector{ 720, 1280}, + std::vector{ 1080, 1920}) +); + +// Resize+crop, NCHW, 8U->8U, C3 +using Utils_blobFromImage_8U_to_8U_Crop = TestBaseWithParam>; +PERF_TEST_P_(Utils_blobFromImage_8U_to_8U_Crop, NCHW_SwapRB) { + std::vector input_shape = GetParam(); + + Mat input(input_shape, CV_8UC3); + randu(input, 0, 255); + + TEST_CYCLE() { + Mat blob = blobFromImage(input, 1.0, Size(640, 640), Scalar(), true, true, CV_8U); + } + + SANITY_CHECK_NOTHING(); +} + +PERF_TEST_P_(Utils_blobFromImage_8U_to_8U_Crop, NCHW) { + std::vector input_shape = GetParam(); + + Mat input(input_shape, CV_8UC3); + randu(input, 0, 255); + + TEST_CYCLE() { + Mat blob = blobFromImage(input, 1.0, Size(640, 640), Scalar(), false, true, CV_8U); + } + + SANITY_CHECK_NOTHING(); +} + +INSTANTIATE_TEST_CASE_P(/**/, Utils_blobFromImage_8U_to_8U_Crop, + Values(std::vector{ 1080, 1920}, + std::vector{ 2160, 3840}) +); + +// Resize, NCHW, 8U->8U, C3 +using Utils_blobFromImage_8U_to_8U_Resize = TestBaseWithParam>; +PERF_TEST_P_(Utils_blobFromImage_8U_to_8U_Resize, NCHW_SwapRB) { + std::vector input_shape = GetParam(); + + Mat input(input_shape, CV_8UC3); + randu(input, 0, 255); + + TEST_CYCLE() { + Mat blob = blobFromImage(input, 1.0, Size(640, 640), Scalar(), true, false, CV_8U); + } + + SANITY_CHECK_NOTHING(); +} + +INSTANTIATE_TEST_CASE_P(/**/, Utils_blobFromImage_8U_to_8U_Resize, + Values(std::vector{ 1080, 1920}, + std::vector{ 2160, 3840}) +); + +// Resize+crop, NCHW, 32F->32F, C1, mean +using Utils_blobFromImage_32F_NCHW_C1 = TestBaseWithParam>; +PERF_TEST_P_(Utils_blobFromImage_32F_NCHW_C1, Crop_MeanScale_To224) { + std::vector input_shape = GetParam(); + + Mat input(input_shape, CV_32FC1); + randu(input, 0.0f, 1.0f); + + TEST_CYCLE() { + Mat blob = blobFromImage(input, 1.0/0.226, Size(224, 224), Scalar(0.5), false, true, CV_32F); + } + + SANITY_CHECK_NOTHING(); +} + +PERF_TEST_P_(Utils_blobFromImage_32F_NCHW_C1, Crop_MeanScale_To640) { + std::vector input_shape = GetParam(); + + Mat input(input_shape, CV_32FC1); + randu(input, 0.0f, 1.0f); + + TEST_CYCLE() { + Mat blob = blobFromImage(input, 1.0/0.226, Size(640, 640), Scalar(0.5), false, true, CV_32F); + } + + SANITY_CHECK_NOTHING(); +} + +INSTANTIATE_TEST_CASE_P(/**/, Utils_blobFromImage_32F_NCHW_C1, + Values(std::vector{ 1080, 1920}, + std::vector{ 2160, 3840}) +); + +// Batch=8, NHWC, 8U->32F, C3, mean+scale+swapRB +using Utils_blobFromImages_NoResize = TestBaseWithParam>; +PERF_TEST_P_(Utils_blobFromImages_NoResize, NHWC_MeanScale_SwapRB) { + std::vector input_shape = GetParam(); + int batch = input_shape.front(); + std::vector input_shape_no_batch(input_shape.begin()+1, input_shape.end()); + + std::vector inputs; + for (int i = 0; i < batch; i++) { + Mat input(input_shape_no_batch, CV_8UC3); + randu(input, 0, 255); + inputs.push_back(input); + } + + Image2BlobParams params; + params.scalefactor = Scalar::all(1.0/255.0); + params.mean = Scalar(104, 117, 123); + params.swapRB = true; + params.datalayout = DNN_LAYOUT_NHWC; + + TEST_CYCLE() { + Mat blob = blobFromImagesWithParams(inputs, params); + } + + SANITY_CHECK_NOTHING(); +} + +INSTANTIATE_TEST_CASE_P(/**/, Utils_blobFromImages_NoResize, + Values(std::vector{8, 640, 640}) +); + +// Batch=8, resize+crop to 640x640, 8U->32F, C3, mean+scale+swapRB +using Utils_blobFromImages_Resize = TestBaseWithParam>; +PERF_TEST_P_(Utils_blobFromImages_Resize, NHWC_Crop_MeanScale_SwapRB) { + std::vector input_shape = GetParam(); + int batch = input_shape.front(); + std::vector input_shape_no_batch(input_shape.begin()+1, input_shape.end()); + + std::vector inputs; + for (int i = 0; i < batch; i++) { + Mat input(input_shape_no_batch, CV_8UC3); + randu(input, 0, 255); + inputs.push_back(input); + } + + Image2BlobParams params; + params.scalefactor = Scalar::all(1.0/255.0); + params.size = Size(640, 640); + params.mean = Scalar(104, 117, 123); + params.swapRB = true; + params.datalayout = DNN_LAYOUT_NHWC; + params.paddingmode = DNN_PMODE_CROP_CENTER; + + TEST_CYCLE() { + Mat blob = blobFromImagesWithParams(inputs, params); + } + + SANITY_CHECK_NOTHING(); +} + +PERF_TEST_P_(Utils_blobFromImages_Resize, NCHW_Crop_MeanScale_SwapRB) { + std::vector input_shape = GetParam(); + int batch = input_shape.front(); + std::vector input_shape_no_batch(input_shape.begin()+1, input_shape.end()); + + std::vector inputs; + for (int i = 0; i < batch; i++) { + Mat input(input_shape_no_batch, CV_8UC3); + randu(input, 0, 255); + inputs.push_back(input); + } + + TEST_CYCLE() { + Mat blob = blobFromImages(inputs, 1.0/255.0, Size(640, 640), Scalar(104, 117, 123), true, true, CV_32F); + } + + SANITY_CHECK_NOTHING(); +} + +INSTANTIATE_TEST_CASE_P(/**/, Utils_blobFromImages_Resize, + Values(std::vector{8, 720, 1280}, + std::vector{8, 1080, 1920}) +); + }