Skip to content

Commit e58e545

Browse files
committed
Merge pull request opencv#17392 from alalek:dnn_test_yolov4
2 parents 319db07 + 6b89154 commit e58e545

File tree

2 files changed

+113
-14
lines changed

2 files changed

+113
-14
lines changed

modules/dnn/perf/perf_net.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,23 @@ PERF_TEST_P_(DNNTestNetwork, YOLOv3)
197197
if (backend == DNN_BACKEND_HALIDE)
198198
throw SkipTestException("");
199199
Mat sample = imread(findDataFile("dnn/dog416.png"));
200+
cvtColor(sample, sample, COLOR_BGR2RGB);
200201
Mat inp;
201-
sample.convertTo(inp, CV_32FC3);
202-
processNet("dnn/yolov3.weights", "dnn/yolov3.cfg", "", inp / 255);
202+
sample.convertTo(inp, CV_32FC3, 1.0f / 255, 0);
203+
processNet("dnn/yolov3.weights", "dnn/yolov3.cfg", "", inp);
204+
}
205+
206+
PERF_TEST_P_(DNNTestNetwork, YOLOv4)
207+
{
208+
if (backend == DNN_BACKEND_HALIDE)
209+
throw SkipTestException("");
210+
if (target == DNN_TARGET_MYRIAD)
211+
throw SkipTestException("");
212+
Mat sample = imread(findDataFile("dnn/dog416.png"));
213+
cvtColor(sample, sample, COLOR_BGR2RGB);
214+
Mat inp;
215+
sample.convertTo(inp, CV_32FC3, 1.0f / 255, 0);
216+
processNet("dnn/yolov4.weights", "dnn/yolov4.cfg", "", inp);
203217
}
204218

205219
PERF_TEST_P_(DNNTestNetwork, EAST_text_detection)

modules/dnn/test/test_darknet_importer.cpp

Lines changed: 97 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,13 @@ class Test_Darknet_nets : public DNNTestLayer
245245
nms_boxes.push_back(box);
246246
nms_confidences.push_back(conf);
247247
nms_classIds.push_back(class_id);
248+
#if 0 // use to update test reference data
249+
std::cout << b << ", " << class_id << ", " << conf << "f, "
250+
<< box.x << "f, " << box.y << "f, "
251+
<< box.x + box.width << "f, " << box.y + box.height << "f,"
252+
<< std::endl;
253+
#endif
254+
248255
}
249256

250257
normAssertDetections(refClassIds[b], refConfidences[b], refBoxes[b], nms_classIds,
@@ -395,6 +402,9 @@ TEST_P(Test_Darknet_nets_async, Accuracy)
395402

396403
std::string prefix = get<0>(GetParam());
397404

405+
if (targetId == DNN_TARGET_MYRIAD && prefix == "yolov4") // NC_OUT_OF_MEMORY
406+
applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_MYRIAD, CV_TEST_TAG_DNN_SKIP_IE_VERSION);
407+
398408
if (backendId != DNN_BACKEND_INFERENCE_ENGINE_NN_BUILDER_2019 && backendId != DNN_BACKEND_INFERENCE_ENGINE_NGRAPH)
399409
throw SkipTestException("No support for async forward");
400410

@@ -439,7 +449,7 @@ TEST_P(Test_Darknet_nets_async, Accuracy)
439449
}
440450

441451
INSTANTIATE_TEST_CASE_P(/**/, Test_Darknet_nets_async, Combine(
442-
Values("yolo-voc", "tiny-yolo-voc", "yolov3"),
452+
Values("yolo-voc", "tiny-yolo-voc", "yolov3", "yolov4"),
443453
dnnBackendsAndTargets()
444454
));
445455

@@ -453,15 +463,21 @@ TEST_P(Test_Darknet_nets, YOLOv3)
453463
applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_MYRIAD, CV_TEST_TAG_DNN_SKIP_IE_NGRAPH);
454464

455465
// batchId, classId, confidence, left, top, right, bottom
456-
Mat ref = (Mat_<float>(9, 7) << 0, 7, 0.952983f, 0.614622f, 0.150257f, 0.901369f, 0.289251f, // a truck
457-
0, 1, 0.987908f, 0.150913f, 0.221933f, 0.742255f, 0.74626f, // a bicycle
458-
0, 16, 0.998836f, 0.160024f, 0.389964f, 0.417885f, 0.943716f, // a dog (COCO)
459-
1, 9, 0.384801f, 0.659824f, 0.372389f, 0.673926f, 0.429412f, // a traffic light
460-
1, 9, 0.733283f, 0.376029f, 0.315694f, 0.401776f, 0.395165f, // a traffic light
461-
1, 9, 0.785352f, 0.665503f, 0.373543f, 0.688893f, 0.439245f, // a traffic light
462-
1, 0, 0.980052f, 0.195856f, 0.378454f, 0.258626f, 0.629258f, // a person
463-
1, 2, 0.989633f, 0.450719f, 0.463353f, 0.496305f, 0.522258f, // a car
464-
1, 2, 0.997412f, 0.647584f, 0.459939f, 0.821038f, 0.663947f); // a car
466+
const int N0 = 3;
467+
const int N1 = 6;
468+
static const float ref_[/* (N0 + N1) * 7 */] = {
469+
0, 16, 0.998836f, 0.160024f, 0.389964f, 0.417885f, 0.943716f,
470+
0, 1, 0.987908f, 0.150913f, 0.221933f, 0.742255f, 0.746261f,
471+
0, 7, 0.952983f, 0.614621f, 0.150257f, 0.901368f, 0.289251f,
472+
473+
1, 2, 0.997412f, 0.647584f, 0.459939f, 0.821037f, 0.663947f,
474+
1, 2, 0.989633f, 0.450719f, 0.463353f, 0.496306f, 0.522258f,
475+
1, 0, 0.980053f, 0.195856f, 0.378454f, 0.258626f, 0.629257f,
476+
1, 9, 0.785341f, 0.665503f, 0.373543f, 0.688893f, 0.439244f,
477+
1, 9, 0.733275f, 0.376029f, 0.315694f, 0.401776f, 0.395165f,
478+
1, 9, 0.384815f, 0.659824f, 0.372389f, 0.673927f, 0.429412f,
479+
};
480+
Mat ref(N0 + N1, 7, CV_32FC1, (void*)ref_);
465481

466482
double scoreDiff = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.006 : 8e-5;
467483
double iouDiff = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.042 : 3e-4;
@@ -480,8 +496,8 @@ TEST_P(Test_Darknet_nets, YOLOv3)
480496
#endif
481497

482498
{
483-
SCOPED_TRACE("batch size 1");
484-
testDarknetModel(config_file, weights_file, ref.rowRange(0, 3), scoreDiff, iouDiff);
499+
SCOPED_TRACE("batch size 1");
500+
testDarknetModel(config_file, weights_file, ref.rowRange(0, N0), scoreDiff, iouDiff);
485501
}
486502

487503
#if defined(INF_ENGINE_RELEASE)
@@ -503,6 +519,75 @@ TEST_P(Test_Darknet_nets, YOLOv3)
503519
}
504520
}
505521

522+
TEST_P(Test_Darknet_nets, YOLOv4)
523+
{
524+
applyTestTag(CV_TEST_TAG_LONG, (target == DNN_TARGET_CPU ? CV_TEST_TAG_MEMORY_1GB : CV_TEST_TAG_MEMORY_2GB));
525+
526+
#if defined(INF_ENGINE_RELEASE)
527+
if (target == DNN_TARGET_MYRIAD) // NC_OUT_OF_MEMORY
528+
applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_MYRIAD, CV_TEST_TAG_DNN_SKIP_IE_VERSION);
529+
#endif
530+
531+
// batchId, classId, confidence, left, top, right, bottom
532+
const int N0 = 3;
533+
const int N1 = 7;
534+
static const float ref_[/* (N0 + N1) * 7 */] = {
535+
0, 16, 0.992194f, 0.172375f, 0.402458f, 0.403918f, 0.932801f,
536+
0, 1, 0.988326f, 0.166708f, 0.228236f, 0.737208f, 0.735803f,
537+
0, 7, 0.94639f, 0.602523f, 0.130399f, 0.901623f, 0.298452f,
538+
539+
1, 2, 0.99761f, 0.646556f, 0.45985f, 0.816041f, 0.659067f,
540+
1, 0, 0.988913f, 0.201726f, 0.360282f, 0.266181f, 0.631728f,
541+
1, 2, 0.98233f, 0.452007f, 0.462217f, 0.495612f, 0.521687f,
542+
1, 9, 0.919195f, 0.374642f, 0.316524f, 0.398126f, 0.393714f,
543+
1, 9, 0.856303f, 0.666842f, 0.372215f, 0.685539f, 0.44141f,
544+
1, 9, 0.313516f, 0.656791f, 0.374734f, 0.671959f, 0.438371f,
545+
1, 9, 0.256625f, 0.940232f, 0.326931f, 0.967586f, 0.374002f,
546+
};
547+
Mat ref(N0 + N1, 7, CV_32FC1, (void*)ref_);
548+
549+
double scoreDiff = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.006 : 8e-5;
550+
double iouDiff = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.042 : 3e-4;
551+
552+
std::string config_file = "yolov4.cfg";
553+
std::string weights_file = "yolov4.weights";
554+
555+
#if defined(INF_ENGINE_RELEASE)
556+
if ((backend == DNN_BACKEND_INFERENCE_ENGINE_NN_BUILDER_2019 ||
557+
backend == DNN_BACKEND_INFERENCE_ENGINE_NGRAPH) && target == DNN_TARGET_MYRIAD &&
558+
getInferenceEngineVPUType() == CV_DNN_INFERENCE_ENGINE_VPU_TYPE_MYRIAD_X)
559+
{
560+
scoreDiff = 0.04;
561+
iouDiff = 0.2;
562+
}
563+
#endif
564+
565+
{
566+
SCOPED_TRACE("batch size 1");
567+
testDarknetModel(config_file, weights_file, ref.rowRange(0, N0), scoreDiff, iouDiff);
568+
}
569+
570+
{
571+
SCOPED_TRACE("batch size 2");
572+
573+
#if defined(INF_ENGINE_RELEASE)
574+
if (backend == DNN_BACKEND_INFERENCE_ENGINE_NN_BUILDER_2019)
575+
{
576+
if (target == DNN_TARGET_OPENCL)
577+
applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_OPENCL, CV_TEST_TAG_DNN_SKIP_IE_VERSION);
578+
else if (target == DNN_TARGET_OPENCL_FP16 && INF_ENGINE_VER_MAJOR_LE(202010000))
579+
applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_OPENCL_FP16, CV_TEST_TAG_DNN_SKIP_IE_VERSION);
580+
else if (target == DNN_TARGET_MYRIAD &&
581+
getInferenceEngineVPUType() == CV_DNN_INFERENCE_ENGINE_VPU_TYPE_MYRIAD_X)
582+
applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_MYRIAD_X);
583+
}
584+
#endif
585+
586+
testDarknetModel(config_file, weights_file, ref, scoreDiff, iouDiff);
587+
}
588+
}
589+
590+
506591
INSTANTIATE_TEST_CASE_P(/**/, Test_Darknet_nets, dnnBackendsAndTargets());
507592

508593
TEST_P(Test_Darknet_layers, shortcut)

0 commit comments

Comments
 (0)