Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV SVM训练自动内存不足_Opencv_Image Processing_Classification_Svm_Training Data - Fatal编程技术网

OpenCV SVM训练自动内存不足

OpenCV SVM训练自动内存不足,opencv,image-processing,classification,svm,training-data,Opencv,Image Processing,Classification,Svm,Training Data,这是我在这里的第一篇帖子,所以我希望能够正确地提出我的问题:-) 我想通过对颜色样本进行分类来进行“大象检测”(我的灵感来源于此)。这是我的“解决方案”的管道,直到分类器的培训: 加载一组4个训练图像(均包含一个大象),然后将其拆分为两个图像:一个包含大象周围的环境(“背景”),另一个包含大象(“前景”) 背景和前景的均值漂移分割 RGB->Luv颜色空间转换和像素值提取(以便用3列和与采样数相等的行数填充Mat对象) 通过调用train_auto方法,用RBF核对SVM进行训练 因此,问题出现

这是我在这里的第一篇帖子,所以我希望能够正确地提出我的问题:-)

我想通过对颜色样本进行分类来进行“大象检测”(我的灵感来源于此)。这是我的“解决方案”的管道,直到分类器的培训:

  • 加载一组4个训练图像(均包含一个大象),然后将其拆分为两个图像:一个包含大象周围的环境(“背景”),另一个包含大象(“前景”)
  • 背景和前景的均值漂移分割
  • RGB->Luv颜色空间转换和像素值提取(以便用3列和与采样数相等的行数填充Mat对象)
  • 通过调用train_auto方法,用RBF核对SVM进行训练
  • 因此,问题出现在最后一步:经过一段时间(几个小时),我得到以下错误消息:

    OpenCV错误:OutOfMemoryError文件xxx\alloc.cpp第52行中内存不足(分配22165936字节失败) 在引发“cv::Exception”的实例后调用terminate what():xxx\alloc.cpp:52:错误:(-4)未能在函数OutOfMemoryError中分配22165936字节 我的训练样本是[3列x 1385235行]CV_32FC1 Mat对象。我不认为这个数据结构太大,不是吗?我有16GB的RAM,我使用OpenCV 2.4.9和代码块

    但是,这是源代码:

    //Loading Background & Foreground Training Images
    Mat train_00_background = imread("training_set/train_00_background.png");
    cvtColor(train_00_background, train_00_background, CV_BGR2BGRA);
    oclMat t_00_bg;
    t_00_bg.upload(train_00_background);
    
    (...)
    
    
    Mat train_00_foreground = imread("training_set/train_00_foreground.png");
    cvtColor(train_00_foreground, train_00_foreground, CV_BGR2BGRA);
    oclMat t_00_fg;
    t_00_fg.upload(train_00_foreground);
    
    (...)
    
    //COLOR SEGMENTATION by MEAN SHIFT CLUSTERING
    meanShiftSegmentation(t_00_bg, train_00_background_clustered, 5, 5, 50, TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 5, 1));
    
    (...)
    
    //CV_8UC3 -> CV_32FC3
    train_00_background_clustered.convertTo(train_00_background_clustered, CV_32FC3);
    
    (...)
    
    //Normalization
    train_00_background_clustered *= 1./255;
    
    (...)
    
    //RGB -> Luv
    cvtColor(train_00_background_clustered, train_00_background_clustered, CV_BGR2Luv);
    
    (...)
    
    //COLOR LIST EXTRACTION FROM BACKGROUND AND FOREGROUND
    //colorListBg_00 is a 3 x NumberOfColors CV_32FC1 Mat
    extractColorList(train_00_background_clustered, colorListBg_00);
    
    // Memory release
    train_00_background_clustered.release(); 
    
    (...)
    
    //Color List concatenation
    //background
    colorListBg_00.copyTo(colorList);
    colorList.push_back(colorListBg_01);
    (...)
    Size s = colorList.size();
    int s1 = s.height;
    
    //foreground  
    colorList.push_back(colorListFg_00);
    (...)
    s = colorList.size();
    int s2 = s.height - s1;
    
    // ASSIGNING THE LABELS
    Mat labelsBg(s1, 1, CV_32FC1, -1.0);
    Mat labelsFg(s2, 1, CV_32FC1, 1.0);
    Mat labels;
    labelsBg.copyTo(labels);
    labels.push_back(labelsFg);
    
    // SVM TRAINING
    CvSVMParams params;
    params.svm_type    = CvSVM::C_SVC;
    params.kernel_type = CvSVM::RBF;
    params.term_crit   = cvTermCriteria( CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 1000, FLT_EPSILON );
    
    CvSVM SVM;   
    SVM.train_auto(colorList, labels, Mat(), Mat(), params, 2);
    

    感谢您关注这个问题。

    请注意,32位程序无法使用这些16GB内存。64位程序很少在内存不足时崩溃;他们只是疯狂地交换。好吧,所以我必须重新编译我的程序。只是出于好奇:我的错误是不可能分配22兆字节的数据。。。这是32位内存分配的限制吗?我相信最大阈值是4G字节!谢谢:-)问题是在一个连续的内存块中分配了额外的22 MB。您能检查一下整个程序消耗了多少内存吗?我觉得奇怪的是,那些额外的22MB是不可分配的,也许你在其他地方有内存问题?@Mika我整个过程消耗的内存@32位大约是900 MB;64位编译的同一个程序增长到4.6GB。