Files
2026-07-13 12:06:04 +08:00

406 lines
12 KiB
C++

// This file is part of OpenCV project.
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at http://opencv.org/license.html.
//
// Copyright (C) 2017, Intel Corporation, all rights reserved.
// Third party copyrights are property of their respective owners.
#include "perf_precomp.hpp"
namespace opencv_test {
using Utils_blobFromImage = TestBaseWithParam<std::vector<int>>;
PERF_TEST_P_(Utils_blobFromImage, HWC_TO_NCHW) {
std::vector<int> input_shape = GetParam();
Mat input(input_shape, CV_32FC3);
randu(input, -10.0f, 10.f);
TEST_CYCLE() {
Mat blob = blobFromImage(input);
}
SANITY_CHECK_NOTHING();
}
INSTANTIATE_TEST_CASE_P(/**/, Utils_blobFromImage,
Values(std::vector<int>{ 32, 32},
std::vector<int>{ 64, 64},
std::vector<int>{ 128, 128},
std::vector<int>{ 256, 256},
std::vector<int>{ 512, 512},
std::vector<int>{1024, 1024},
std::vector<int>{2048, 2048})
);
using Utils_blobFromImages = TestBaseWithParam<std::vector<int>>;
PERF_TEST_P_(Utils_blobFromImages, HWC_TO_NCHW) {
std::vector<int> input_shape = GetParam();
int batch = input_shape.front();
std::vector<int> input_shape_no_batch(input_shape.begin()+1, input_shape.end());
std::vector<Mat> inputs;
for (int i = 0; i < batch; i++) {
Mat input(input_shape_no_batch, CV_32FC3);
randu(input, -10.0f, 10.f);
inputs.push_back(input);
}
TEST_CYCLE() {
Mat blobs = blobFromImages(inputs);
}
SANITY_CHECK_NOTHING();
}
INSTANTIATE_TEST_CASE_P(/**/, Utils_blobFromImages,
Values(std::vector<int>{16, 32, 32},
std::vector<int>{16, 64, 64},
std::vector<int>{16, 128, 128},
std::vector<int>{16, 256, 256},
std::vector<int>{16, 512, 512},
std::vector<int>{16, 1024, 1024},
std::vector<int>{16, 2048, 2048})
);
// NCHW, 8U->32F, C3, mean+scale+swapRB at 640x640
using Utils_blobFromImage_8U_NCHW = TestBaseWithParam<std::vector<int>>;
PERF_TEST_P_(Utils_blobFromImage_8U_NCHW, MeanScale_SwapRB) {
std::vector<int> 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<int>{ 640, 640})
);
// NHWC, 8U->32F, C3
using Utils_blobFromImage_8U_NHWC = TestBaseWithParam<std::vector<int>>;
PERF_TEST_P_(Utils_blobFromImage_8U_NHWC, SwapRB) {
std::vector<int> 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<int> 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<int>{ 224, 224},
std::vector<int>{ 640, 640})
);
// NHWC, 32F->32F, C3
using Utils_blobFromImage_32F_NHWC = TestBaseWithParam<std::vector<int>>;
PERF_TEST_P_(Utils_blobFromImage_32F_NHWC, SwapRB) {
std::vector<int> 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<int> 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<int>{ 224, 224},
std::vector<int>{ 640, 640})
);
// Resize+crop, 8U->32F, C3, mean+scale+swapRB to 640x640
using Utils_blobFromImage_8U_Resize = TestBaseWithParam<std::vector<int>>;
PERF_TEST_P_(Utils_blobFromImage_8U_Resize, NHWC_Crop_MeanScale_SwapRB) {
std::vector<int> 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<int> 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<int>{ 720, 1280},
std::vector<int>{ 1080, 1920},
std::vector<int>{ 2160, 3840})
);
// Resize+crop, NCHW, 32F->32F, C3, mean+scale+swapRB to 300x300
using Utils_blobFromImage_32F_NCHW_Resize = TestBaseWithParam<std::vector<int>>;
PERF_TEST_P_(Utils_blobFromImage_32F_NCHW_Resize, Crop_MeanScale_SwapRB_To300) {
std::vector<int> 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<int>{ 720, 1280},
std::vector<int>{ 1080, 1920})
);
// Resize+crop, NCHW, 8U->8U, C3
using Utils_blobFromImage_8U_to_8U_Crop = TestBaseWithParam<std::vector<int>>;
PERF_TEST_P_(Utils_blobFromImage_8U_to_8U_Crop, NCHW_SwapRB) {
std::vector<int> 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<int> 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<int>{ 1080, 1920},
std::vector<int>{ 2160, 3840})
);
// Resize, NCHW, 8U->8U, C3
using Utils_blobFromImage_8U_to_8U_Resize = TestBaseWithParam<std::vector<int>>;
PERF_TEST_P_(Utils_blobFromImage_8U_to_8U_Resize, NCHW_SwapRB) {
std::vector<int> 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<int>{ 1080, 1920},
std::vector<int>{ 2160, 3840})
);
// Resize+crop, NCHW, 32F->32F, C1, mean
using Utils_blobFromImage_32F_NCHW_C1 = TestBaseWithParam<std::vector<int>>;
PERF_TEST_P_(Utils_blobFromImage_32F_NCHW_C1, Crop_MeanScale_To224) {
std::vector<int> 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<int> 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<int>{ 1080, 1920},
std::vector<int>{ 2160, 3840})
);
// Batch=8, NHWC, 8U->32F, C3, mean+scale+swapRB
using Utils_blobFromImages_NoResize = TestBaseWithParam<std::vector<int>>;
PERF_TEST_P_(Utils_blobFromImages_NoResize, NHWC_MeanScale_SwapRB) {
std::vector<int> input_shape = GetParam();
int batch = input_shape.front();
std::vector<int> input_shape_no_batch(input_shape.begin()+1, input_shape.end());
std::vector<Mat> 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<int>{8, 640, 640})
);
// Batch=8, resize+crop to 640x640, 8U->32F, C3, mean+scale+swapRB
using Utils_blobFromImages_Resize = TestBaseWithParam<std::vector<int>>;
PERF_TEST_P_(Utils_blobFromImages_Resize, NHWC_Crop_MeanScale_SwapRB) {
std::vector<int> input_shape = GetParam();
int batch = input_shape.front();
std::vector<int> input_shape_no_batch(input_shape.begin()+1, input_shape.end());
std::vector<Mat> 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<int> input_shape = GetParam();
int batch = input_shape.front();
std::vector<int> input_shape_no_batch(input_shape.begin()+1, input_shape.end());
std::vector<Mat> 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<int>{8, 720, 1280},
std::vector<int>{8, 1080, 1920})
);
}