2021SC@SDUSC
这一篇博客我来介绍PaddleOCR的方向分类器使用的评估代码。
在机器学习中,性能指标(Metrics)是衡量一个模型好坏的关键,通过衡量模型输出预测值和 真实值之间的某种“距离”得出的。性能指标往往是我们做模型时的最终目标,如准确率,召回率,敏感度等等,但是性能指标常常因为不可微分,无法作为优化的loss函数,因此采用如cross-entropy,rmse等“距离”可微函数作为优化目标,以期待在loss函数降低的时候,能够提高性能指标。而最终目标的性能指标则作为模型训练过程中,作为验证集做决定(early stoping 或 model selection)的主要依据,与训练结束后评估本次训练出的模型好坏的重要标准。性能指标根据问题不同,主要分为:回归类性能指标和分类性能指标。
下面是PaddleOCR的方向分类器中的评估代码,位于PaddleOCR-release-2.2->ppocr->metrics->cls_metric.py。由下图的代码可以看出,方向分类器
class ClsMetric(object):
def __init__(self, main_indicator='acc', **kwargs):
self.main_indicator = main_indicator
self.reset()
def __call__(self, pred_label, *args, **kwargs):
preds, labels = pred_label
correct_num = 0
all_num = 0
for (pred, pred_conf), (target, _) in zip(preds, labels):
if pred == target:
correct_num += 1
all_num += 1
self.correct_num += correct_num
self.all_num += all_num
return {'acc': correct_num / all_num, }
def get_metric(self):
"""
return metrics {
'acc': 0
}
"""
acc = self.correct_num / self.all_num
self.reset()
return {'acc': acc}
def reset(self):
self.correct_num = 0
self.all_num = 0
的主要评估标准为准确率(acc)。每进行一次评估即调用__init__函数都先定义主要评估标准为acc,并调用reset函数清除准确样本个数(correct_num)和全部样本个数(all_num )。然后在__call__函数中逐一对比数据集中的预测样本和目标样本,如果一样则correct_num加一,无论结果如何all_num 都加一。get_metric函数也是用来取得acc。call函数使得Python中的类变成可调用的,correct_numcall和all_num 都在call函数中获得数据集中的值,函数返回“‘acc’: correct_num / all_num, ”就可在调用ClsMetric类时在控制台获得评估标准准确率(acc)值。而调用get_metric函数可以使用call函数中已获得值的两个变量计算出准确率,并且调用reset函数清除这两个值,便于下一次使用评估函数。
虽然PaddleOCR的方向分类器并没有使用复杂的评估方法,但是由于现在的方向分类器只用来判断正向和倒向两个方向的图像分割框,所以使用准确率就可以很好地评估方向分类器代码的效果。