Add CPU tests for TensorsToSegmentationCalculator

PiperOrigin-RevId: 576208735
This commit is contained in:
Youchuan Hu 2023-10-24 11:33:13 -07:00 committed by Copybara-Service
parent 5b0f1f9ac4
commit 905a18c88c

View File

@ -62,12 +62,14 @@ struct FormattingTestCase {
Options::Activation activation; Options::Activation activation;
int rows; int rows;
int cols; int cols;
int rows_new;
int cols_new;
int channels; int channels;
double max_abs_diff;
}; };
using TensorsToSegmentationCalculatorTest = TestWithParam<FormattingTestCase>; using TensorsToSegmentationCalculatorTest = TestWithParam<FormattingTestCase>;
// Currently only useable for tests with no output resize.
TEST_P(TensorsToSegmentationCalculatorTest, ParameterizedTests) { TEST_P(TensorsToSegmentationCalculatorTest, ParameterizedTests) {
const FormattingTestCase& test_case = GetParam(); const FormattingTestCase& test_case = GetParam();
std::vector<float> inputs = test_case.inputs; std::vector<float> inputs = test_case.inputs;
@ -75,7 +77,10 @@ TEST_P(TensorsToSegmentationCalculatorTest, ParameterizedTests) {
Options::Activation activation = test_case.activation; Options::Activation activation = test_case.activation;
int rows = test_case.rows; int rows = test_case.rows;
int cols = test_case.cols; int cols = test_case.cols;
int rows_new = test_case.rows_new;
int cols_new = test_case.cols_new;
int channels = test_case.channels; int channels = test_case.channels;
double max_abs_diff = test_case.max_abs_diff;
std::string string_config = absl::Substitute( std::string string_config = absl::Substitute(
R"pb( R"pb(
@ -119,28 +124,31 @@ TEST_P(TensorsToSegmentationCalculatorTest, ParameterizedTests) {
MP_ASSERT_OK(graph.AddPacketToInputStream( MP_ASSERT_OK(graph.AddPacketToInputStream(
"tensors", mediapipe::Adopt(tensors.release()).At(Timestamp(0)))); "tensors", mediapipe::Adopt(tensors.release()).At(Timestamp(0))));
} }
// The output size is defined as pair(new_width, new_height).
MP_ASSERT_OK(graph.AddPacketToInputStream( MP_ASSERT_OK(graph.AddPacketToInputStream(
"size", "size", mediapipe::Adopt(new std::pair<int, int>(cols_new, rows_new))
mediapipe::Adopt(new std::pair<int, int>(rows, cols)).At(Timestamp(0)))); .At(Timestamp(0))));
MP_ASSERT_OK(graph.WaitUntilIdle()); MP_ASSERT_OK(graph.WaitUntilIdle());
ASSERT_THAT(output_packets, SizeIs(1)); ASSERT_THAT(output_packets, SizeIs(1));
const Image& image_as_mask = output_packets[0].Get<Image>(); const Image& image_as_mask = output_packets[0].Get<Image>();
std::shared_ptr<cv::Mat> result_mat = formats::MatView(&image_as_mask); std::shared_ptr<cv::Mat> result_mat = formats::MatView(&image_as_mask);
EXPECT_EQ(result_mat->rows, rows); EXPECT_EQ(result_mat->rows, rows_new);
EXPECT_EQ(result_mat->cols, cols); EXPECT_EQ(result_mat->cols, cols_new);
EXPECT_EQ(result_mat->channels(), channels); EXPECT_EQ(result_mat->channels(), 1);
// Compare the real result with the expected result. // Compare the real result with the expected result.
cv::Mat expected_result = cv::Mat( cv::Mat expected_result =
rows, cols, CV_32FC1, const_cast<float*>(expected_outputs.data())); cv::Mat(rows_new, cols_new, CV_32FC1,
const_cast<float*>(expected_outputs.data()));
cv::Mat diff; cv::Mat diff;
cv::absdiff(*result_mat, expected_result, diff); cv::absdiff(*result_mat, expected_result, diff);
double max_val; double max_val;
cv::minMaxLoc(diff, nullptr, &max_val); cv::minMaxLoc(diff, nullptr, &max_val);
// Expects the maximum absolute pixel-by-pixel difference is less than 1e-5.
// This delta is for passthorugh accuracy only. // The max allowable diff between output and expected output varies between
EXPECT_LE(max_val, 1e-5); // tests.
EXPECT_LE(max_val, max_abs_diff);
MP_ASSERT_OK(graph.CloseInputStream("tensors")); MP_ASSERT_OK(graph.CloseInputStream("tensors"));
MP_ASSERT_OK(graph.CloseInputStream("size")); MP_ASSERT_OK(graph.CloseInputStream("size"));
@ -149,19 +157,104 @@ TEST_P(TensorsToSegmentationCalculatorTest, ParameterizedTests) {
INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(
TensorsToSegmentationCalculatorTests, TensorsToSegmentationCalculatorTest, TensorsToSegmentationCalculatorTests, TensorsToSegmentationCalculatorTest,
testing::ValuesIn<FormattingTestCase>({ testing::ValuesIn<FormattingTestCase>(
{/*test_name=*/"NoActivationAndNoOutputResize", {{/*test_name=*/"NoActivationAndNoOutputResize",
/*inputs=*/ /*inputs=*/
{1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0,
14.0, 15.0, 16.0}, 14.0, 15.0, 16.0},
/*expected_outputs=*/ /*expected_outputs=*/
{1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0,
14.0, 15.0, 16.0}, 14.0, 15.0, 16.0},
/*activation=*/Options::NONE, /*activation=*/Options::NONE,
/*rows=*/4, /*rows=*/4,
/*cols=*/4, /*cols=*/4,
/*channels=*/1}, /*rows_new=*/4,
}), /*cols_new=*/4,
/*channels=*/1,
/*max_abs_diff=*/1e-7},
{/*test_name=*/"OutputResizeOnly",
/*inputs=*/
{1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0,
14.0, 15.0, 16.0},
/*expected_outputs=*/
{1, 1.5, 2.166667, 2.833333, 3.5, 4,
3.8, 4.3, 4.966667, 5.633333, 6.3, 6.8,
7, 7.5, 8.166667, 8.833333, 9.5, 10,
10.2, 10.7, 11.366667, 12.033333, 12.7, 13.2,
13, 13.5, 14.166667, 14.833333, 15.5, 16},
/*activation=*/Options::NONE,
/*rows=*/4,
/*cols=*/4,
/*rows_new=*/5,
/*cols_new=*/6,
/*channels=*/1,
/*max_abs_diff=*/1e-6},
{/*test_name=*/"SigmoidActivationWithNoOutputResize",
/*inputs=*/
{1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0,
14.0, 15.0, 16.0},
/*expected_outputs=*/
{0.731059, 0.880797, 0.952574, 0.982014, 0.993307, 0.997527, 0.999089,
0.999665, 0.999877, 0.999955, 0.999983, 0.999994, 0.999998, 0.999999,
1.0, 1.0},
/*activation=*/Options::SIGMOID,
/*rows=*/4,
/*cols=*/4,
/*rows_new=*/4,
/*cols_new=*/4,
/*channels=*/1,
/*max_abs_diff=*/1e-6},
{/*test_name=*/"SigmoidActivationWithOutputResize",
/*inputs=*/
{1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0,
14.0, 15.0, 16.0},
/*expected_outputs=*/
{0.731059, 0.805928, 0.89276, 0.940611, 0.967294, 0.982014,
0.914633, 0.93857, 0.966279, 0.981363, 0.989752, 0.994369,
0.996592, 0.997666, 0.998873, 0.999404, 0.999683, 0.999829,
0.999913, 0.99994, 0.999971, 0.999985, 0.999992, 0.999996,
0.999998, 0.999998, 0.999999, 1.0, 1.0, 1.0},
/*activation=*/Options::SIGMOID,
/*rows=*/4,
/*cols=*/4,
/*rows_new=*/5,
/*cols_new=*/6,
/*channels=*/1,
/*max_abs_diff=*/1e-6},
{/*test_name=*/"SoftmaxActivationWithNoOutputResize",
/*inputs=*/
{1.0, 2.0, 4.0, 2.0, 3.0, 5.0, 6.0, 1.5, 7.0, 10.0, 11.0,
4.0, 12.0, 15.0, 16.0, 18.5, 19.0, 20.0, 22.0, 23.0, 24.5, 23.4,
25.6, 28.3, 29.2, 30.0, 24.6, 29.2, 30.0, 24.9, 31.2, 30.3},
/*expected_outputs=*/
{0.731059, 0.119203, 0.880797, 0.0109869, 0.952574, 0.000911051,
0.952574, 0.924142, 0.731059, 0.731059, 0.24974, 0.937027, 0.689974,
0.990048, 0.0060598, 0.28905},
/*activation=*/Options::SOFTMAX,
/*rows=*/4,
/*cols=*/4,
/*rows_new=*/4,
/*cols_new=*/4,
/*channels=*/2,
/*max_abs_diff=*/1e-6},
{/*test_name=*/"SoftmaxActivationWithOutputResize",
/*inputs=*/
{1.0, 2.0, 4.0, 2.0, 3.0, 5.0, 6.0, 1.5, 7.0, 10.0, 11.0,
4.0, 12.0, 15.0, 16.0, 18.5, 19.0, 20.0, 22.0, 23.0, 24.5, 23.4,
25.6, 28.3, 29.2, 30.0, 24.6, 29.2, 30.0, 24.9, 31.2, 30.3},
/*expected_outputs=*/
{0.731059, 0.425131, 0.246135, 0.753865, 0.445892, 0.0109869,
0.886119, 0.461259, 0.185506, 0.781934, 0.790618, 0.650195,
0.841816, 0.603901, 0.40518, 0.561962, 0.765871, 0.930584,
0.718733, 0.763744, 0.703402, 0.281989, 0.459635, 0.742634,
0.689974, 0.840011, 0.82605, 0.170058, 0.147555, 0.28905},
/*activation=*/Options::SOFTMAX,
/*rows=*/4,
/*cols=*/4,
/*rows_new=*/5,
/*cols_new=*/6,
/*channels=*/2,
/*max_abs_diff=*/1e-6}}),
[](const testing::TestParamInfo< [](const testing::TestParamInfo<
TensorsToSegmentationCalculatorTest::ParamType>& info) { TensorsToSegmentationCalculatorTest::ParamType>& info) {
return info.param.test_name; return info.param.test_name;