python - 为什么使用 SVM 线性内核的工作代码不能使用 RBF

标签 python opencv machine-learning computer-vision svm

当我使用 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。

首先,official documentation说:

setSVMDetector()

virtual void cv::HOGDescriptor::setSVMDetector ( InputArray _svmdetector )

Parameters

_svmdetector coefficients for the linear SVM classifier.

很明显,您只将 SVM 的系数(作为单个数组)传递给 HOGDescriptor,而不是种类(线性、RBF 和多项式是最常见的)和/或特定于它的参数(RBF 的多项式或 Gamma 的次数)。所以底层的 OpenCV 检测器无法确定内核的种类。而且它不必,因为唯一实现的是线性的。

此外,阅读thisthis问题。

关于python - 为什么使用 SVM 线性内核的工作代码不能使用 RBF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57467747/

相关文章:

python - 如何使用 selenium python 获取伪元素的 css 值?

python - yacc 无法归约 (Python Lex-Yacc)

python - 使用 Sklearn 的算法模型持久性

machine-learning - 使用尺度参数训练 Caffe CNN

linux - Opencv 立体相机捕获和帧率限制

machine-learning - 当我们在 theano 中使用交叉熵时,如何修复 NAN 或 INF?

python - 确定一个点是否位于 Matplotlib 子图中

python - 是否有不取消引用符号链接(symbolic link)的 os.getcwd() 版本?

python - uint8 CIE Luv Mat 的取值范围是多少?

python - 在 python 中使用 opencv 显示图像中特定颜色周围的边界