diff --git a/modules/gpu/perf/perf_objdetect.cpp b/modules/gpu/perf/perf_objdetect.cpp index a86337112..2224194bb 100644 --- a/modules/gpu/perf/perf_objdetect.cpp +++ b/modules/gpu/perf/perf_objdetect.cpp @@ -89,11 +89,90 @@ PERF_TEST_P(HOG, CalTech, Values("gpu/caltech/image_00000009_0.png", "gp SANITY_CHECK(found_locations); } +//================================================= ICF SoftCascade =================================================// + typedef pair pair_string; DEF_PARAM_TEST_1(SoftCascade, pair_string); -PERF_TEST_P(SoftCascade, detect, Values(make_pair("cv/cascadeandhog/sc_cvpr_2012_to_opencv.xml", - "cv/cascadeandhog/bahnhof/image_00000000_0.png"))) + +// struct SoftCascadeTest : public perf::TestBaseWithParam +// { +// typedef cv::gpu::SoftCascade::Detection detection_t; +// static cv::Rect getFromTable(int idx) +// { +// static const cv::Rect rois[] = +// { +// cv::Rect( 65, 20, 35, 80), +// cv::Rect( 95, 35, 45, 40), +// cv::Rect( 45, 35, 45, 40), +// cv::Rect( 25, 27, 50, 45), +// cv::Rect(100, 50, 45, 40), + +// cv::Rect( 60, 30, 45, 40), +// cv::Rect( 40, 55, 50, 40), +// cv::Rect( 48, 37, 72, 80), +// cv::Rect( 48, 32, 85, 58), +// cv::Rect( 48, 0, 32, 27) +// }; + +// return rois[idx]; +// } + +// static std::string itoa(long i) +// { +// static char s[65]; +// sprintf(s, "%ld", i); +// return std::string(s); +// } + +// static std::string getImageName(int level) +// { +// time_t rawtime; +// struct tm * timeinfo; +// char buffer [80]; + +// time ( &rawtime ); +// timeinfo = localtime ( &rawtime ); + +// strftime (buffer,80,"%Y-%m-%d--%H-%M-%S",timeinfo); +// return "gpu_rec_level_" + itoa(level)+ "_" + std::string(buffer) + ".png"; +// } + +// static void print(std::ostream &out, const detection_t& d) +// { +// out << "\x1b[32m[ detection]\x1b[0m (" +// << std::setw(4) << d.x +// << " " +// << std::setw(4) << d.y +// << ") (" +// << std::setw(4) << d.w +// << " " +// << std::setw(4) << d.h +// << ") " +// << std::setw(12) << d.confidence +// << std::endl; +// } + +// static void printTotal(std::ostream &out, int detbytes) +// { +// out << "\x1b[32m[ ]\x1b[0m Total detections " << (detbytes / sizeof(detection_t)) << std::endl; +// } + +// static void writeResult(const cv::Mat& result, const int level) +// { +// std::string path = cv::tempfile(getImageName(level).c_str()); +// cv::imwrite(path, result); +// std::cout << "\x1b[32m" << "[ ]" << std::endl << "[ stored in]"<< "\x1b[0m" << path << std::endl; +// } +// }; + +typedef std::tr1::tuple fixture_t; +typedef perf::TestBaseWithParam SoftCascadeTest; + +PERF_TEST_P(SoftCascadeTest, detect, + testing::Combine( + testing::Values(std::string("cv/cascadeandhog/sc_cvpr_2012_to_opencv.xml")), + testing::Values(std::string("cv/cascadeandhog/bahnhof/image_00000000_0.png")))) { if (runOnGpu) { @@ -133,6 +212,110 @@ PERF_TEST_P(SoftCascade, detect, Values(make_pair("cv/cascadeandhog } } +static cv::Rect getFromTable(int idx) +{ + static const cv::Rect rois[] = + { + cv::Rect( 65, 20, 35, 80), + cv::Rect( 95, 35, 45, 40), + cv::Rect( 45, 35, 45, 40), + cv::Rect( 25, 27, 50, 45), + cv::Rect(100, 50, 45, 40), + + cv::Rect( 60, 30, 45, 40), + cv::Rect( 40, 55, 50, 40), + cv::Rect( 48, 37, 72, 80), + cv::Rect( 48, 32, 85, 58), + cv::Rect( 48, 0, 32, 27) + }; + + return rois[idx]; +} + +typedef std::tr1::tuple roi_fixture_t; +typedef perf::TestBaseWithParam SoftCascadeTestRoi; + +PERF_TEST_P(SoftCascadeTestRoi, detectInRoi, + testing::Combine( + testing::Values(std::string("cv/cascadeandhog/sc_cvpr_2012_to_opencv.xml")), + testing::Values(std::string("cv/cascadeandhog/bahnhof/image_00000000_0.png")), + testing::Range(0, 5))) +{ + if (runOnGpu) + { + cv::Mat cpu = readImage (GET_PARAM(1)); + ASSERT_FALSE(cpu.empty()); + cv::gpu::GpuMat colored(cpu); + + cv::gpu::SoftCascade cascade; + ASSERT_TRUE(cascade.load(perf::TestBase::getDataPath(GET_PARAM(0)))); + + cv::gpu::GpuMat objectBoxes(1, 16384 * 20, CV_8UC1), rois(cascade.getRoiSize(), CV_8UC1); + rois.setTo(0); + + int nroi = GET_PARAM(2); + cv::RNG rng; + for (int i = 0; i < nroi; ++i) + { + cv::Rect r = getFromTable(rng(10)); + cv::gpu::GpuMat sub(rois, r); + sub.setTo(1); + } + + cv::gpu::GpuMat curr = objectBoxes; + cascade.detectMultiScale(colored, rois, curr); + + TEST_CYCLE() + { + curr = objectBoxes; + cascade.detectMultiScale(colored, rois, curr); + } + } + else + { + FAIL(); + } +} + +PERF_TEST_P(SoftCascadeTestRoi, detectEachRoi, + testing::Combine( + testing::Values(std::string("cv/cascadeandhog/sc_cvpr_2012_to_opencv.xml")), + testing::Values(std::string("cv/cascadeandhog/bahnhof/image_00000000_0.png")), + testing::Range(0, 10))) +{ + if (runOnGpu) + { + cv::Mat cpu = readImage (GET_PARAM(1)); + ASSERT_FALSE(cpu.empty()); + cv::gpu::GpuMat colored(cpu); + + cv::gpu::SoftCascade cascade; + ASSERT_TRUE(cascade.load(perf::TestBase::getDataPath(GET_PARAM(0)))); + + cv::gpu::GpuMat objectBoxes(1, 16384 * 20, CV_8UC1), rois(cascade.getRoiSize(), CV_8UC1); + rois.setTo(0); + + int idx = GET_PARAM(2); + cv::Rect r = getFromTable(idx); + cv::gpu::GpuMat sub(rois, r); + sub.setTo(1); + + cv::gpu::GpuMat curr = objectBoxes; + cascade.detectMultiScale(colored, rois, curr); + + TEST_CYCLE() + { + curr = objectBoxes; + cascade.detectMultiScale(colored, rois, curr); + } + } + else + { + FAIL(); + } +} + + /////////////////////////////////////////////////////////////// // HaarClassifier