message: Fix ENet test
diff: @@ -287,6 +287,46 @@ TEST_P(Test_Torch_nets, OpenFace_accuracy)
  normAssert(out, outRef, "", default_l1, default_lInf);
  }
  +static Mat getSegmMask(const Mat& scores)
  +{
  + const int rows = scores.size[2];
  + const int cols = scores.size[3];
  + const int numClasses = scores.size[1];
  +
  + Mat maxCl = Mat::zeros(rows, cols, CV_8UC1);
  + Mat maxVal(rows, cols, CV_32FC1, Scalar(0));
  + for (int ch = 0; ch < numClasses; ch++)
  + {
  + for (int row = 0; row < rows; row++)
  + {
  + const float *ptrScore = scores.ptr<float>(0, ch, row);
  + uint8_t *ptrMaxCl = maxCl.ptr<uint8_t>(row);
  + float *ptrMaxVal = maxVal.ptr<float>(row);
  + for (int col = 0; col < cols; col++)
  + {
  + if (ptrScore[col] > ptrMaxVal[col])
  + {
  + ptrMaxVal[col] = ptrScore[col];
  + ptrMaxCl[col] = (uchar)ch;
  + }
  + }
  + }
  + }
  + return maxCl;
  +}
  +
  +// Computer per-class intersection over union metric.
  +static void normAssertSegmentation(const Mat& ref, const Mat& test)
  +{
  + CV_Assert_N(ref.dims == 4, test.dims == 4);
  + const int numClasses = ref.size[1];
  + CV_Assert(numClasses == test.size[1]);
  +
  + Mat refMask = getSegmMask(ref);
  + Mat testMask = getSegmMask(test);
  + EXPECT_EQ(countNonZero(refMask != testMask), 0);
  +}
  +
  TEST_P(Test_Torch_nets, ENet_accuracy)
  {
  checkBackend();
  @@ -313,14 +353,16 @@ TEST_P(Test_Torch_nets, ENet_accuracy)
  // Due to numerical instability in Pooling-Unpooling layers (indexes jittering)
  // thresholds for ENet must be changed. Accuracy of results was checked on
  // Cityscapes dataset and difference in mIOU with Torch is 10E-4%
  - normAssert(ref, out, "", 0.00044, /*target == DNN_TARGET_CPU ? 0.453 : */0.5);
  + normAssert(ref, out, "", 0.00044, /*target == DNN_TARGET_CPU ? 0.453 : */0.552);
  + normAssertSegmentation(ref, out);
  const int N = 3;
  for (int i = 0; i < N; i++)
  {
  net.setInput(inputBlob, "");
  Mat out = net.forward();
  - normAssert(ref, out, "", 0.00044, /*target == DNN_TARGET_CPU ? 0.453 : */0.5);
  + normAssert(ref, out, "", 0.00044, /*target == DNN_TARGET_CPU ? 0.453 : */0.552);
  + normAssertSegmentation(ref, out);
  }
  }
  