我有一个项目,我需要使用OpenCV实时检测人,我的目标是使用HOG描述符来训练SVM分类器。我已经培训了一个具有HOG功能的CvSVM,来自460个正面和270个负面图像(来自INRIA的GRAZ_01数据集的样本图像:http://pascal.inrialpes.fr/data/human/)。我为每个图像计算了HOG特征:
resize(img,img, Size(32,48));
cvtColor(img,img_gray, CV_BGR2GRAY);
HOGDescriptor hog(Size(32,48), Size(8,8), Size(4,4), Size(4,4), 9);
hog.compute(img_gray, descriptors_values, Size(8,8), Size(0,0), locations);
并将其放入我保存到xml文件的矩阵中。我的正xml文件包含一个包含460行和2772列的矩阵,负xml包含一个包含270行和2772列的矩阵。之后我将它们与标签联系起来:
Mat labels(numSamples,1,CV_32FC1);
labels.rowRange(0,numPos).setTo(cv::Scalar(int(1)));
labels.rowRange(numPos,numSamples).setTo(cv::Scalar(int(-1)));
我已经训练了一个CvSVM,我将CvSVM转换为HOGDescriptor使用探测器所需的原始形式:
PrimalSVM model;
vector<float> detector;
train= model.train(data, labels, Mat(),Mat(),SVMParams());
model.save("SVM.xml");
model.load("SVM.xml");
model.getSupportVector(detector);
HOGDescriptor trained_hog(Size(32,48), Size(8,8), Size(4,4), Size(4,4), 9);
trained_hog.setSVMDetector(detector);
我得到了一个非常糟糕的检测(在一个只有一两个的场景中检测到这么多人),我做错了什么?请帮助,我坚持这个。
修改
我决定更换一个包含更多样本的数据集:现在我正在使用以左右反射(2418个正面图像)和原始负面训练图像(1218个负面图像)为中心的标准化正面训练图像INRIA数据集(所有图像均为64x128像素)。所以,我更改了获取HOG描述符的参数:
HOGDescriptor hog(Size(64,128), Size(16,16), Size(8,8), Size(8,8), 9);
hog.compute(img_gray, descriptors_values, Size(8,8), Size(16,16), locations);
对于培训:
HOGDescriptor trained_hog(Size(64,128), Size(16,16), Size(8,8), Size(8,8), 9);
trained_hog.setSVMDetector(detector);
trained_hog.detectMultiScale(img_gray, found, 0, Size(8,8), Size(16,16), 1.05, 2);
但现在我的断言失败了:
OpenCV错误:setSVMDetector中的断言失败(checkDetectorSize()),文件/Users/Fran/Documents/OpenCV/opencv-2.4.9/modules/objdetect/src/hog.cpp,第89行 libc ++ abi.dylib:terminate调用抛出异常 中止陷阱:6
知道我做错了什么?