如何计算OCR系统的置信度分数?
How to calculate confidence score of OCR system?
我正在做一个 OCR 项目,我想知道如何计算我的 OCR 系统的置信度分数。
我有数字万用表图像。图像中的设备屏幕上有一些测量结果。我想承认这些价值观。但是,根据我的研究,我不确定哪种 OCR 置信度计算技术适合我的系统。
据我了解,OCR 置信度分数可以按字符、单词和句子进行计算。实际上,后两种方法建立在字符置信度分数之上。就我而言,字符明智的计算可能是错误的或不充分的。
例如,我有“40.245 V”文字。我得到了两个不同的识别结果,如“40.247 V”和“70.245 V”。如果我没记错,这两个结果将具有相同或接近的置信度分数。然而,“40.247 V”预测是可以接受的,而“70.245 V”在我的情况下是不可接受的。
是否知道如何计算这种情况的置信度分数?
计算置信度时,您会生成置信度的加权平均值,以便为第一个字符提供更多权重,为最后一个字符提供更少的权重。
#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
using namespace std;
double getWeightedConfidence(vector<pair<char /* character */, double /*confidence of that character */>> word) {
if (word.empty()) {
return 1.0;
}
double confidence = 0;
if (isdigit(word[0].first)) {
// okay it is a number
double weight = 1;
double sumOfWeights = 0;
for (const auto &c : word) {
confidence += c.second * weight;
sumOfWeights += weight;
weight /= 10; // you can decay it by whatever number you want based on how much do you think next digit is less valueble then previous
}
confidence /= sumOfWeights;
} else {
// not a number - just calculate a normal average
for (const auto &c : word) {
confidence += c.second;
}
confidence /= word.size();
}
return confidence;
}
int main() {
vector<pair<char, double>> number_with_first_digit_wrong;
number_with_first_digit_wrong.emplace_back('7', 0.1);
number_with_first_digit_wrong.emplace_back('4', 0.9);
number_with_first_digit_wrong.emplace_back('6', 0.9);
number_with_first_digit_wrong.emplace_back('2', 0.9);
number_with_first_digit_wrong.emplace_back('.', 0.9);
number_with_first_digit_wrong.emplace_back('9', 0.9);
vector<pair<char, double>> number_with_last_digit_wrong;
number_with_last_digit_wrong.emplace_back('7', 0.9);
number_with_last_digit_wrong.emplace_back('4', 0.9);
number_with_last_digit_wrong.emplace_back('6', 0.9);
number_with_last_digit_wrong.emplace_back('2', 0.9);
number_with_last_digit_wrong.emplace_back('.', 0.9);
number_with_last_digit_wrong.emplace_back('9', 0.1);
cout << getWeightedConfidence(number_with_first_digit_wrong) << " " << getWeightedConfidence(number_with_last_digit_wrong) << endl;
return 0;
}
结果很简单:
0.179999 - 当第一个数字的置信度为 0.1(其他为 0.9)
0.899993 - 当 0.1 是最后一位的置信度时(其他都是 0.9)
如果您认为某些职位比其他职位更有价值,您可以指定不同的权重。
我正在做一个 OCR 项目,我想知道如何计算我的 OCR 系统的置信度分数。
我有数字万用表图像。图像中的设备屏幕上有一些测量结果。我想承认这些价值观。但是,根据我的研究,我不确定哪种 OCR 置信度计算技术适合我的系统。
据我了解,OCR 置信度分数可以按字符、单词和句子进行计算。实际上,后两种方法建立在字符置信度分数之上。就我而言,字符明智的计算可能是错误的或不充分的。
例如,我有“40.245 V”文字。我得到了两个不同的识别结果,如“40.247 V”和“70.245 V”。如果我没记错,这两个结果将具有相同或接近的置信度分数。然而,“40.247 V”预测是可以接受的,而“70.245 V”在我的情况下是不可接受的。
是否知道如何计算这种情况的置信度分数?
计算置信度时,您会生成置信度的加权平均值,以便为第一个字符提供更多权重,为最后一个字符提供更少的权重。
#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
using namespace std;
double getWeightedConfidence(vector<pair<char /* character */, double /*confidence of that character */>> word) {
if (word.empty()) {
return 1.0;
}
double confidence = 0;
if (isdigit(word[0].first)) {
// okay it is a number
double weight = 1;
double sumOfWeights = 0;
for (const auto &c : word) {
confidence += c.second * weight;
sumOfWeights += weight;
weight /= 10; // you can decay it by whatever number you want based on how much do you think next digit is less valueble then previous
}
confidence /= sumOfWeights;
} else {
// not a number - just calculate a normal average
for (const auto &c : word) {
confidence += c.second;
}
confidence /= word.size();
}
return confidence;
}
int main() {
vector<pair<char, double>> number_with_first_digit_wrong;
number_with_first_digit_wrong.emplace_back('7', 0.1);
number_with_first_digit_wrong.emplace_back('4', 0.9);
number_with_first_digit_wrong.emplace_back('6', 0.9);
number_with_first_digit_wrong.emplace_back('2', 0.9);
number_with_first_digit_wrong.emplace_back('.', 0.9);
number_with_first_digit_wrong.emplace_back('9', 0.9);
vector<pair<char, double>> number_with_last_digit_wrong;
number_with_last_digit_wrong.emplace_back('7', 0.9);
number_with_last_digit_wrong.emplace_back('4', 0.9);
number_with_last_digit_wrong.emplace_back('6', 0.9);
number_with_last_digit_wrong.emplace_back('2', 0.9);
number_with_last_digit_wrong.emplace_back('.', 0.9);
number_with_last_digit_wrong.emplace_back('9', 0.1);
cout << getWeightedConfidence(number_with_first_digit_wrong) << " " << getWeightedConfidence(number_with_last_digit_wrong) << endl;
return 0;
}
结果很简单:
0.179999 - 当第一个数字的置信度为 0.1(其他为 0.9) 0.899993 - 当 0.1 是最后一位的置信度时(其他都是 0.9)
如果您认为某些职位比其他职位更有价值,您可以指定不同的权重。