Updated latentSVM tests and data
authorAndrey Kamaev <no@email>
Fri, 27 Apr 2012 11:32:40 +0000 (11:32 +0000)
committerAndrey Kamaev <no@email>
Fri, 27 Apr 2012 11:32:40 +0000 (11:32 +0000)
modules/objdetect/test/test_latentsvmdetector.cpp

index da9fb3a..21ec4be 100644 (file)
@@ -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<LatentSvmDetector::ObjectDetection>& detections )
 {
     fs << nodeName << "[";
@@ -176,14 +166,24 @@ static void readDetections( FileStorage fs, const string& nodeName, vector<Laten
     }
 }
 
-static inline bool isEqual( const LatentSvmDetector::ObjectDetection& d1, const LatentSvmDetector::ObjectDetection& d2)
+static inline bool isEqual( const LatentSvmDetector::ObjectDetection& d1, const LatentSvmDetector::ObjectDetection& d2, int eps, float threshold)
 {
-    return ((d1.rect.x == d2.rect.x) && (d1.rect.y == d2.rect.y) && (d1.rect.width == d2.rect.width) && (d1.rect.height == d2.rect.height) &&
-            (d1.classID == d2.classID) &&
-            std::abs(d1.score-d2.score) < score_thr );
+    return (
+           std::abs(d1.rect.x - d2.rect.x) <= eps
+           && std::abs(d1.rect.y - d2.rect.y) <= eps
+           && std::abs(d1.rect.width - d2.rect.width) <= eps
+           && std::abs(d1.rect.height - d2.rect.height) <= eps
+           && (d1.classID == d2.classID)
+           && std::abs(d1.score - d2.score) <= threshold
+           );
 }
 
-bool compareResults( const vector<LatentSvmDetector::ObjectDetection>& calc, const vector<LatentSvmDetector::ObjectDetection>& 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<LatentSvmDetector::ObjectDetection>& calc, const vector<LatentSvmDetector::ObjectDetection>& valid, int eps, float threshold)
 {
     if( calc.size() != valid.size() )
         return false;
@@ -192,8 +192,12 @@ bool compareResults( const vector<LatentSvmDetector::ObjectDetection>& 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 );