Merge pull request #5285 from ilya-lavrenov:ml5
authorAlexander Alekhin <alexander.alekhin@itseez.com>
Wed, 2 Sep 2015 11:39:07 +0000 (11:39 +0000)
committerAlexander Alekhin <alexander.alekhin@itseez.com>
Wed, 2 Sep 2015 11:39:07 +0000 (11:39 +0000)
modules/features2d/test/test_descriptors_regression.cpp
modules/features2d/test/test_lshindex_flannbased_matcher.cpp
modules/features2d/test/test_nearestneighbors.cpp
modules/gpu/src/stereobp.cpp
modules/gpu/test/test_calib3d.cpp
modules/ml/src/ann_mlp.cpp
modules/ml/src/ertrees.cpp
modules/ml/src/gbt.cpp
modules/ml/src/svm.cpp

index 2185625..a1c07f8 100644 (file)
@@ -61,7 +61,7 @@ static void writeMatInBin( const Mat& mat, const string& filename )
         fwrite( (void*)&mat.rows, sizeof(int), 1, f );
         fwrite( (void*)&mat.cols, sizeof(int), 1, f );
         fwrite( (void*)&type, sizeof(int), 1, f );
-        int dataSize = (int)(mat.step * mat.rows * mat.channels());
+        int dataSize = (int)(mat.step * mat.rows);
         fwrite( (void*)&dataSize, sizeof(int), 1, f );
         fwrite( (void*)mat.data, 1, dataSize, f );
         fclose(f);
@@ -80,12 +80,15 @@ static Mat readMatFromBin( const string& filename )
         size_t elements_read4 = fread( (void*)&dataSize, sizeof(int), 1, f );
         CV_Assert(elements_read1 == 1 && elements_read2 == 1 && elements_read3 == 1 && elements_read4 == 1);
 
-        uchar* data = (uchar*)cvAlloc(dataSize);
-        size_t elements_read = fread( (void*)data, 1, dataSize, f );
+        Mat returnMat(rows, cols, type);
+        CV_Assert(returnMat.step * returnMat.rows == (size_t)(dataSize));
+
+        size_t elements_read = fread( (void*)returnMat.data, 1, dataSize, f );
         CV_Assert(elements_read == (size_t)(dataSize));
+
         fclose(f);
 
-        return Mat( rows, cols, type, data );
+        return returnMat;
     }
     return Mat();
 }
index ddc81b0..d1c6ea7 100644 (file)
@@ -303,7 +303,8 @@ public:
     //
     // constructor
     //
-    CV_FeatureDetectorMatcherBaseTest(testparam* _tp, double _accuracy_margin, cv::Feature2D* _fe, cv::DescriptorMatcher *_flmatcher, string _flmatchername, int norm_type_for_bfmatcher) :
+    CV_FeatureDetectorMatcherBaseTest(testparam* _tp, double _accuracy_margin, cv::Feature2D* _fe,
+                                      cv::DescriptorMatcher *_flmatcher, string _flmatchername, int norm_type_for_bfmatcher) :
         tp(_tp),
         target_accuracy_margin_from_bfmatcher(_accuracy_margin),
         fe(_fe),
@@ -318,6 +319,15 @@ public:
         bfmatcher = new cv::BFMatcher(norm_type_for_bfmatcher);
     }
 
+    virtual ~CV_FeatureDetectorMatcherBaseTest()
+    {
+        if (bfmatcher)
+        {
+            delete bfmatcher;
+            bfmatcher = NULL;
+        }
+    }
+
     //
     // Main Test method
     //
index b63bc64..bb1d51b 100644 (file)
@@ -159,7 +159,7 @@ void NearestNeighborTest::run( int /*start_from*/ ) {
 class CV_KDTreeTest_CPP : public NearestNeighborTest
 {
 public:
-    CV_KDTreeTest_CPP() {}
+    CV_KDTreeTest_CPP() : NearestNeighborTest(), tr(NULL) {}
 protected:
     virtual void createModel( const Mat& data );
     virtual int checkGetPoints( const Mat& data );
@@ -244,7 +244,7 @@ void CV_KDTreeTest_CPP::releaseModel()
 class CV_FlannTest : public NearestNeighborTest
 {
 public:
-    CV_FlannTest() {}
+    CV_FlannTest() : NearestNeighborTest(), index(NULL) { }
 protected:
     void createIndex( const Mat& data, const IndexParams& params );
     int knnSearch( Mat& points, Mat& neighbors );
@@ -255,6 +255,9 @@ protected:
 
 void CV_FlannTest::createIndex( const Mat& data, const IndexParams& params )
 {
+    // release previously allocated index
+    releaseModel();
+
     index = new Index( data, params );
 }
 
@@ -321,7 +324,11 @@ int CV_FlannTest::radiusSearch( Mat& points, Mat& neighbors )
 
 void CV_FlannTest::releaseModel()
 {
-    delete index;
+    if (index)
+    {
+        delete index;
+        index = NULL;
+    }
 }
 
 //---------------------------------------
index 1677f33..3b827a3 100644 (file)
@@ -213,8 +213,8 @@ namespace
 
             if (rthis.levels > 1)
             {
-                int less_rows = (rows + 1) / 2;
-                int less_cols = (cols + 1) / 2;
+                int less_rows = rows / 2;
+                int less_cols = cols / 2;
 
                 u2.create(less_rows * rthis.ndisp, less_cols, rthis.msg_type);
                 d2.create(less_rows * rthis.ndisp, less_cols, rthis.msg_type);
@@ -283,8 +283,8 @@ namespace
 
             for (int i = 1; i < rthis.levels; ++i)
             {
-                cols_all[i] = (cols_all[i-1] + 1) / 2;
-                rows_all[i] = (rows_all[i-1] + 1) / 2;
+                cols_all[i] = cols_all[i-1] / 2;
+                rows_all[i] = rows_all[i-1] / 2;
 
                 datas[i].create(rows_all[i] * rthis.ndisp, cols_all[i], rthis.msg_type);
 
index ea4039a..80882d4 100644 (file)
@@ -114,7 +114,9 @@ GPU_TEST_P(StereoBeliefPropagation, Regression)
     cv::Mat h_disp(disp);
     h_disp.convertTo(h_disp, disp_gold.depth());
 
-    EXPECT_MAT_NEAR(disp_gold, h_disp, 0.0);
+    cv::Rect roi(0, 0, disp_gold.cols - 20, disp_gold.rows - 20);
+
+    EXPECT_MAT_NEAR(disp_gold(roi), h_disp(roi), 0.0);
 }
 
 INSTANTIATE_TEST_CASE_P(GPU_Calib3D, StereoBeliefPropagation, ALL_DEVICES);
index 7323ab5..69e4448 100644 (file)
@@ -1535,6 +1535,10 @@ void CvANN_MLP::read( CvFileStorage* fs, CvFileNode* node )
 
     _layer_sizes = (CvMat*)cvReadByName( fs, node, "layer_sizes" );
     CV_CALL( create( _layer_sizes, SIGMOID_SYM, 0, 0 ));
+
+    cvReleaseMat( &_layer_sizes );
+    _layer_sizes = NULL;
+
     l_count = layer_sizes->cols;
 
     CV_CALL( read_params( fs, node ));
index d911834..fe3e04c 100644 (file)
@@ -537,6 +537,9 @@ void CvERTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
     if( data )
         delete data;
 
+    if ( pair16u32s_ptr )
+        cvFree( &pair16u32s_ptr );
+
     if (_fdst)
         cvFree( &_fdst );
     if (_idst)
index 9b00cda..9ed6b4c 100644 (file)
@@ -1292,13 +1292,18 @@ CvGBTrees::calc_error( CvMLData* _data, int type, std::vector<float> *resp )
         return -FLT_MAX;
 
     float* pred_resp = 0;
+    bool needsFreeing = false;
+
     if (resp)
     {
         resp->resize(n);
         pred_resp = &((*resp)[0]);
     }
     else
+    {
         pred_resp = new float[n];
+        needsFreeing = true;
+    }
 
     Sample_predictor predictor = Sample_predictor(this, pred_resp, _data->get_values(),
             _data->get_missing(), _sample_idx);
@@ -1331,6 +1336,9 @@ CvGBTrees::calc_error( CvMLData* _data, int type, std::vector<float> *resp )
         err = err / (float)n;
     }
 
+    if (needsFreeing)
+        delete[]pred_resp;
+
     return err;
 }
 
index 0a5bfff..594a43a 100644 (file)
@@ -2315,7 +2315,12 @@ void CvSVM::write( CvFileStorage* fs, const char* name ) const
                       params.svm_type == CvSVM::ONE_CLASS ? 1 : 0;
     const CvSVMDecisionFunc* df = decision_func;
     if( !isSvmModelApplicable(sv_total, var_all, var_count, class_count) )
+    {
+        cvReleaseFileStorage( &fs );
+        fs = NULL;
+
         CV_ERROR( CV_StsParseError, "SVM model data is invalid, check sv_count, var_* and class_count tags" );
+    }
 
     cvStartWriteStruct( fs, name, CV_NODE_MAP, CV_TYPE_NAME_ML_SVM );