我遇到了detectmultiScale()函数的问题。我正在开发一个多个对象(汽车,树,建筑......)的对象识别器。为此,我训练了n个二进制SVM(object_i / no_object_i)。在测试集上(使用相同大小的补丁),我可以获得大约90%的准确度,这是相当不错的。但是,当我使用它们检测较大图像中的对象(即使用MultiScale())时,无论我使用何种模型,我都会在图像中间找到一个漂亮的窗口。
你对这里的问题有什么想法吗?我使用了detect()函数,在这种情况下,我确实得到了完全相反的情况。到处都是广场。
我也给了一个矢量作为函数参数来获得置信度权重。但是,返回的值总是在20 - 30左右。有人知道它们是什么意思吗?哪个因素应该正常化?
import csv
import io
import urllib.request
csv_response = urllib.request.urlopen(url)
lst = list(csv.reader(io.TextIOWrapper(csv_response)))
答案 0 :(得分:0)
好的,我为线性SVM解决了这个问题。既然没有关于这一点的文档,也许它对其他人有用,所以:我们走了!
问题是alphas和rhos已经在内部乘以-1,因此需要这样做:
// get the support vectors
cv::Mat sv = svm->getSupportVectors();
sv = -sv;
const int sv_total = sv.rows;
// get the decision function
cv::Mat alpha, svidx;
double rho = svm->getDecisionFunction(0, alpha, svidx);
std::vector< float > hog_detector(sv.cols + 1);
memcpy(&hog_detector[0], sv.ptr(), sv.cols * sizeof(hog_detector[0]));
hog_detector[sv.cols] = (float) rho;
之后它不能完美地运作,但是做了它应该做的事情,并且与错误的&#34;相比非常快。版本
答案 1 :(得分:0)
我也遇到同样的问题。无论输入什么测试图像,输出始终在中间有一个矩形,并且矩形始终出现在同一位置。
我用David Romero的解决方案修复了它!非常感谢!
// get the support vectors
cv::Mat sv = svm->getSupportVectors();
sv = -sv;
const int sv_total = sv.rows;
// get the decision function
cv::Mat alpha, svidx;
double rho = svm->getDecisionFunction(0, alpha, svidx);
std::vector< float > hog_detector(sv.cols + 1);
memcpy(&hog_detector[0], sv.ptr(), sv.cols * sizeof(hog_detector[0]));
hog_detector[sv.cols] = (float) rho;
效果很好!