2021SC@SDUSC ??这一篇博客我将用来介绍PaddleOCR的方向分类器所使用的后处理代码。后处理顾名思义是在预处理之后再对图像进行处理,方向分类器中的后处理作用为转换图像的文本标签和文本索引。常见的后处理算法有非极大抑制、形态学的膨胀/腐蚀等等。这里的后处理代码中没有什么著名的算法,仅使用paddle包自身的数据结构和函数就完成了图像后处理操作。下面是后处理代码,PaddleOCR-release-2.2->ppocr->postprocess->cls_postprocess.py。
import paddle
class ClsPostProcess(object):
""" Convert between text-label and text-index """
def __init__(self, label_list, **kwargs):
super(ClsPostProcess, self).__init__()
self.label_list = label_list
def __call__(self, preds, label=None, *args, **kwargs):
if isinstance(preds, paddle.Tensor):
preds = preds.numpy()
pred_idxs = preds.argmax(axis=1)
decode_out = [(self.label_list[idx], preds[i, idx])
for i, idx in enumerate(pred_idxs)]
if label is None:
return decode_out
label = [(self.label_list[idx], 1.0) for idx in label]
return decode_out, label
??在__init__函数中获取lable_list作为ClsPostProcess的lable_list。在__call__函数中进行文本标签和文本索引之间的转换。第一行的if语句用来判断preds是否为paddle.Tensor类型,如果是就调用preds.numpy()函数。paddle.Tensor类型是paddle提供的一种数据结构,和python的几种内置结构类型有所不同,它更类似于C语言的多维数组,和Numpy的array相类似。我们可以非常方便的读取到Tensor位置上的内容,但是不能够轻易的给已经生成的Tensor添加成员或者生成维度。所有的修改都需要通过新建在把数据处理后复制进去。调用.numpy()函数把preds转换为numpy之后,新建pred_idxs=preds.argmax(axis=1)返回最大值的索引。pred_idxs中的索引对应的lable_list存入decode_out。如果label为None就直接返回decode_out,否则label赋值为label中索引值为1.0的值,然后返回decode_out和label。
|