From 051fe64a0d6bb1ca5ba8b02ceef9b3696f10d211 Mon Sep 17 00:00:00 2001 From: Jethong <1147925384@qq.com> Date: Wed, 10 Mar 2021 14:14:21 +0800 Subject: [PATCH] fix config add e2e_ch.md e2e_res_img623_pg --- configs/e2e/e2e_r50_vd_pg.yml | 61 +++---- doc/doc_ch/e2e.md | 120 +++++++++++++ doc/imgs_results/e2e_res_img623_pg.jpg | Bin 0 -> 138845 bytes ppocr/data/__init__.py | 5 +- ppocr/data/imaug/label_ops.py | 14 +- ppocr/data/imaug/operators.py | 6 +- ppocr/data/imaug/pg_process.py | 66 ++----- ppocr/data/pgnet_dataset.py | 21 ++- ppocr/losses/e2e_pg_loss.py | 31 ++-- ppocr/metrics/e2e_metric.py | 17 +- ppocr/modeling/backbones/e2e_resnet_vd_pg.py | 4 +- ppocr/modeling/heads/e2e_pg_head.py | 4 +- ppocr/modeling/necks/pg_fpn.py | 5 +- ppocr/postprocess/pg_postprocess.py | 10 +- ppocr/utils/e2e_metric/Deteval.py | 175 ++----------------- ppocr/utils/e2e_utils/extract_textpoint.py | 28 +-- ppocr/utils/e2e_utils/ski_thin.py | 136 -------------- ppocr/utils/e2e_utils/visual.py | 4 +- tools/infer_e2e.py | 13 +- tools/program.py | 2 +- 20 files changed, 243 insertions(+), 479 deletions(-) create mode 100644 doc/doc_ch/e2e.md create mode 100644 doc/imgs_results/e2e_res_img623_pg.jpg delete mode 100644 ppocr/utils/e2e_utils/ski_thin.py diff --git a/configs/e2e/e2e_r50_vd_pg.yml b/configs/e2e/e2e_r50_vd_pg.yml index 235c62f9..22548a3c 100644 --- a/configs/e2e/e2e_r50_vd_pg.yml +++ b/configs/e2e/e2e_r50_vd_pg.yml @@ -1,14 +1,17 @@ Global: - use_gpu: False + use_gpu: True epoch_num: 600 log_smooth_window: 20 - print_batch_step: 2 + print_batch_step: 10 save_model_dir: ./output/pg_r50_vd_tt/ - save_epoch_step: 1 - # evaluation is run every 5000 iterationss after the 4000th iteration + save_epoch_step: 10 + # evaluation is run every 0 iterationss after the 1000th iteration eval_batch_step: [ 0, 1000 ] - # if pretrained_model is saved in static mode, load_static_weights must set to True - load_static_weights: False + # 1. If pretrained_model is saved in static mode, such as classification pretrained model + # from static branch, load_static_weights must be set as True. + # 2. If you want to finetune the pretrained models we provide in the docs, + # you should set load_static_weights as False. + load_static_weights: True cal_metric_during_train: False pretrained_model: checkpoints: @@ -19,7 +22,7 @@ Global: Architecture: model_type: e2e - algorithm: PG + algorithm: PGNet Transform: Backbone: name: ResNet @@ -34,28 +37,16 @@ Architecture: Loss: name: PGLoss -#Optimizer: -# name: Adam -# beta1: 0.9 -# beta2: 0.999 -# lr: -# name: Cosine -# learning_rate: 0.001 -# warmup_epoch: 1 -# regularizer: -# name: 'L2' -# factor: 0 - Optimizer: - name: RMSProp + name: Adam + beta1: 0.9 + beta2: 0.999 lr: - name: Piecewise learning_rate: 0.001 - decay_epochs: [ 40, 80, 120, 160, 200 ] - values: [ 0.001, 0.00033, 0.0001, 0.000033, 0.00001 ] regularizer: name: 'L2' - factor: 0.00005 + factor: 0 + PostProcess: name: PGPostProcess @@ -65,45 +56,45 @@ PostProcess: Metric: name: E2EMetric + Lexicon_Table: [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ] main_indicator: f_score_e2e Train: dataset: name: PGDateSet - label_file_list: - ratio_list: - data_format: textnet # textnet/partvgg - Lexicon_Table: [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ] + label_file_list: [./train_data/total_text/train/] + ratio_list: [1.0] + data_format: icdar transforms: - DecodeImage: # load image img_mode: BGR channel_first: False - PGProcessTrain: batch_size: 14 - data_format: icdar - tcl_len: 64 min_crop_size: 24 min_text_size: 4 max_text_size: 512 + Lexicon_Table: [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ] - KeepKeys: keep_keys: [ 'images', 'tcl_maps', 'tcl_label_maps', 'border_maps','direction_maps', 'training_masks', 'label_list', 'pos_list', 'pos_mask' ] # dataloader will return list in this order loader: shuffle: True drop_last: True - batch_size_per_card: 1 - num_workers: 8 + batch_size_per_card: 14 + num_workers: 16 Eval: dataset: - name: PGDateSet + name: PGDataSet data_dir: ./train_data/ - label_file_list: + label_file_list: [./train_data/total_text/test/] transforms: - DecodeImage: # load image img_mode: BGR channel_first: False - E2ELabelEncode: - label_list: [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ] + Lexicon_Table: [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ] + max_len: 50 - E2EResizeForTest: valid_set: totaltext max_side_len: 768 diff --git a/doc/doc_ch/e2e.md b/doc/doc_ch/e2e.md new file mode 100644 index 00000000..a0695697 --- /dev/null +++ b/doc/doc_ch/e2e.md @@ -0,0 +1,120 @@ +# 端到端文字识别 + +本节以partvgg/totaltext数据集为例,介绍PaddleOCR中端到端模型的训练、评估与测试。 + +## 数据准备 +支持两种不同的数据形式textnet / icdar ,分别为四点标注数据和十四点标注数据,十四点标注数据效果要比四点标注效果好 +###数据形式为textnet + +解压数据集和下载标注文件后,PaddleOCR/train_data/part_vgg_synth/train/ 有一个文件夹和一个文件,分别是: +``` +/PaddleOCR/train_data/part_vgg_synth/train/ + └─ image/ partvgg数据集的训练数据 + └─ train_annotation_info.txt partvgg数据集的测试标注 +``` + +提供的标注文件格式如下,中间用"\t"分隔: +``` +" 图像文件名 图像标注信息--四点标注 图像标注信息--识别标注 +119_nile_110_31 140.2 222.5 266.0 194.6 278.7 251.8 152.9 279.7 Path: 32.9 133.1 106.0 130.8 106.4 143.8 33.3 146.1 were 21.8 81.9 106.9 80.4 107.7 123.2 22.6 124.7 why +``` +标注文件txt当中,其中每一行代表一组数据,以第一行为例。第一个代表同级目录image/下面的文件名, 后面每9个代表一组标注信息,前8个代表文本框的四个点坐标(x,y),从左上角的点开始顺时针排列。 +最后一个代表文字的识别结果,**当其内容为“###”时,表示该文本框无效,在训练时会跳过。** + + +###数据形式为icdar +解压数据集和下载标注文件后,PaddleOCR/train_data/total_text/train/ 有两个文件夹,分别是: +``` +/PaddleOCR/train_data/total_text/train/ + └─ rgb/ total_text数据集的训练数据 + └─ poly/ total_text数据集的测试标注 +``` + +提供的标注文件格式如下,中间用"\t"分隔: +``` +" 图像标注信息--十四点标注数据 图像标注信息--识别标注 +1004.0,689.0,1019.0,698.0,1034.0,708.0,1049.0,718.0,1064.0,728.0,1079.0,738.0,1095.0,748.0,1094.0,774.0,1079.0,765.0,1065.0,756.0,1050.0,747.0,1036.0,738.0,1021.0,729.0,1007.0,721.0 EST +1102.0,755.0,1116.0,764.0,1131.0,773.0,1146.0,783.0,1161.0,792.0,1176.0,801.0,1191.0,811.0,1193.0,837.0,1178.0,828.0,1164.0,819.0,1150.0,810.0,1135.0,801.0,1121.0,792.0,1107.0,784.0 1972 +``` +标注文件当中,其中每一个txt文件代表一组数据,文件名同级目录rgb/下面的文件名。以第一行为例,前面28个代表文本框的十四个点坐标(x,y),从左上角的点开始顺时针排列。 +最后一个代表文字的识别结果,**当其内容为“###”时,表示该文本框无效,在训练时会跳过。** +如果您想在其他数据集上训练,可以按照上述形式构建标注文件。 + +## 快速启动训练 + +首先下载模型backbone的pretrain model,PaddleOCR的检测模型目前支持两种backbone,分别是MobileNetV3、ResNet_vd系列, +您可以根据需求使用[PaddleClas](https://github.com/PaddlePaddle/PaddleClas/tree/master/ppcls/modeling/architectures)中的模型更换backbone。 +```shell +cd PaddleOCR/ +下载ResNet50_vd的预训练模型 +wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_ssld_pretrained.tar + +# 解压预训练模型文件,以ResNet50_vd为例 +tar -xf ./pretrain_models/ResNet50_vd_ssld_pretrained.tar ./pretrain_models/ + +# 注:正确解压backbone预训练权重文件后,文件夹下包含众多以网络层命名的权重文件,格式如下: +./pretrain_models/ResNet50_vd_ssld_pretrained/ + └─ conv_last_bn_mean + └─ conv_last_bn_offset + └─ conv_last_bn_scale + └─ conv_last_bn_variance + └─ ...... + +``` + +#### 启动训练 + +*如果您安装的是cpu版本,请将配置文件中的 `use_gpu` 字段修改为false* + +```shell +# 单机单卡训练 e2e 模型 +python3 tools/train.py -c configs/e2e/e2e_r50_vd_pg.yml \ + -o Global.pretrain_weights=./pretrain_models/ResNet50_vd_ssld_pretrained/ Global.load_static_weights=True +# 单机多卡训练,通过 --gpus 参数设置使用的GPU ID +python3 -m paddle.distributed.launch --gpus '0,1,2,3' tools/train.py -c configs/e2e/e2e_r50_vd_pg.yml \ + -o Global.pretrain_weights=./pretrain_models/ResNet50_vd_ssld_pretrained/ Global.load_static_weights=True +``` + + +上述指令中,通过-c 选择训练使用configs/e2e/e2e_r50_vd_pg.yml配置文件。 +有关配置文件的详细解释,请参考[链接](./config.md)。 + +您也可以通过-o参数在不需要修改yml文件的情况下,改变训练的参数,比如,调整训练的学习率为0.0001 +```shell +python3 tools/train.py -c configs/e2e/e2e_r50_vd_pg.yml -o Optimizer.base_lr=0.0001 +``` + +#### 断点训练 + +如果训练程序中断,如果希望加载训练中断的模型从而恢复训练,可以通过指定Global.checkpoints指定要加载的模型路径: +```shell +python3 tools/train.py -c configs/e2e/e2e_r50_vd_pg.yml -o Global.checkpoints=./your/trained/model +``` + +**注意**:`Global.checkpoints`的优先级高于`Global.pretrain_weights`的优先级,即同时指定两个参数时,优先加载`Global.checkpoints`指定的模型,如果`Global.checkpoints`指定的模型路径有误,会加载`Global.pretrain_weights`指定的模型。 + +## 指标评估 + +PaddleOCR计算三个OCR端到端相关的指标,分别是:Precision、Recall、Hmean。 + +运行如下代码,根据配置文件`e2e_r50_vd_pg.yml`中`save_res_path`指定的测试集检测结果文件,计算评估指标。 + +评估时设置后处理参数`max_side_len=768`,使用不同数据集、不同模型训练,可调整参数进行优化 +训练中模型参数默认保存在`Global.save_model_dir`目录下。在评估指标时,需要设置`Global.checkpoints`指向保存的参数文件。 +```shell +python3 tools/eval.py -c configs/e2e/e2e_r50_vd_pg.yml -o Global.checkpoints="{path/to/weights}/best_accuracy" +``` + + + +## 测试端到端效果 + +测试单张图像的端到端识别效果 +```shell +python3 tools/infer_e2e.py -c configs/e2e/e2e_r50_vd_pg.yml -o Global.infer_img="./doc/imgs_en/img_10.jpg" Global.pretrained_model="./output/det_db/best_accuracy" Global.load_static_weights=false +``` + +测试文件夹下所有图像的端到端识别效果 +```shell +python3 tools/infer_e2e.py -c configs/e2e/e2e_r50_vd_pg.yml -o Global.infer_img="./doc/imgs_en/" Global.pretrained_model="./output/det_db/best_accuracy" Global.load_static_weights=false +``` diff --git a/doc/imgs_results/e2e_res_img623_pg.jpg b/doc/imgs_results/e2e_res_img623_pg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..84fca124363353313750984b4cf64ce2c2cad70b GIT binary patch literal 138845 zcmeFYcRZY3w>N%`!RVp|QAUEO(Zi^NBzn{!L6i_BQgot?k|4t9glLIQL> zG}KfyfByM1$lqTjAp?WSs37E!zqM$Tkp2f5LM!}`z8LX0)j%qGS_A0VDbt#Zr;++)Y8^5xnpW(e)pb* zy~9ICCuf&Oo?hNQzJAaB!(Y6Nh>Us_otTuIlA87=J>z{|enDYTaY<>_=jxg-wRQCk z9i3g>J*eKkuOp*lKgK71{+e7^Tw4CUvbu&|$L{X!9~>Uxj!*vZ1p>f-vqilAANgV+ z@HV?6M>|qnZ)K&YkIsR44_rdcwQPc1m7pV+_j!k725dd@>9C z*gvfO#o7Oiv9SM7oc)8bfATd6(11b2#RD?{aNvyV>}9K+%`eZT*3J5bxfnQGFxRXr zfq!EAK)2lfUNcrB-?8z{y1CB%FVmn*0LE1|!AhX?KBbhU!qd&~!!b#Z5cnibJmc@y zB{C(dJi_~+b6{P-*ZP>lLDG6FyzW8Pt1*o1IS^(==+LP<2VSzF(2GwD;3p>Ph;}iA zom4#>Om9uNI(7~mUu`}I6y0L8GZ_^O^Hcf)S0_WuvPt0cY0ytOHaMe5u5)0q=&z2U z=KyK_*^9RXXFJYwU}&%uv3olR^imlpSmMw=86opr#S(keoxOOqH2;iXHCc2H@Qs`U zo#p3%9sJ}n;@ERN2cKk(&lNmYD{@yI%sB@Z#?OIIX=fJ(@%0A=1noQm*RxYf#4yb{ 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%0D8%ZYA8O;+#=ewv>gAV^xwsED#574pM?R4Z+ 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%0D1jz2Peb6~u$S!Xd-2oaQtKM-n(g6z5te;c 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 resize_w: ratio = float(self.resize_long) / resize_h else: @@ -245,10 +243,8 @@ class E2EResizeForTest(object): return data def resize_image_for_totaltext(self, im, max_side_len=512): - """ - """ - h, w, _ = im.shape + h, w, _ = im.shape resize_w = w resize_h = h ratio = 1.25 diff --git a/ppocr/data/imaug/pg_process.py b/ppocr/data/imaug/pg_process.py index 60abf194..a496ed43 100644 --- a/ppocr/data/imaug/pg_process.py +++ b/ppocr/data/imaug/pg_process.py @@ -1,4 +1,4 @@ -# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve. +# copyright (c) 2021 PaddlePaddle Authors. All Rights Reserve. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,7 +15,6 @@ import math import cv2 import numpy as np -import os __all__ = ['PGProcessTrain'] @@ -23,15 +22,11 @@ __all__ = ['PGProcessTrain'] class PGProcessTrain(object): def __init__(self, batch_size=14, - data_format='icdar', - tcl_len=64, min_crop_size=24, min_text_size=10, max_text_size=512, **kwargs): self.batch_size = batch_size - self.data_format = data_format - self.tcl_len = tcl_len self.min_crop_size = min_crop_size self.min_text_size = min_text_size self.max_text_size = max_text_size @@ -60,24 +55,22 @@ class PGProcessTrain(object): """ point_num = poly.shape[0] min_area_quad = np.zeros((4, 2), dtype=np.float32) - if True: - rect = cv2.minAreaRect(poly.astype( - np.int32)) # (center (x,y), (width, height), angle of rotation) - center_point = rect[0] - box = np.array(cv2.boxPoints(rect)) - - first_point_idx = 0 - min_dist = 1e4 - for i in range(4): - dist = np.linalg.norm(box[(i + 0) % 4] - poly[0]) + \ - np.linalg.norm(box[(i + 1) % 4] - poly[point_num // 2 - 1]) + \ - np.linalg.norm(box[(i + 2) % 4] - poly[point_num // 2]) + \ - np.linalg.norm(box[(i + 3) % 4] - poly[-1]) - if dist < min_dist: - min_dist = dist - first_point_idx = i - for i in range(4): - min_area_quad[i] = box[(first_point_idx + i) % 4] + rect = cv2.minAreaRect(poly.astype( + np.int32)) # (center (x,y), (width, height), angle of rotation) + box = np.array(cv2.boxPoints(rect)) + + first_point_idx = 0 + min_dist = 1e4 + for i in range(4): + dist = np.linalg.norm(box[(i + 0) % 4] - poly[0]) + \ + np.linalg.norm(box[(i + 1) % 4] - poly[point_num // 2 - 1]) + \ + np.linalg.norm(box[(i + 2) % 4] - poly[point_num // 2]) + \ + np.linalg.norm(box[(i + 3) % 4] - poly[-1]) + if dist < min_dist: + min_dist = dist + first_point_idx = i + for i in range(4): + min_area_quad[i] = box[(first_point_idx + i) % 4] return min_area_quad @@ -235,8 +228,6 @@ class PGProcessTrain(object): ys, xs = np.where(tmp_image > 0) xy_text = np.array(list(zip(xs, ys)), dtype='float32') - # left_center_pt = np.array(key_point_xys[0]).reshape(1, 2) - # right_center_pt = np.array(key_point_xys[-1]).reshape(1, 2) left_center_pt = ( (min_area_quad[0] - min_area_quad[1]) / 2.0).reshape(1, 2) right_center_pt = ( @@ -317,16 +308,6 @@ class PGProcessTrain(object): average_height = max(sum(height_list) / len(height_list), 1.0) return average_height - def encode(self, text): - text_list = [] - for char in text: - if char not in self.dict: - continue - text_list.append([self.dict[char]]) - if len(text_list) == 0: - return None - return text_list - def generate_tcl_ctc_label(self, h, w, @@ -390,8 +371,6 @@ class PGProcessTrain(object): text_label = text_strs[poly_idx] text_label = self.prepare_text_label(text_label, self.Lexicon_Table) - # text = text.decode('utf-8') - # text_label_index_list = self.encode(text) text_label_index_list = [[self.Lexicon_Table.index(c_)] for c_ in text_label @@ -402,22 +381,18 @@ class PGProcessTrain(object): tcl_poly = self.poly2tcl(poly, tcl_ratio) tcl_quads = self.poly2quads(tcl_poly) poly_quads = self.poly2quads(poly) - # stcl map + stcl_quads, quad_index = self.shrink_poly_along_width( tcl_quads, shrink_ratio_of_width=shrink_ratio_of_width, expand_height_ratio=1.0 / tcl_ratio) - # generate tcl map + cv2.fillPoly(score_map, np.round(stcl_quads).astype(np.int32), 1.0) cv2.fillPoly(score_map_big, np.round(stcl_quads / ds_ratio).astype(np.int32), 1.0) - # generate tbo map - # tbo_tcl_poly = poly2tcl(poly, 0.5) - # tbo_tcl_quads = poly2quads(tbo_tcl_poly) - # for idx, quad in enumerate(tbo_tcl_quads): for idx, quad in enumerate(stcl_quads): quad_mask = np.zeros((h, w), dtype=np.float32) quad_mask = cv2.fillPoly( @@ -432,7 +407,6 @@ class PGProcessTrain(object): score_label_map_text_label_list.append(text_pos_list_) label_idx += 1 - # cv2.fillPoly(score_label_map, np.round(poly_quads[np.newaxis, :, :]).astype(np.int32), label_idx) cv2.fillPoly(score_label_map, np.round(poly_quads).astype(np.int32), label_idx) score_label_map_text_label_list.append(text_label_index_list) @@ -641,8 +615,6 @@ class PGProcessTrain(object): d = a1 * b2 - a2 * b1 if d == 0: - # print("line1", line1) - # print("line2", line2) print('Cross point does not exist') return np.array([0, 0], dtype=np.float32) else: diff --git a/ppocr/data/pgnet_dataset.py b/ppocr/data/pgnet_dataset.py index ed970d7e..2e0989fd 100644 --- a/ppocr/data/pgnet_dataset.py +++ b/ppocr/data/pgnet_dataset.py @@ -1,4 +1,4 @@ -# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve. +# copyright (c) 2021 PaddlePaddle Authors. All Rights Reserve. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -18,9 +18,9 @@ from .imaug import transform, create_operators import random -class PGDateSet(Dataset): +class PGDataSet(Dataset): def __init__(self, config, mode, logger, seed=None): - super(PGDateSet, self).__init__() + super(PGDataSet, self).__init__() self.logger = logger self.seed = seed @@ -81,7 +81,9 @@ class PGDateSet(Dataset): """ info_list = im_fn.split('\t') img_path = '' - for ext in ['.jpg', '.png', '.jpeg', '.JPG']: + for ext in [ + 'jpg', 'bmp', 'png', 'jpeg', 'rgb', 'tif', 'tiff', 'gif', 'JPG' + ]: if os.path.exists(os.path.join(img_dir, info_list[0] + ext)): img_path = os.path.join(img_dir, info_list[0] + ext) break @@ -111,11 +113,12 @@ class PGDateSet(Dataset): for idx, data_source in enumerate(file_list): image_files = [] if data_format == 'icdar': - image_files = [ - (data_source, x) - for x in os.listdir(os.path.join(data_source, 'rgb')) - if x.split('.')[-1] in ['jpg', 'png', 'jpeg', 'JPG'] - ] + image_files = [(data_source, x) for x in + os.listdir(os.path.join(data_source, 'rgb')) + if x.split('.')[-1] in [ + 'jpg', 'bmp', 'png', 'jpeg', 'rgb', 'tif', + 'tiff', 'gif', 'JPG' + ]] elif data_format == 'textnet': with open(data_source) as f: image_files = [(data_source, x.strip()) diff --git a/ppocr/losses/e2e_pg_loss.py b/ppocr/losses/e2e_pg_loss.py index 05480a9e..be4614e7 100644 --- a/ppocr/losses/e2e_pg_loss.py +++ b/ppocr/losses/e2e_pg_loss.py @@ -1,4 +1,4 @@ -# copyright (c) 2019 PaddlePaddle Authors. All Rights Reserve. +# copyright (c) 2021 PaddlePaddle Authors. All Rights Reserve. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -21,20 +21,12 @@ import paddle import numpy as np import copy -from .det_basic_loss import BalanceLoss, MaskL1Loss, DiceLoss +from .det_basic_loss import DiceLoss class PGLoss(nn.Layer): - """ - Differentiable Binarization (DB) Loss Function - args: - param (dict): the super paramter for DB Loss - """ - - def __init__(self, alpha=5, beta=10, eps=1e-6, **kwargs): + def __init__(self, eps=1e-6, **kwargs): super(PGLoss, self).__init__() - self.alpha = alpha - self.beta = beta self.dice_loss = DiceLoss(eps=eps) def org_tcl_rois(self, batch_size, pos_lists, pos_masks, label_lists): @@ -86,27 +78,30 @@ class PGLoss(nn.Layer): return pos_lists_, pos_masks_, label_lists_ def pre_process(self, label_list, pos_list, pos_mask): + max_len = 30 # the max texts in a single image + max_str_len = 50 # the max len in a single text + pad_num = 36 # padding num label_list = label_list.numpy() - b, h, w, c = label_list.shape + batch, _, _, _ = label_list.shape pos_list = pos_list.numpy() pos_mask = pos_mask.numpy() pos_list_t = [] pos_mask_t = [] label_list_t = [] - for i in range(b): - for j in range(30): + for i in range(batch): + for j in range(max_len): if pos_mask[i, j].any(): pos_list_t.append(pos_list[i][j]) pos_mask_t.append(pos_mask[i][j]) label_list_t.append(label_list[i][j]) pos_list, pos_mask, label_list = self.org_tcl_rois( - b, pos_list_t, pos_mask_t, label_list_t) + batch, pos_list_t, pos_mask_t, label_list_t) label = [] tt = [l.tolist() for l in label_list] - for i in range(64): + for i in range(batch): k = 0 - for j in range(50): - if tt[i][j][0] != 36: + for j in range(max_str_len): + if tt[i][j][0] != pad_num: k += 1 else: break diff --git a/ppocr/metrics/e2e_metric.py b/ppocr/metrics/e2e_metric.py index 45248b91..c6cd1db9 100644 --- a/ppocr/metrics/e2e_metric.py +++ b/ppocr/metrics/e2e_metric.py @@ -1,4 +1,4 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -22,12 +22,9 @@ from ppocr.utils.e2e_metric.Deteval import * class E2EMetric(object): - def __init__(self, main_indicator='f_score_e2e', **kwargs): - self.label_list = [ - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', - 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' - ] + def __init__(self, Lexicon_Table, main_indicator='f_score_e2e', **kwargs): + self.label_list = Lexicon_Table + self.max_index = len(self.label_list) self.main_indicator = main_indicator self.reset() @@ -40,12 +37,12 @@ class E2EMetric(object): for temp_list in temp_gt_strs_batch: t = "" for index in temp_list: - if index < 36: + if index < self.max_index: t += self.label_list[index] gt_strs_batch.append(t) for pred, gt_polyons, gt_strs, ignore_tags in zip( - preds, gt_polyons_batch, gt_strs_batch, ignore_tags_batch): + [preds], gt_polyons_batch, [gt_strs_batch], ignore_tags_batch): # prepare gt gt_info_list = [{ 'points': gt_polyon, @@ -57,7 +54,7 @@ class E2EMetric(object): e2e_info_list = [{ 'points': det_polyon, 'text': pred_str - } for det_polyon, pred_str in zip(pred['points'], preds['strs'])] + } for det_polyon, pred_str in zip(pred['points'], pred['strs'])] result = get_socre(gt_info_list, e2e_info_list) self.results.append(result) diff --git a/ppocr/modeling/backbones/e2e_resnet_vd_pg.py b/ppocr/modeling/backbones/e2e_resnet_vd_pg.py index 8e3697ec..97afd346 100644 --- a/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +++ b/ppocr/modeling/backbones/e2e_resnet_vd_pg.py @@ -1,4 +1,4 @@ -# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve. +# copyright (c) 2021 PaddlePaddle Authors. All Rights Reserve. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -62,8 +62,6 @@ class ConvBNLayer(nn.Layer): moving_variance_name=bn_name + '_variance') def forward(self, inputs): - # if self.is_vd_mode: - # inputs = self._pool2d_avg(inputs) y = self._conv(inputs) y = self._batch_norm(y) return y diff --git a/ppocr/modeling/heads/e2e_pg_head.py b/ppocr/modeling/heads/e2e_pg_head.py index 41ead8e8..106cdfa6 100644 --- a/ppocr/modeling/heads/e2e_pg_head.py +++ b/ppocr/modeling/heads/e2e_pg_head.py @@ -1,4 +1,4 @@ -# copyright (c) 2019 PaddlePaddle Authors. All Rights Reserve. +# copyright (c) 2021 PaddlePaddle Authors. All Rights Reserve. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -179,7 +179,7 @@ class PGHead(nn.Layer): name="conv_f_char{}".format(5)) self.conv3 = nn.Conv2D( in_channels=256, - out_channels=6625, + out_channels=37, kernel_size=3, stride=1, padding=1, diff --git a/ppocr/modeling/necks/pg_fpn.py b/ppocr/modeling/necks/pg_fpn.py index ba14c1b2..3f64539f 100644 --- a/ppocr/modeling/necks/pg_fpn.py +++ b/ppocr/modeling/necks/pg_fpn.py @@ -1,4 +1,4 @@ -# copyright (c) 2019 PaddlePaddle Authors. All Rights Reserve. +# copyright (c) 2021 PaddlePaddle Authors. All Rights Reserve. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -60,8 +60,6 @@ class ConvBNLayer(nn.Layer): use_global_stats=False) def forward(self, inputs): - # if self.is_vd_mode: - # inputs = self._pool2d_avg(inputs) y = self._conv(inputs) y = self._batch_norm(y) return y @@ -112,7 +110,6 @@ class PGFPN(nn.Layer): num_inputs = [2048, 2048, 1024, 512, 256] num_outputs = [256, 256, 192, 192, 128] self.out_channels = 128 - # print(in_channels) self.conv_bn_layer_1 = ConvBNLayer( in_channels=3, out_channels=32, diff --git a/ppocr/postprocess/pg_postprocess.py b/ppocr/postprocess/pg_postprocess.py index 1b340b42..1f1ab60e 100644 --- a/ppocr/postprocess/pg_postprocess.py +++ b/ppocr/postprocess/pg_postprocess.py @@ -1,4 +1,4 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -23,14 +23,9 @@ __dir__ = os.path.dirname(__file__) sys.path.append(__dir__) sys.path.append(os.path.join(__dir__, '..')) -import numpy as np -from .locality_aware_nms import nms_locality from ppocr.utils.e2e_utils.extract_textpoint import * -from ppocr.utils.e2e_utils.ski_thin import * from ppocr.utils.e2e_utils.visual import * import paddle -import cv2 -import time class PGPostProcess(object): @@ -115,7 +110,6 @@ class PGPostProcess(object): if len(yx_center_line) == 1: yx_center_line.append(yx_center_line[-1]) - # expand corresponding offset for total-text. offset_expand = 1.0 if self.valid_set == 'totaltext': offset_expand = 1.2 @@ -137,7 +131,6 @@ class PGPostProcess(object): [ratio_w, ratio_h]).reshape(-1, 2) point_pair_list.append(point_pair) - # for visualization all_point_list.append([ int(round(x * 4.0 / ratio_w)), int(round(y * 4.0 / ratio_h)) @@ -145,7 +138,6 @@ class PGPostProcess(object): all_point_pair_list.append(point_pair.round().astype(np.int32) .tolist()) - # ndarry: (x, 2) detected_poly, pair_length_info = point_pair2poly(point_pair_list) detected_poly = expand_poly_along_width( detected_poly, shrink_ratio_of_width=0.2) diff --git a/ppocr/utils/e2e_metric/Deteval.py b/ppocr/utils/e2e_metric/Deteval.py index 8337e539..37fa5c00 100755 --- a/ppocr/utils/e2e_metric/Deteval.py +++ b/ppocr/utils/e2e_metric/Deteval.py @@ -1,4 +1,4 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -11,42 +11,27 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + import numpy as np from ppocr.utils.e2e_metric.polygon_fast import iod, area_of_intersection, area -try: # python2 - range = xrange -except Exception: - # python3 - range = range -""" -Input format: y0,x0, ..... yn,xn. Each detection is separated by the end of line token ('\n')' -""" - -# if len(sys.argv) != 4: -# print('\n usage: test.py pred_dir gt_dir savefile') -# sys.exit() - def get_socre(gt_dict, pred_dict): - # allInputs = listdir(input_dir) allInputs = 1 - def input_reading_mod(pred_dict, input): + def input_reading_mod(pred_dict): """This helper reads input from txt files""" det = [] n = len(pred_dict) for i in range(n): points = pred_dict[i]['points'] text = pred_dict[i]['text'] - # for i in range(len(points)): point = ",".join(map(str, points.reshape(-1, ))) det.append([point, text]) return det - def gt_reading_mod(gt_dict, gt_id): + def gt_reading_mod(gt_dict): """This helper reads groundtruths from mat files""" - # gt_id = gt_id.split('.')[0] gt = [] n = len(gt_dict) for i in range(n): @@ -74,23 +59,12 @@ def get_socre(gt_dict, pred_dict): def detection_filtering(detections, groundtruths, threshold=0.5): for gt_id, gt in enumerate(groundtruths): - print - "liushanshan gt[1] = {}".format(gt[1]) - print - "liushanshan gt[2] = {}".format(gt[2]) - print - "liushanshan gt[3] = {}".format(gt[3]) - print - "liushanshan gt[4] = {}".format(gt[4]) - print - "liushanshan gt[5] = {}".format(gt[5]) if (gt[5] == '#') and (gt[1].shape[1] > 1): gt_x = list(map(int, np.squeeze(gt[1]))) gt_y = list(map(int, np.squeeze(gt[3]))) for det_id, detection in enumerate(detections): detection_orig = detection detection = [float(x) for x in detection[0].split(',')] - # detection = detection.split(',') detection = list(map(int, detection)) det_x = detection[0::2] det_y = detection[1::2] @@ -105,18 +79,10 @@ def get_socre(gt_dict, pred_dict): """ sigma = inter_area / gt_area """ - # print(area_of_intersection(det_x, det_y, gt_x, gt_y)) return np.round((area_of_intersection(det_x, det_y, gt_x, gt_y) / area(gt_x, gt_y)), 2) def tau_calculation(det_x, det_y, gt_x, gt_y): - """ - tau = inter_area / det_area - """ - # print "liushanshan det_x {}".format(det_x) - # print "liushanshan det_y {}".format(det_y) - # print "liushanshan area {}".format(area(det_x, det_y)) - # print "liushanshan tau = {}".format(np.round((area_of_intersection(det_x, det_y, gt_x, gt_y) / area(det_x, det_y)), 2)) if area(det_x, det_y) == 0.0: return 0 return np.round((area_of_intersection(det_x, det_y, gt_x, gt_y) / @@ -141,10 +107,8 @@ def get_socre(gt_dict, pred_dict): input_id != 'Pascal_result_curved.txt') and (input_id != 'Pascal_result_non_curved.txt') and ( input_id != 'Deteval_result.txt') and (input_id != 'Deteval_result_curved.txt') \ and (input_id != 'Deteval_result_non_curved.txt'): - print(input_id) - detections = input_reading_mod(pred_dict, input_id) - # print "liushanshan detections = {}".format(detections) - groundtruths = gt_reading_mod(gt_dict, input_id) + detections = input_reading_mod(pred_dict) + groundtruths = gt_reading_mod(gt_dict) detections = detection_filtering( detections, groundtruths) # filters detections overlapping with DC area @@ -187,10 +151,6 @@ def get_socre(gt_dict, pred_dict): global_tau.append(local_tau_table) global_pred_str.append(local_pred_str) global_gt_str.append(local_gt_str) - print - "liushanshan global_pred_str = {}".format(global_pred_str) - print - "liushanshan global_gt_str = {}".format(global_gt_str) global_accumulative_recall = 0 global_accumulative_precision = 0 @@ -236,17 +196,11 @@ def get_socre(gt_dict, pred_dict): gt_flag[0, gt_id] = 1 matched_det_id = np.where(local_sigma_table[gt_id, :] > tr) # recg start - print - "liushanshan one to one det_id = {}".format(matched_det_id) - print - "liushanshan one to one gt_id = {}".format(gt_id) + gt_str_cur = global_gt_str[idy][gt_id] pred_str_cur = global_pred_str[idy][matched_det_id[0].tolist()[ 0]] - print - "liushanshan one to one gt_str_cur = {}".format(gt_str_cur) - print - "liushanshan one to one pred_str_cur = {}".format(pred_str_cur) + if pred_str_cur == gt_str_cur: hit_str_num += 1 else: @@ -290,20 +244,10 @@ def get_socre(gt_dict, pred_dict): gt_flag[0, gt_id] = 1 det_flag[0, qualified_tau_candidates] = 1 # recg start - print - "liushanshan one to many det_id = {}".format( - qualified_tau_candidates) - print - "liushanshan one to many gt_id = {}".format(gt_id) gt_str_cur = global_gt_str[idy][gt_id] pred_str_cur = global_pred_str[idy][ qualified_tau_candidates[0].tolist()[0]] - print - "liushanshan one to many gt_str_cur = {}".format( - gt_str_cur) - print - "liushanshan one to many pred_str_cur = {}".format( - pred_str_cur) + if pred_str_cur == gt_str_cur: hit_str_num += 1 else: @@ -315,19 +259,11 @@ def get_socre(gt_dict, pred_dict): gt_flag[0, gt_id] = 1 det_flag[0, qualified_tau_candidates] = 1 # recg start - print - "liushanshan one to many det_id = {}".format( - qualified_tau_candidates) - print - "liushanshan one to many gt_id = {}".format(gt_id) + gt_str_cur = global_gt_str[idy][gt_id] pred_str_cur = global_pred_str[idy][ qualified_tau_candidates[0].tolist()[0]] - print - "liushanshan one to many gt_str_cur = {}".format(gt_str_cur) - print - "liushanshan one to many pred_str_cur = {}".format( - pred_str_cur) + if pred_str_cur == gt_str_cur: hit_str_num += 1 else: @@ -377,25 +313,14 @@ def get_socre(gt_dict, pred_dict): gt_flag[0, qualified_sigma_candidates] = 1 det_flag[0, det_id] = 1 # recg start - print - "liushanshan many to one det_id = {}".format(det_id) - print - "liushanshan many to one gt_id = {}".format( - qualified_sigma_candidates) pred_str_cur = global_pred_str[idy][det_id] gt_len = len(qualified_sigma_candidates[0]) for idx in range(gt_len): ele_gt_id = qualified_sigma_candidates[0].tolist()[ idx] - if not global_gt_str[idy].has_key(ele_gt_id): + if ele_gt_id not in global_gt_str[idy]: continue gt_str_cur = global_gt_str[idy][ele_gt_id] - print - "liushanshan many to one gt_str_cur = {}".format( - gt_str_cur) - print - "liushanshan many to one pred_str_cur = {}".format( - pred_str_cur) if pred_str_cur == gt_str_cur: hit_str_num += 1 break @@ -409,24 +334,14 @@ def get_socre(gt_dict, pred_dict): det_flag[0, det_id] = 1 gt_flag[0, qualified_sigma_candidates] = 1 # recg start - print - "liushanshan many to one det_id = {}".format(det_id) - print - "liushanshan many to one gt_id = {}".format( - qualified_sigma_candidates) + pred_str_cur = global_pred_str[idy][det_id] gt_len = len(qualified_sigma_candidates[0]) for idx in range(gt_len): ele_gt_id = qualified_sigma_candidates[0].tolist()[idx] - if not global_gt_str[idy].has_key(ele_gt_id): + if ele_gt_id not in global_gt_str[idy]: continue gt_str_cur = global_gt_str[idy][ele_gt_id] - print - "liushanshan many to one gt_str_cur = {}".format( - gt_str_cur) - print - "liushanshan many to one pred_str_cur = {}".format( - pred_str_cur) if pred_str_cur == gt_str_cur: hit_str_num += 1 break @@ -434,9 +349,6 @@ def get_socre(gt_dict, pred_dict): if pred_str_cur.lower() == gt_str_cur.lower(): hit_str_num += 1 break - else: - print - 'no match' # recg end global_accumulative_recall = global_accumulative_recall + num_qualified_sigma_candidates * fsc_k @@ -448,7 +360,6 @@ def get_socre(gt_dict, pred_dict): single_data = {} for idx in range(len(global_sigma)): - # print(allInputs[idx]) local_sigma_table = global_sigma[idx] local_tau_table = global_tau[idx] @@ -504,8 +415,6 @@ def get_socre(gt_dict, pred_dict): except ZeroDivisionError: local_f_score = 0 - # temp = ('%s: Recall=%.4f, Precision=%.4f, f_score=%.4f\n' % ( - # allInputs[idx], local_recall, local_precision, local_f_score)) single_data['sigma'] = global_sigma single_data['global_tau'] = global_tau single_data['global_pred_str'] = global_pred_str @@ -575,17 +484,9 @@ def combine_results(all_data): gt_flag[0, gt_id] = 1 matched_det_id = np.where(local_sigma_table[gt_id, :] > tr) # recg start - print - "liushanshan one to one det_id = {}".format(matched_det_id) - print - "liushanshan one to one gt_id = {}".format(gt_id) gt_str_cur = global_gt_str[idy][gt_id] pred_str_cur = global_pred_str[idy][matched_det_id[0].tolist()[ 0]] - print - "liushanshan one to one gt_str_cur = {}".format(gt_str_cur) - print - "liushanshan one to one pred_str_cur = {}".format(pred_str_cur) if pred_str_cur == gt_str_cur: hit_str_num += 1 else: @@ -629,20 +530,9 @@ def combine_results(all_data): gt_flag[0, gt_id] = 1 det_flag[0, qualified_tau_candidates] = 1 # recg start - print - "liushanshan one to many det_id = {}".format( - qualified_tau_candidates) - print - "liushanshan one to many gt_id = {}".format(gt_id) gt_str_cur = global_gt_str[idy][gt_id] pred_str_cur = global_pred_str[idy][ qualified_tau_candidates[0].tolist()[0]] - print - "liushanshan one to many gt_str_cur = {}".format( - gt_str_cur) - print - "liushanshan one to many pred_str_cur = {}".format( - pred_str_cur) if pred_str_cur == gt_str_cur: hit_str_num += 1 else: @@ -654,19 +544,9 @@ def combine_results(all_data): gt_flag[0, gt_id] = 1 det_flag[0, qualified_tau_candidates] = 1 # recg start - print - "liushanshan one to many det_id = {}".format( - qualified_tau_candidates) - print - "liushanshan one to many gt_id = {}".format(gt_id) gt_str_cur = global_gt_str[idy][gt_id] pred_str_cur = global_pred_str[idy][ qualified_tau_candidates[0].tolist()[0]] - print - "liushanshan one to many gt_str_cur = {}".format(gt_str_cur) - print - "liushanshan one to many pred_str_cur = {}".format( - pred_str_cur) if pred_str_cur == gt_str_cur: hit_str_num += 1 else: @@ -716,11 +596,6 @@ def combine_results(all_data): gt_flag[0, qualified_sigma_candidates] = 1 det_flag[0, det_id] = 1 # recg start - print - "liushanshan many to one det_id = {}".format(det_id) - print - "liushanshan many to one gt_id = {}".format( - qualified_sigma_candidates) pred_str_cur = global_pred_str[idy][det_id] gt_len = len(qualified_sigma_candidates[0]) for idx in range(gt_len): @@ -729,12 +604,6 @@ def combine_results(all_data): if ele_gt_id not in global_gt_str[idy]: continue gt_str_cur = global_gt_str[idy][ele_gt_id] - print - "liushanshan many to one gt_str_cur = {}".format( - gt_str_cur) - print - "liushanshan many to one pred_str_cur = {}".format( - pred_str_cur) if pred_str_cur == gt_str_cur: hit_str_num += 1 break @@ -748,24 +617,13 @@ def combine_results(all_data): det_flag[0, det_id] = 1 gt_flag[0, qualified_sigma_candidates] = 1 # recg start - print - "liushanshan many to one det_id = {}".format(det_id) - print - "liushanshan many to one gt_id = {}".format( - qualified_sigma_candidates) pred_str_cur = global_pred_str[idy][det_id] gt_len = len(qualified_sigma_candidates[0]) for idx in range(gt_len): ele_gt_id = qualified_sigma_candidates[0].tolist()[idx] - if not global_gt_str[idy].has_key(ele_gt_id): + if ele_gt_id not in global_gt_str[idy]: continue gt_str_cur = global_gt_str[idy][ele_gt_id] - print - "liushanshan many to one gt_str_cur = {}".format( - gt_str_cur) - print - "liushanshan many to one pred_str_cur = {}".format( - pred_str_cur) if pred_str_cur == gt_str_cur: hit_str_num += 1 break @@ -773,9 +631,6 @@ def combine_results(all_data): if pred_str_cur.lower() == gt_str_cur.lower(): hit_str_num += 1 break - else: - print - 'no match' # recg end global_accumulative_recall = global_accumulative_recall + num_qualified_sigma_candidates * fsc_k diff --git a/ppocr/utils/e2e_utils/extract_textpoint.py b/ppocr/utils/e2e_utils/extract_textpoint.py index 1665c7ef..2d793aa9 100644 --- a/ppocr/utils/e2e_utils/extract_textpoint.py +++ b/ppocr/utils/e2e_utils/extract_textpoint.py @@ -1,4 +1,4 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -16,14 +16,12 @@ from __future__ import absolute_import from __future__ import division from __future__ import print_function -import os import cv2 -import time import math import numpy as np from itertools import groupby -from ppocr.utils.e2e_utils.ski_thin import thin +from skimage.morphology._skeletonize import thin def softmax(logits): @@ -518,28 +516,6 @@ def generate_pivot_list_tt_inference(p_score, continue pos_list_sorted = sort_and_expand_with_direction_v2( pos_list, f_direction, p_tcl_map) - # pos_list_sorted, _ = sort_with_direction(pos_list, f_direction) pos_list_sorted_with_id = add_id(pos_list_sorted, image_id=image_id) all_pos_yxs.append(pos_list_sorted_with_id) return all_pos_yxs - - -if __name__ == '__main__': - np.random.seed(0) - import time - - logits_map = np.random.random([10, 20, 33]) - # a list of [x, y] - instance_gather_info_1 = [(2, 3), (2, 4), (3, 5)] - instance_gather_info_2 = [(15, 6), (15, 7), (18, 8)] - instance_gather_info_3 = [(8, 8), (8, 8), (8, 8)] - gather_info_list = [ - instance_gather_info_1, instance_gather_info_2, instance_gather_info_3 - ] - - time0 = time.time() - res = ctc_decoder_for_image( - gather_info_list, logits_map, keep_blank_in_idxs=True) - print(res) - print('cost {}'.format(time.time() - time0)) - print('--' * 20) diff --git a/ppocr/utils/e2e_utils/ski_thin.py b/ppocr/utils/e2e_utils/ski_thin.py deleted file mode 100644 index 6b1e5c78..00000000 --- a/ppocr/utils/e2e_utils/ski_thin.py +++ /dev/null @@ -1,136 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import numpy as np -from scipy import ndimage as ndi - -G123_LUT = np.array( - [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, - 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, - 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0 - ], - dtype=np.bool) - -G123P_LUT = np.array( - [ - 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, - 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - ], - dtype=np.bool) - - -def thin(image, max_iter=None): - """ - Perform morphological thinning of a binary image. - Parameters - ---------- - image : binary (M, N) ndarray - The image to be thinned. - max_iter : int, number of iterations, optional - Regardless of the value of this parameter, the thinned image - is returned immediately if an iteration produces no change. - If this parameter is specified it thus sets an upper bound on - the number of iterations performed. - Returns - ------- - out : ndarray of bool - Thinned image. - See also - -------- - skeletonize, medial_axis - Notes - ----- - This algorithm [1]_ works by making multiple passes over the image, - removing pixels matching a set of criteria designed to thin - connected regions while preserving eight-connected components and - 2 x 2 squares [2]_. In each of the two sub-iterations the algorithm - correlates the intermediate skeleton image with a neighborhood mask, - then looks up each neighborhood in a lookup table indicating whether - the central pixel should be deleted in that sub-iteration. - References - ---------- - .. [1] Z. Guo and R. W. Hall, "Parallel thinning with - two-subiteration algorithms," Comm. ACM, vol. 32, no. 3, - pp. 359-373, 1989. :DOI:`10.1145/62065.62074` - .. [2] Lam, L., Seong-Whan Lee, and Ching Y. Suen, "Thinning - Methodologies-A Comprehensive Survey," IEEE Transactions on - Pattern Analysis and Machine Intelligence, Vol 14, No. 9, - p. 879, 1992. :DOI:`10.1109/34.161346` - Examples - -------- - >>> square = np.zeros((7, 7), dtype=np.uint8) - >>> square[1:-1, 2:-2] = 1 - >>> square[0, 1] = 1 - >>> square - array([[0, 1, 0, 0, 0, 0, 0], - [0, 0, 1, 1, 1, 0, 0], - [0, 0, 1, 1, 1, 0, 0], - [0, 0, 1, 1, 1, 0, 0], - [0, 0, 1, 1, 1, 0, 0], - [0, 0, 1, 1, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 0]], dtype=uint8) - >>> skel = thin(square) - >>> skel.astype(np.uint8) - array([[0, 1, 0, 0, 0, 0, 0], - [0, 0, 1, 0, 0, 0, 0], - [0, 0, 0, 1, 0, 0, 0], - [0, 0, 0, 1, 0, 0, 0], - [0, 0, 0, 1, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0]], dtype=uint8) - """ - # convert image to uint8 with values in {0, 1} - skel = np.asanyarray(image, dtype=bool).astype(np.uint8) - - # neighborhood mask - mask = np.array([[8, 4, 2], [16, 0, 1], [32, 64, 128]], dtype=np.uint8) - - # iterate until convergence, up to the iteration limit - max_iter = max_iter or np.inf - n_iter = 0 - n_pts_old, n_pts_new = np.inf, np.sum(skel) - while n_pts_old != n_pts_new and n_iter < max_iter: - n_pts_old = n_pts_new - - # perform the two "subiterations" described in the paper - for lut in [G123_LUT, G123P_LUT]: - # correlate image with neighborhood mask - N = ndi.correlate(skel, mask, mode='constant') - # take deletion decision from this subiteration's LUT - D = np.take(lut, N) - # perform deletion - skel[D] = 0 - - n_pts_new = np.sum(skel) # count points after thinning - n_iter += 1 - - return skel.astype(np.bool) diff --git a/ppocr/utils/e2e_utils/visual.py b/ppocr/utils/e2e_utils/visual.py index 6be2107f..6f8a429e 100644 --- a/ppocr/utils/e2e_utils/visual.py +++ b/ppocr/utils/e2e_utils/visual.py @@ -1,4 +1,4 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -50,7 +50,7 @@ def resize_image(im, max_side_len=512): def resize_image_min(im, max_side_len=512): """ """ - print('--> Using resize_image_min') + # print('--> Using resize_image_min') h, w, _ = im.shape resize_w = w diff --git a/tools/infer_e2e.py b/tools/infer_e2e.py index 9dcde8a9..c40b8e02 100755 --- a/tools/infer_e2e.py +++ b/tools/infer_e2e.py @@ -45,8 +45,14 @@ def draw_e2e_res(dt_boxes, strs, config, img, img_name): for box, str in zip(dt_boxes, strs): box = box.astype(np.int32).reshape((-1, 1, 2)) cv2.polylines(src_im, [box], True, color=(255, 255, 0), thickness=2) - cv2.putText(src_im, str, org=(int(box[0, 0, 0]), int(box[0, 0, 1])), - fontFace=cv2.FONT_HERSHEY_COMPLEX, fontScale=0.7, color=(0, 255, 0), thickness=1) + cv2.putText( + src_im, + str, + org=(int(box[0, 0, 0]), int(box[0, 0, 1])), + fontFace=cv2.FONT_HERSHEY_COMPLEX, + fontScale=0.7, + color=(0, 255, 0), + thickness=1) save_det_path = os.path.dirname(config['Global'][ 'save_res_path']) + "/e2e_results/" if not os.path.exists(save_det_path): @@ -55,6 +61,7 @@ def draw_e2e_res(dt_boxes, strs, config, img, img_name): cv2.imwrite(save_path, src_im) logger.info("The e2e Image saved in {}".format(save_path)) + def main(): global_config = config['Global'] @@ -111,4 +118,4 @@ def main(): if __name__ == '__main__': config, device, logger, vdl_writer = program.preprocess() - main() \ No newline at end of file + main() diff --git a/tools/program.py b/tools/program.py index f0e2aa08..28e541db 100755 --- a/tools/program.py +++ b/tools/program.py @@ -375,7 +375,7 @@ def preprocess(is_train=False): alg = config['Architecture']['algorithm'] assert alg in [ 'EAST', 'DB', 'SAST', 'Rosetta', 'CRNN', 'STARNet', 'RARE', 'SRN', - 'CLS', 'PG' + 'CLS', 'PGNet' ] device = 'gpu:{}'.format(dist.ParallelEnv().dev_id) if use_gpu else 'cpu' -- GitLab