From 2a391282680e05d13f8cbccdba1861de151ace37 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Fri, 27 Apr 2012 11:32:40 +0000 Subject: [PATCH] Updated latentSVM tests and data --- modules/objdetect/test/test_latentsvmdetector.cpp | 124 ++++++++++++---------- 1 file changed, 65 insertions(+), 59 deletions(-) diff --git a/modules/objdetect/test/test_latentsvmdetector.cpp b/modules/objdetect/test/test_latentsvmdetector.cpp index da9fb3a..21ec4be 100644 --- a/modules/objdetect/test/test_latentsvmdetector.cpp +++ b/modules/objdetect/test/test_latentsvmdetector.cpp @@ -61,23 +61,17 @@ const CvRect true_bounding_boxes[3] = {cvRect(0, 45, 362, 452), cvRect(304, 0, 6 class CV_LatentSVMDetectorTest : public cvtest::BaseTest { -public: - CV_LatentSVMDetectorTest(); - ~CV_LatentSVMDetectorTest(); protected: void run(int); - bool isEqual(CvRect r1, CvRect r2); + bool isEqual(CvRect r1, CvRect r2, int eps); }; -CV_LatentSVMDetectorTest::CV_LatentSVMDetectorTest() +bool CV_LatentSVMDetectorTest::isEqual(CvRect r1, CvRect r2, int eps) { -} - -CV_LatentSVMDetectorTest::~CV_LatentSVMDetectorTest() {} - -bool CV_LatentSVMDetectorTest::isEqual(CvRect r1, CvRect r2) -{ - return ((r1.x == r2.x) && (r1.y == r2.y) && (r1.width == r2.width) && (r1.height == r2.height)); + return (std::abs(r1.x - r2.x) <= eps + && std::abs(r1.y - r2.y) <= eps + && std::abs(r1.width - r2.width) <= eps + && std::abs(r1.height - r2.height) <= eps); } void CV_LatentSVMDetectorTest::run( int /* start_from */) @@ -85,53 +79,55 @@ void CV_LatentSVMDetectorTest::run( int /* start_from */) string img_path = string(ts->get_data_path()) + "latentsvmdetector/cat.jpg"; string model_path = string(ts->get_data_path()) + "latentsvmdetector/models_VOC2007/cat.xml"; int numThreads = -1; + #ifdef HAVE_TBB numThreads = 2; tbb::task_scheduler_init init(tbb::task_scheduler_init::deferred); - init.initialize(numThreads); + init.initialize(numThreads); #endif - IplImage* image = cvLoadImage(img_path.c_str()); - if (!image) + + IplImage* image = cvLoadImage(img_path.c_str()); + if (!image) { ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_TEST_DATA ); return; } - CvLatentSvmDetector* detector = cvLoadLatentSvmDetector(model_path.c_str()); - if (!detector) - { - ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_TEST_DATA ); - cvReleaseImage(&image); - return; - } + CvLatentSvmDetector* detector = cvLoadLatentSvmDetector(model_path.c_str()); + if (!detector) + { + ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_TEST_DATA ); + cvReleaseImage(&image); + return; + } - CvMemStorage* storage = cvCreateMemStorage(0); + CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* detections = 0; detections = cvLatentSvmDetectObjects(image, detector, storage, 0.5f, numThreads); - if (detections->total != num_detections) - { - ts->set_failed_test_info( cvtest::TS::FAIL_MISMATCH ); - } - else - { - ts->set_failed_test_info(cvtest::TS::OK); - for (int i = 0; i < detections->total; i++) - { - CvObjectDetection detection = *(CvObjectDetection*)cvGetSeqElem( detections, i ); - CvRect bounding_box = detection.rect; - float score = detection.score; - if ((!isEqual(bounding_box, true_bounding_boxes[i])) || (fabs(score - true_scores[i]) > score_thr)) - { - ts->set_failed_test_info( cvtest::TS::FAIL_MISMATCH ); - break; - } - } - } + if (detections->total != num_detections) + { + ts->set_failed_test_info( cvtest::TS::FAIL_MISMATCH ); + } + else + { + ts->set_failed_test_info(cvtest::TS::OK); + for (int i = 0; i < detections->total; i++) + { + CvObjectDetection detection = *(CvObjectDetection*)cvGetSeqElem( detections, i ); + CvRect bounding_box = detection.rect; + float score = detection.score; + if ((!isEqual(bounding_box, true_bounding_boxes[i], 1)) || (fabs(score - true_scores[i]) > score_thr)) + { + ts->set_failed_test_info( cvtest::TS::FAIL_MISMATCH ); + break; + } + } + } #ifdef HAVE_TBB init.terminate(); #endif - cvReleaseMemStorage( &storage ); - cvReleaseLatentSvmDetector( &detector ); + cvReleaseMemStorage( &storage ); + cvReleaseLatentSvmDetector( &detector ); cvReleaseImage( &image ); } @@ -139,16 +135,10 @@ void CV_LatentSVMDetectorTest::run( int /* start_from */) class LatentSVMDetectorTest : public cvtest::BaseTest { -public: - LatentSVMDetectorTest(); protected: void run(int); }; -LatentSVMDetectorTest::LatentSVMDetectorTest() -{ -} - static void writeDetections( FileStorage& fs, const string& nodeName, const vector& detections ) { fs << nodeName << "["; @@ -176,14 +166,24 @@ static void readDetections( FileStorage fs, const string& nodeName, vector& calc, const vector& valid ) +std::ostream& operator << (std::ostream& os, const CvRect& r) +{ + return (os << "[x=" << r.x << ", y=" << r.y << ", w=" << r.width << ", h=" << r.height << "]"); +} + +bool compareResults( const vector& calc, const vector& valid, int eps, float threshold) { if( calc.size() != valid.size() ) return false; @@ -192,8 +192,12 @@ bool compareResults( const vector& calc, con { const LatentSvmDetector::ObjectDetection& c = calc[i]; const LatentSvmDetector::ObjectDetection& v = valid[i]; - if( !isEqual(c,v) ) + if( !isEqual(c, v, eps, threshold) ) + { + std::cerr << "Expected: " << v.rect << " class=" << v.classID << " score=" << v.score << std::endl; + std::cerr << "Actual: " << c.rect << " class=" << c.classID << " score=" << c.score << std::endl; return false; + } } return true; } @@ -209,9 +213,11 @@ void LatentSVMDetectorTest::run( int /* start_from */) string true_res_path = string(ts->get_data_path()) + "latentsvmdetector/results.xml"; int numThreads = 1; + #ifdef HAVE_TBB numThreads = 2; #endif + Mat image_cat = imread( img_path_cat ); Mat image_cars = imread( img_path_cars ); if( image_cat.empty() || image_cars.empty() ) @@ -255,17 +261,17 @@ void LatentSVMDetectorTest::run( int /* start_from */) readDetections( fs, "detections12_cars", true_detections12_cars ); - if( !compareResults(detections1_cat, true_detections1_cat) ) + if( !compareResults(detections1_cat, true_detections1_cat, 1, score_thr) ) { std::cerr << "Results of detector1 are invalid on image cat.jpg" << std::endl; ts->set_failed_test_info( cvtest::TS::FAIL_MISMATCH ); } - if( !compareResults(detections12_cat, true_detections12_cat) ) + if( !compareResults(detections12_cat, true_detections12_cat, 1, score_thr) ) { std::cerr << "Results of detector12 are invalid on image cat.jpg" << std::endl; ts->set_failed_test_info( cvtest::TS::FAIL_MISMATCH ); } - if( !compareResults(detections12_cars, true_detections12_cars) ) + if( !compareResults(detections12_cars, true_detections12_cars, 1, score_thr) ) { std::cerr << "Results of detector12 are invalid on image cars.jpg" << std::endl; ts->set_failed_test_info( cvtest::TS::FAIL_MISMATCH ); -- 2.7.4