OPENCV C 的SVM返回同一类图像的相同置信度得分
SVM for OpenCV C++ Returns Same Confidence Score for Same Class Images
我已经训练了20堂课的SVM,现在为了新图像,我想首先将其分类为20个训练的班级之一,然后以其为基础显示置信得分分类。
问题:当我测试1类图像时,它们都返回了相同的置信度得分。我知道每个图像都应根据对其进行分类的分数不同。所以我知道我的代码中存在问题。
我什至更改了实例变量float *deciest_function在" OpenCV"框架上从受保护到公共并重建它,但问题仍未解决。
我想计算正确的分数,因为我以后要根据置信度分数对我的查询图像最匹配的图像。
请让我知道为什么我在同一班级中获得相同的置信度得分,而我的代码中的何处我犯了错误。
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("FlannBased");
Ptr<DescriptorExtractor> extractor = new SurfDescriptorExtractor();
SurfFeatureDetector detector(500);// hemessian threshold
int dictionarySize = 100; //number of clusters=100
TermCriteria tc(CV_TERMCRIT_ITER, 10, 0.001);
int retries = 1;
int flags = KMEANS_PP_CENTERS;
BOWKMeansTrainer bowTrainer(dictionarySize, tc, retries, flags);
BOWImgDescriptorExtractor bowDE(extractor, matcher);
int main( int argc, char** argv )
{
int i,j;
Mat dictionary; // creating a dictionary
FileStorage fs("dictionary_new.yml", FileStorage::READ);
fs ["vocabulary"]>> dictionary;
fs.release();
bowDE.setVocabulary(dictionary);
Mat labels(0, 1, CV_32FC1); //to store labels of images
Mat trainingData(0, dictionarySize, CV_32FC1);
int k=0;
CvSVMParams params;
params.kernel_type=CvSVM::RBF;
params.svm_type=CvSVM::C_SVC;
params.gamma=0.50625000000000009;
params.C=312.50000000000000;
params.term_crit=cvTermCriteria(CV_TERMCRIT_ITER,100,0.000001);
CvSVM svm;
svm.load("svm_new.yml");
cout<<"Processing evaluation data..."<<endl;
string tags[] = {"none","Plane","Bike","Face","Car","Bag","binocular","Gloves","Bread_Maker","Revolver","Ring","Guitar","Elephant","boat","French_horn","Gorilla","Headphone","Flower","Penguin","Tiger","Laptop"};
Mat evalData(0, dictionarySize, CV_32FC1);
k=0;
vector<KeyPoint> keypoint2;
Mat bowDescriptor2;
Mat img2; //to load an image
img2 = imread("3 (14).jpg");
detector.detect(img2, keypoint2);
bowDE.compute(img2, keypoint2, bowDescriptor2);
evalData.push_back(bowDescriptor2);
float response = svm.predict(bowDescriptor2, true);
float confidence=0;
int f_to_i=(int)response;
confidence=1.0/(1.0+exp(-response));
cout<<"nnIt's a "<<tags[f_to_i]<<" and its confidence: "<<confidence;
_getch();
return 0;
}
计算得分:
1 (1).jpg,Plane,0.731059
1 (2).jpg,Plane,0.731059
1 (3).jpg,Plane,0.731059
1 (4).jpg,Plane,0.731059
1 (5).jpg,Plane,0.731059
1 (6).jpg,Plane,0.731059
1 (7).jpg,Plane,0.731059
1 (8).jpg,Plane,0.731059
1 (9).jpg,Plane,0.731059
1 (10).jpg,Plane,0.731059
1 (11).jpg,Plane,0.731059
1 (12).jpg,Plane,0.731059
1 (13).jpg,Plane,0.731059
1 (14).jpg,Plane,0.731059
1 (15).jpg,Plane,0.731059
1 (16).jpg,Plane,0.731059
1 (17).jpg,Plane,0.731059
1 (18).jpg,Plane,0.731059
1 (19).jpg,Plane,0.731059
1 (20).jpg,Plane,0.731059
我也有类似的问题。问题在于,当您有更多的2堂课时,您将无法通过SVM.Predict(Bowdescriptor2,true)获得响应。如果问题是多类OpenCV SVM,则仅返回类标签号。这就是解释为什么您拥有相同的值。
查看文档:http://docs.opencv.org/modules/ml/doc/support_vector_machines.html#cvsvm-predict
" returndfval - 指定返回值的类型。如果是true且问题是2级分类,则该方法返回签名距离的决策函数值,否则该功能返回类标签(分类)或估计的功能值(回归)。"
可能的解决方案是修改float cvsvm ::预测(const float* row_sample,int row_len,bool returndfval)方法。在那里您可以进行更改以获取每个班级的决策功能。
查看代码的一部分:...
for (i = 0; i < class_count; i++)
{
for (j = i + 1; j < class_count; j++, df++)
{
sum = -df->rho;
int sv_count = df->sv_count;
for (k = 0; k < sv_count; k++)
sum += df->alpha[k] * buffer[df->sv_index[k]];
vote[sum > 0 ? i : j]++;
}
}
for (i = 1, k = 0; i < class_count; i++)
{
if (vote[i] > vote[k])
k = i;
}
result = returnDFVal && class_count == 2 ? (float)sum : (float)(class_labels->data.i[k]);
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 平均图像时图像损坏
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 如何创建从同一类继承的不同对象的向量
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- 将RGB图像保存为PPM格式
- 将图像添加到资源文件夹UWP C++
- 彩色图像的卤化物处理平均值
- 获取从C++中同一类中的构造函数调用的方法返回的值
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- C++如何将同一类的实例作为属性
- 重新定位图像时如何前进到下一个内存块
- 如何使用按钮更新GTK3图像以使用C++从相机捕获图片
- OPENCV C 的SVM返回同一类图像的相同置信度得分
- 为同一类的两个对象绘制不同的图像