Skip to content

Commit 95fd61c

Browse files
authored
Merge pull request opencv#18261 from OrestChura:oc/fluid_convert_mask
[G-API]: Fluid: add mask, extend convertTo for CV_16S * Add Fluid `mask` kernel + Acc. and Perf. tests - simple cycle implementation with restrictions on mask type and input/output type like in OCV/GPU kernels (mask - CV_8UC1 only, input/output - CV_8UC1, CV_16UC1, CV_16SC1) * Added convertions from/to 16S * `convertTo()` perf tests refactoring - add testing of `alpha` and `beta` parameters - fixed unreliable comparison - added instances to OCV, Fluid and GPU tests according to the changes * Addressing comments - fixed multiple-channel mistake - prohibited multiple-channeling * Reduced perf tests
1 parent d1cdef5 commit 95fd61c

File tree

7 files changed

+94
-23
lines changed

7 files changed

+94
-23
lines changed

modules/gapi/perf/common/gapi_core_perf_tests.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ namespace opencv_test
7171
class ConcatVertPerfTest : public TestPerfParams<tuple<cv::Size, MatType, cv::GCompileArgs>> {};
7272
class ConcatVertVecPerfTest : public TestPerfParams<tuple<cv::Size, MatType, cv::GCompileArgs>> {};
7373
class LUTPerfTest : public TestPerfParams<tuple<MatType, MatType, cv::Size, cv::GCompileArgs>> {};
74-
class ConvertToPerfTest : public TestPerfParams<tuple<MatType, int, cv::Size, cv::GCompileArgs>> {};
74+
class ConvertToPerfTest : public TestPerfParams<tuple<compare_f, MatType, int, cv::Size, double, double, cv::GCompileArgs>> {};
7575
class ResizePerfTest : public TestPerfParams<tuple<compare_f, MatType, int, cv::Size, cv::Size, cv::GCompileArgs>> {};
7676
class ResizeFxFyPerfTest : public TestPerfParams<tuple<compare_f, MatType, int, cv::Size, double, double, cv::GCompileArgs>> {};
7777
class ParseSSDBLPerfTest : public TestPerfParams<tuple<cv::Size, float, int, cv::GCompileArgs>>, public ParserSSDTest {};

modules/gapi/perf/common/gapi_core_perf_tests_inl.hpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1829,20 +1829,23 @@ PERF_TEST_P_(LUTPerfTest, TestPerformance)
18291829

18301830
PERF_TEST_P_(ConvertToPerfTest, TestPerformance)
18311831
{
1832-
MatType type_mat = get<0>(GetParam());
1833-
int depth_to = get<1>(GetParam());
1834-
cv::Size sz_in = get<2>(GetParam());
1835-
cv::GCompileArgs compile_args = get<3>(GetParam());
1832+
int depth_to = -1;
1833+
MatType type_mat = -1;
1834+
double alpha = 0., beta = 0.;
1835+
cv::Size sz_in;
1836+
compare_f cmpF;
1837+
cv::GCompileArgs compile_args;
1838+
std::tie(cmpF, type_mat, depth_to, sz_in, alpha, beta, compile_args) = GetParam();
18361839
MatType type_out = CV_MAKETYPE(depth_to, CV_MAT_CN(type_mat));
18371840

18381841
initMatrixRandU(type_mat, sz_in, type_out);
18391842

18401843
// OpenCV code ///////////////////////////////////////////////////////////
1841-
in_mat1.convertTo(out_mat_ocv, depth_to);
1844+
in_mat1.convertTo(out_mat_ocv, depth_to, alpha, beta);
18421845

18431846
// G-API code //////////////////////////////////////////////////////////////
18441847
cv::GMat in;
1845-
auto out = cv::gapi::convertTo(in, depth_to);
1848+
auto out = cv::gapi::convertTo(in, depth_to, alpha, beta);
18461849
cv::GComputation c(in, out);
18471850

18481851
// Warm-up graph engine:
@@ -1856,7 +1859,7 @@ PERF_TEST_P_(ConvertToPerfTest, TestPerformance)
18561859
}
18571860

18581861
// Comparison ////////////////////////////////////////////////////////////
1859-
// FIXIT unrealiable check: EXPECT_EQ(0, cv::countNonZero(out_mat_ocv != out_mat_gapi));
1862+
EXPECT_TRUE(cmpF(out_mat_gapi, out_mat_ocv));
18601863
EXPECT_EQ(out_mat_gapi.size(), sz_in);
18611864

18621865
SANITY_CHECK_NOTHING();

modules/gapi/perf/cpu/gapi_core_perf_tests_cpu.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,10 +268,13 @@ INSTANTIATE_TEST_CASE_P(LUTPerfTestCustomCPU, LUTPerfTest,
268268

269269

270270
INSTANTIATE_TEST_CASE_P(ConvertToPerfTestCPU, ConvertToPerfTest,
271-
Combine(Values(CV_8UC3, CV_8UC1, CV_16UC1, CV_32FC1),
272-
Values(CV_8U, CV_16U, CV_16S, CV_32F),
273-
Values(szSmall128, szVGA, sz720p, sz1080p),
274-
Values(cv::compile_args(CORE_CPU))));
271+
Combine(Values(AbsExact().to_compare_f()),
272+
Values(CV_8UC3, CV_8UC1, CV_16UC1, CV_16SC1, CV_32FC1),
273+
Values(CV_8U, CV_16U, CV_16S, CV_32F),
274+
Values(szSmall128, szVGA, sz720p, sz1080p),
275+
Values(2.5, 1.0),
276+
Values(0.0),
277+
Values(cv::compile_args(CORE_CPU))));
275278

276279
INSTANTIATE_TEST_CASE_P(ResizePerfTestCPU, ResizePerfTest,
277280
Combine(Values(AbsExact().to_compare_f()),

modules/gapi/perf/cpu/gapi_core_perf_tests_fluid.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,10 @@ INSTANTIATE_TEST_CASE_P(SubPerfTestFluid, SubPerfTest,
8080
// Values(-1, CV_8U, CV_16U, CV_32F),
8181
// Values(cv::compile_args(CORE_FLUID))));
8282

83-
// INSTANTIATE_TEST_CASE_P(MaskPerfTestFluid, MaskPerfTest,
84-
// Combine(Values(szSmall128, szVGA, sz720p, sz1080p),
85-
// Values(CV_8UC1, CV_16UC1, CV_16SC1),
86-
// Values(cv::compile_args(CORE_FLUID))));
83+
INSTANTIATE_TEST_CASE_P(MaskPerfTestFluid, MaskPerfTest,
84+
Combine(Values(szSmall128, szVGA, sz720p, sz1080p),
85+
Values(CV_8UC1, CV_16UC1, CV_16SC1),
86+
Values(cv::compile_args(CORE_FLUID))));
8787

8888
// INSTANTIATE_TEST_CASE_P(MeanPerfTestFluid, MeanPerfTest,
8989
// Combine(Values(szSmall128, szVGA, sz720p, sz1080p),
@@ -271,9 +271,12 @@ INSTANTIATE_TEST_CASE_P(Split3PerfTestFluid, Split3PerfTest,
271271
// Values(cv::compile_args(CORE_FLUID))));
272272

273273
INSTANTIATE_TEST_CASE_P(ConvertToPerfTestFluid, ConvertToPerfTest,
274-
Combine(Values(CV_8UC3, CV_8UC1, CV_16UC1, CV_32FC1),
275-
Values(CV_8U, CV_16U, CV_32F),
274+
Combine(Values(Tolerance_FloatRel_IntAbs(1e-5, 2).to_compare_f()),
275+
Values(CV_8UC3, CV_8UC1, CV_16UC1, CV_16SC1, CV_32FC1),
276+
Values(CV_8U, CV_16U, CV_16S, CV_32F),
276277
Values(szSmall128, szVGA, sz720p, sz1080p),
278+
Values(2.5, 1.0),
279+
Values(0.0),
277280
Values(cv::compile_args(CORE_FLUID))));
278281

279282
INSTANTIATE_TEST_CASE_P(ResizePerfTestFluid, ResizePerfTest,

modules/gapi/perf/gpu/gapi_core_perf_tests_gpu.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,9 +267,12 @@ INSTANTIATE_TEST_CASE_P(LUTPerfTestCustomGPU, LUTPerfTest,
267267

268268

269269
INSTANTIATE_TEST_CASE_P(ConvertToPerfTestGPU, ConvertToPerfTest,
270-
Combine(Values(CV_8UC3, CV_8UC1, CV_16UC1, CV_32FC1),
270+
Combine(Values(AbsExact().to_compare_f()),
271+
Values(CV_8UC3, CV_8UC1, CV_16UC1, CV_32FC1),
271272
Values(CV_8U, CV_16U, CV_16S, CV_32F),
272273
Values( szSmall128, szVGA, sz720p, sz1080p ),
274+
Values(2.5, 1.0),
275+
Values(0.0),
273276
Values(cv::compile_args(CORE_GPU))));
274277

275278
INSTANTIATE_TEST_CASE_P(ResizePerfTestGPU, ResizePerfTest,

modules/gapi/src/backends/fluid/gfluidcore.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -797,6 +797,50 @@ GAPI_FLUID_KERNEL(GFluidDivRC, cv::gapi::core::GDivRC, false)
797797
}
798798
};
799799

800+
//-------------------
801+
//
802+
// Fluid kernels: mask
803+
//
804+
//-------------------
805+
806+
template<typename DST, typename SRC>
807+
static void run_mask(Buffer &dst, const View &src, const View &mask)
808+
{
809+
static_assert(std::is_same<DST, SRC>::value,
810+
"Input and output types must match");
811+
812+
int length = dst.length(); // dst, src and mask have the same size and are single-channel
813+
814+
const auto *in = src.InLine<SRC>(0);
815+
const auto *in_mask = mask.InLine<uchar>(0);
816+
auto *out = dst.OutLine<DST>();
817+
818+
for (int l=0; l < length; l++)
819+
{
820+
out[l] = in_mask[l] ? in[l] : 0;
821+
}
822+
}
823+
824+
GAPI_FLUID_KERNEL(GFluidMask, cv::gapi::core::GMask, false)
825+
{
826+
static const int Window = 1;
827+
828+
static void run(const View &src, const View &mask, Buffer &dst)
829+
{
830+
if (src.meta().chan != 1 || dst.meta().chan != 1)
831+
CV_Error(cv::Error::StsBadArg, "input and output must be single-channel");
832+
if (mask.meta().chan != 1 || mask.meta().depth != CV_8U)
833+
CV_Error(cv::Error::StsBadArg, "unsupported mask type");
834+
835+
// DST SRC OP __VA_ARGS__
836+
UNARY_(uchar , uchar , run_mask, dst, src, mask);
837+
UNARY_( short, short, run_mask, dst, src, mask);
838+
UNARY_(ushort, ushort, run_mask, dst, src, mask);
839+
840+
CV_Error(cv::Error::StsBadArg, "unsupported combination of types");
841+
}
842+
};
843+
800844
//----------------------------
801845
//
802846
// Fluid math kernels: bitwise
@@ -1186,12 +1230,19 @@ GAPI_FLUID_KERNEL(GFluidConvertTo, cv::gapi::core::GConvertTo, false)
11861230
// DST SRC OP __VA_ARGS__
11871231
UNARY_(uchar , uchar , run_convertto, dst, src, alpha, beta);
11881232
UNARY_(uchar , ushort, run_convertto, dst, src, alpha, beta);
1233+
UNARY_(uchar , short, run_convertto, dst, src, alpha, beta);
11891234
UNARY_(uchar , float, run_convertto, dst, src, alpha, beta);
11901235
UNARY_(ushort, uchar , run_convertto, dst, src, alpha, beta);
11911236
UNARY_(ushort, ushort, run_convertto, dst, src, alpha, beta);
1237+
UNARY_(ushort, short, run_convertto, dst, src, alpha, beta);
11921238
UNARY_(ushort, float, run_convertto, dst, src, alpha, beta);
1239+
UNARY_( short, uchar , run_convertto, dst, src, alpha, beta);
1240+
UNARY_( short, ushort, run_convertto, dst, src, alpha, beta);
1241+
UNARY_( short, short, run_convertto, dst, src, alpha, beta);
1242+
UNARY_( short, float, run_convertto, dst, src, alpha, beta);
11931243
UNARY_( float, uchar , run_convertto, dst, src, alpha, beta);
11941244
UNARY_( float, ushort, run_convertto, dst, src, alpha, beta);
1245+
UNARY_( float, short, run_convertto, dst, src, alpha, beta);
11951246
UNARY_( float, float, run_convertto, dst, src, alpha, beta);
11961247

11971248
CV_Error(cv::Error::StsBadArg, "unsupported combination of types");
@@ -2332,6 +2383,7 @@ cv::gapi::GKernelPackage cv::gapi::core::fluid::kernels()
23322383
,GFluidMulCOld
23332384
,GFluidDivC
23342385
,GFluidDivRC
2386+
,GFluidMask
23352387
,GFluidAbsDiffC
23362388
,GFluidCmpGTScalar
23372389
,GFluidCmpGEScalar

modules/gapi/test/cpu/gapi_core_tests_fluid.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ INSTANTIATE_TEST_CASE_P(DISABLED_MeanTestFluid, MeanTest,
6565
Values(-1),
6666
Values(CORE_FLUID)));
6767

68+
INSTANTIATE_TEST_CASE_P(MaskTestFluid, MaskTest,
69+
Combine(Values(CV_8UC1, CV_16UC1, CV_16SC1),
70+
Values(cv::Size(1280, 720),
71+
cv::Size(640, 480),
72+
cv::Size(128, 128)),
73+
Values(-1),
74+
Values(CORE_FLUID)));
75+
6876
INSTANTIATE_TEST_CASE_P(AbsDiffTestFluid, AbsDiffTest,
6977
Combine(Values(CV_8UC1, CV_16UC1, CV_16SC1),
7078
Values(cv::Size(1280, 720),
@@ -190,12 +198,11 @@ INSTANTIATE_TEST_CASE_P(LUTTestFluid, LUTTest,
190198
Values(CORE_FLUID)));
191199

192200
INSTANTIATE_TEST_CASE_P(ConvertToFluid, ConvertToTest,
193-
Combine(Values(CV_8UC3, CV_8UC1, CV_16UC1, CV_32FC1),
194-
Values(cv::Size(1920, 1080),
195-
cv::Size(1280, 720),
201+
Combine(Values(CV_8UC3, CV_8UC1, CV_16UC1, CV_16SC1, CV_32FC1),
202+
Values(cv::Size(1280, 720),
196203
cv::Size(640, 480),
197204
cv::Size(128, 128)),
198-
Values(CV_8U, CV_16U, CV_32F),
205+
Values(CV_8U, CV_16U, CV_16S, CV_32F),
199206
Values(CORE_FLUID),
200207
Values(Tolerance_FloatRel_IntAbs(1e-5, 2).to_compare_obj()),
201208
Values(2.5, 1.0, -1.0),

0 commit comments

Comments
 (0)