当我使用 SVM 的 trainAuto 方法时,我得到 getKernelType()
的值 2 但是当我在我的代码中使用 RBF
时,它训练我的文件并输出 XML 文件。
svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(cv2.ml.SVM_RBF)
svm.setGamma(0.0025)
svm.setC(0.5)
svm.train(samples, cv2.ml.ROW_SAMPLE, labels)
svm.save('svm_data.xml')
上面的代码对我有用。但是当我使用以下代码转到预测部分时
hog = cv2.HOGDescriptor((100,200), (16,16), (8,8), (8,8), 9)
svm = cv2.ml.SVM_load('svm_data.xml')
sv = svm.getSupportVectors()
rho, alpha, svidx = svm.getDecisionFunction(0)
svm_new = np.append(sv, -rho)
hog.setSVMDetector(svm_new)
显示低于错误
error: (-215:Assertion failed) checkDetectorSize() in function 'cv::HOGDescriptor::setSVMDetector'
但是当我用 LINEAR 改变 RBF 时它在预测部分对我有用。
当我检查
print (hog.checkDetectorSize())
print (hog.getDescriptorSize())
它为 DetectorSize 返回 True
,为 DescriptorSize 返回 26676
最佳答案
OpenCV 无法接受线性内核以外的 SVM。
setSVMDetector()
virtual void cv::HOGDescriptor::setSVMDetector ( InputArray _svmdetector )
Parameters
_svmdetector coefficients for the linear SVM classifier.
很明显,您只将 SVM 的系数(作为单个数组)传递给 HOGDescriptor
,而不是种类(线性、RBF 和多项式是最常见的)和/或特定于它的参数(RBF 的多项式或 Gamma 的次数)。所以底层的 OpenCV 检测器无法确定内核的种类。而且它不必,因为唯一实现的是线性的。
关于python - 为什么使用 SVM 线性内核的工作代码不能使用 RBF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57467747/