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进行训练 因此,问题出现
//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。