【发布时间】:2020-08-03 17:33:44
【问题描述】:
已在此处提出此问题,但仍然没有答案/解决方案。我的问题是这样的:我使用烟雾的 RGB 直方图分布(在 8 个 bin 中 - 所以 M = 24)训练了一个用于烟雾检测的 SVM(带有 RBF 内核):
cv::Mat labelsMat = cv::Mat(N, 1, CV_32SC1);
for (int i = 0; i < N; i++)
{
labelsMat.at<int>(i, 0) = labels[i];
}
cv::Mat trainingDataMat = cv::Mat(N, M, CV_32FC1);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
trainingDataMat.at<float>(i, j) = histogramData[i][j];
}
}
// Create the SVM
cv::Ptr<ml::SVM> svm = ml::SVM::create();
svm->setType(ml::SVM::C_SVC);
svm->setKernel(ml::SVM::RBF);
svm->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER, 1000, 1e-8));
// Train the SVM
svm->trainAuto(trainingDataMat, ml::ROW_SAMPLE, labelsMat);
svm->save(SVMFileName);
然后我将 SVM 模型保存在一个文件中。对于检测,加载 SVM 模型后:
svm = cv::ml::SVM::load(SVMFile);
我继续进行烟雾检测;在这种情况下,判断帧中每个检测到的 blob 是否为烟雾:
for (int i = 0; i < 8; i++)
histogramData.at<float>(0, i) = Rhist[i];
for (int i = 8; i < 16; i++)
histogramData.at<float>(0, i) = Ghist[i];
for (int i = 16; i < 24; i++)
histogramData.at<float>(0, i) = Bhist[i];
float response = svm->predict(histogramData);
保存检测(真/假阳性)发生的帧,帧号为。当我在同一个视频上多次运行它时,每次都会产生不同的结果(帧号)(斑点检测总是产生相同的斑点)。关于检测,有时(大部分时间)会检测到烟雾,但有些情况下不会检测到相同的烟雾(相同的视频)。
有人知道如何解决这个问题吗?或者这仍然是 OpenCV SVM 中的一个已知问题?
【问题讨论】:
标签: opencv