我正在嘗試使用 OpenCV 學習影像分類,并已開始使用本教程/指南https://learnopencv.com/deep-learning-with-opencvs-dnn-module-a-definitive-guide/
只是為了測驗一切正常,我從教程中下載了影像代碼,一切正常,沒有錯誤。我使用了與教程中完全相同的影像(老虎圖片)。問題是他們得到了 91% 的匹配,而我只得到 14%。
我的猜測是代碼中缺少某些內容。因此,在指南中,同一程式的 Python 版本使用 NumPy 來獲取概率。但我真的沒有頭緒。
有問題的代碼如下:
#include <iostream>
#include <fstream>
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/dnn/all_layers.hpp>
using namespace std;
using namespace cv;
using namespace dnn;
int main(int, char**) {
vector<string> class_names;
ifstream ifs(string("../data/classification_classes_ILSVRC2012.txt").c_str());
string line;
while (getline(ifs, line)){
class_names.push_back(line);
}
auto model = readNet("../data/DenseNet_121.prototxt",
"../data/DenseNet_121.caffemodel",
"Caffe");
Mat image = imread("../data/tiger.jpg");
Mat blob = blobFromImage(image, 0.01, Size(224, 224), Scalar(104, 117, 123));
model.setInput(blob);
Mat outputs = model.forward();
double final_prob;
minMaxLoc(outputs.reshape(1, 1), nullptr, &final_prob, nullptr, &classIdPoint);
cout << final_prob;
}
如果有人可以幫助我,我將不勝感激!
uj5u.com熱心網友回復:
從這里參考:
從這些中,我們提取最高的標簽索引并將其存盤在 label_id 中。然而,這些分數實際上并不是概率分數。我們需要得到 softmax 概率才能知道模型預測得分最高的標簽的概率是多少。
在上面的 Python 代碼中,我們使用 np.exp(final_outputs) / np.sum(np.exp(final_outputs)) 將分數轉換為 softmax 概率。然后我們將最高概率分數乘以 100 以獲得預測分數百分比。
實際上,它的 C 版本沒有這樣做,但是如果您使用,您應該得到相同的數值結果:
Mat outputs = model.forward();
Mat softmax;
cv::exp(outputs.reshape(1,1), softmax);
softmax /= cv::sum(softmax)[0];
double final_prob;
minMaxLoc(softmax, nullptr, &final_prob, nullptr, &classIdPoint);
final_prob *= 100;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/373239.html
