PaddlePaddle / PaddleOCR

Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)
https://paddlepaddle.github.io/PaddleOCR/
Apache License 2.0
44.39k stars 7.83k forks source link

PaddleOCR v3.0 文本识别数据加载 #6262

Closed lyc728 closed 1 year ago

lyc728 commented 2 years ago

你好,我看了目前支持ch_PP-OCRv3_lmdb.yaml 中的LMDBDataSet 但是没有具体的操作文档,能不能说明下具体应该怎么操作去训练

andyjiang1116 commented 2 years ago

PP-OCRv3文本识别目前还不支持LMDBDataSet 数据集哈,可以用SimpleDataset

lyc728 commented 2 years ago

麻烦更正下说明文档,我是看到可以加载的,请不要混淆视听,谢谢!

andyjiang1116 commented 2 years ago

好的,感谢反馈~

lyc728 commented 2 years ago

大佬,你好,svtr模型有更新相应的torch框架吗?有考虑更新吗?

lyc728 commented 2 years ago
企业微信截图_1652691611944

无法正常返回识别结果

andyjiang1116 commented 2 years ago

暂时没有torch框架的,可以自己进行复现哈

andyjiang1116 commented 2 years ago
企业微信截图_1652691611944

无法正常返回识别结果

请提供一下完整命令哈,用的什么模型,什么指令

lyc728 commented 2 years ago

python3 -m paddle.distributed.launch --gpus '6,7' tools/train.py -c configs/rec/rec_svtrnet.yml 训练命令 python3 tools/infer_rec.py -c configs/rec/rec_svtrnet.yml -o Global.pretrained_model=./output/rec/svtr/best_accuracy Global.infer_img=./doc/sign/hw-126.jpg预测命令

andyjiang1116 commented 2 years ago

模型训练完成后的评估精度能有多少?

Topdu commented 2 years ago

python3 -m paddle.distributed.launch --gpus '6,7' tools/train.py -c configs/rec/rec_svtrnet.yml 训练命令 python3 tools/infer_rec.py -c configs/rec/rec_svtrnet.yml -o Global.pretrained_model=./output/rec/svtr/best_accuracy Global.infer_img=./doc/sign/hw-126.jpg预测命令

训练命令没有问题,保证数据集和字典相配且模型训练正常收敛, 预测命令没有问题,如果没有给出相应的结果,请检查预测的图片是否和训练数据是同源的,且训练收敛

lyc728 commented 2 years ago

best metric, acc: 0.8760898118888819, norm_edit_dis: 0.9499456137766249, fps: 3656.6885505329565, best_epoch: 20 字典没有在配置文件里面。怎么看使用的那个配置文件

Topdu commented 2 years ago

配置文件中这两个控制字典,请在训练的时候和预测的时候保证字典一致

  character_dict_path:
  character_type: en

字典的具体说明请参考:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/doc/doc_ch/recognition.md#14-%E5%AD%97%E5%85%B8

lyc728 commented 2 years ago

在训练svtr模型可以用 LMDBDataSet形式,但是怎么加载多个这种数据集呢?

Topdu commented 2 years ago

在训练svtr模型可以用 LMDBDataSet形式,但是怎么加载多个这种数据集呢?

把每个数据集放在同一个文件夹a下,data_dir设置为文件夹a即可

lyc728 commented 2 years ago

SVTR模型现在可以部署成trt进行推理吗?

lyc728 commented 2 years ago

大佬,你好,我在模型预测时,python3 tools/infer_rec.py -c configs/rec/rec_svtrnet.yml -o Global.pretrained_model=./output/rec/svtr/best_accuracy Global.infer_img='/data/liuyuanchao/PaddleOCR/doc/sign/hw-136.jpg' 效果很差,但是将模型进行Python推理时,python3 tools/infer/predict_rec.py --image_dir='./doc/sign/hw-136.jpg' --rec_model_dir='./inference/rec_svtr_tiny_stn_en1/' --rec_algorithm='SVTR' --rec_image_shape='3,32,512' --rec_char_dict_path='./ppocr/utils/ppocr_keys_v1.txt' 效果好了很多,这是什么原因造成的呢?

Topdu commented 2 years ago

如果方便的话请提供一下训练配置,训练样本示例,测试样本示例和字典

lyc728 commented 2 years ago

Global: use_gpu: True epoch_num: 100 log_smooth_window: 20 print_batch_step: 10 save_model_dir: ./output/rec/svtr/ save_epoch_step: 1

evaluation is run every 2000 iterations after the 0th iteration

eval_batch_step: [0, 2000] cal_metric_during_train: True pretrained_model: checkpoints: save_inference_dir: use_visualdl: False infer_img: doc/imgs_words_en/word_10.png

for data or label process

character_dict_path: ppocr/utils/ppocr_keys_v1.txt character_type: ch max_text_length: 25 infer_mode: False use_space_char: False save_res_path: ./output/rec/predicts_svtr_tiny.txt

Optimizer: name: AdamW beta1: 0.9 beta2: 0.99 epsilon: 0.00000008 weight_decay: 0.05 no_weight_decay_name: norm pos_embed one_dim_param_no_weight_decay: true lr: name: Cosine learning_rate: 0.0005 warmup_epoch: 2

Architecture: model_type: rec algorithm: SVTR Transform: name: STN_ON tps_inputsize: [32, 64] tps_outputsize: [32, 100] num_control_points: 20 tps_margins: [0.05,0.05] stn_activation: none Backbone: name: SVTRNet img_size: [32, 100] out_char_num: 25 out_channels: 192 patch_merging: 'Conv' embed_dim: [64, 128, 256] depth: [3, 6, 3] num_heads: [2, 4, 8] mixer: ['Local','Local','Local','Local','Local','Local','Global','Global','Global','Global','Global','Global'] local_mixer: [[7, 11], [7, 11], [7, 11]] last_stage: True prenorm: false Neck: name: SequenceEncoder encoder_type: reshape Head: name: CTCHead

Loss: name: CTCLoss

PostProcess: name: CTCLabelDecode

Metric: name: RecMetric main_indicator: acc

Train: dataset: name: LMDBDataSet data_dir: [ '/data/wangjieyao/dataset/common-text/text-hw/text-hw-train-9787/lmdb-9787/', '/data/wangjieyao/dataset/common-text/text-2000000/lmdb-fillen-2000000/' ] transforms:

Eval: dataset: name: LMDBDataSet data_dir: [ '/data/wangjieyao/dataset/common-text/text-hw/text-hw-val-640/lmdb-640/', '/data/wangjieyao/dataset/common-text/text-val-113982/lmdb-fillen-113460/' ] transforms:

lyc728 commented 2 years ago

hw-136 有的图片还存在漏字的情况

Topdu commented 2 years ago

应该是infer_rec.py 在中文识别进行预测,采用的是动态resize的方法,SVTR不适配这种resize方法, 两种解决方案: 1、 将infer_rec.py中的 global_config['infer_mode'] = True 改为global_config['infer_mode'] = False

2、 将./ppocr/data/imaug/rec_img_aug.py中RecResizeImg修改如下:

class RecResizeImg(object):
    def __init__(self,
                 image_shape,
                 infer_mode=False,
                 character_dict_path='./ppocr/utils/ppocr_keys_v1.txt',
                 padding=True,
                 **kwargs):
        self.image_shape = image_shape
        self.infer_mode = infer_mode
        self.character_dict_path = character_dict_path
        self.padding = padding

    def __call__(self, data):
        img = data['image']
        #if self.infer_mode and self.character_dict_path is not None:
           # norm_img, valid_ratio = resize_norm_img_chinese(img,
           #                                                 self.image_shape)
        #else:
        norm_img, valid_ratio = resize_norm_img(img, self.image_shape,
                                                    self.padding)
        data['image'] = norm_img
        data['valid_ratio'] = valid_ratio
        return data
lyc728 commented 2 years ago

from pytorchocr.modeling.common import Activation

truncnormal = TruncatedNormal(std=.02) normal = Normal zeros = Constant(value=0.) ones_ = Constant(value=1.) 大佬,这个模型初始化怎么用torch进行操作呢?

Topdu commented 2 years ago

from pytorchocr.modeling.common import Activation

truncnormal = TruncatedNormal(std=.02) normal = Normal zeros = Constant(value=0.) ones_ = Constant(value=1.) 大佬,这个模型初始化怎么用torch进行操作呢?

可以参考timm库实现的ViT

lyc728 commented 2 years ago

大佬,你好,我是采用自己的文本数据进行训练(手写汉字),有一下疑问,还请解答: (1)、数据多为单通道图,而模型训练并没有指定通道数,这里的操作是三通道还是什么呢? (2)、通过svtr配置脚本进行模型训练,epoch=100,acc=0.74, 还有什么方法可以进一步提高精度呢?

Topdu commented 2 years ago

大佬,你好,我是采用自己的文本数据进行训练(手写汉字),有一下疑问,还请解答: (1)、数据多为单通道图,而模型训练并没有指定通道数,这里的操作是三通道还是什么呢? (2)、通过svtr配置脚本进行模型训练,epoch=100,acc=0.74, 还有什么方法可以进一步提高精度呢?

(1)inchannels=3 表示输入的数据通道为3,一般图像都为RGB三个通道。数据为单通道意思是灰度图吗?如果是灰度图,使用灰度图训练即可,不过RGB转灰度图的处理需要自己在resize方法中自己写入。 (2)尝试数据增强、分析bad case;另外不建议改动RecResizeImg中的参数,如果图像宽比较大,建议改动tps_outputsize和svtrnet中的img_size。

huanhuan-xiao commented 2 years ago

你好,麻烦请教一下,我的问题是模型预测效果比较好。推理预测效果很差。数据集中有些单个数字,我看有些人说的使用2.3版本以及imgW那句注释都无法得到解决。

lyc728 commented 2 years ago

大佬,你好,我是采用自己的文本数据进行训练(手写汉字),有一下疑问,还请解答: (1)、数据多为单通道图,而模型训练并没有指定通道数,这里的操作是三通道还是什么呢? (2)、通过svtr配置脚本进行模型训练,epoch=100,acc=0.74, 还有什么方法可以进一步提高精度呢?

(1)inchannels=3 表示输入的数据通道为3,一般图像都为RGB三个通道。数据为单通道意思是灰度图吗?如果是灰度图,使用灰度图训练即可,不过RGB转灰度图的处理需要自己在resize方法中自己写入。 (2)尝试数据增强、分析bad case;另外不建议改动RecResizeImg中的参数,如果图像宽比较大,建议改动tps_outputsize和svtrnet中的img_size。

你好,最新发现我预测使用不同脚本预测效果不一样,如python3 tools/infer/predict_rec.py python3 tools/infer_rec.py -也是按照相应的配置并将尺寸也进行修改,infer_rec识别精度比predict_rec这个高,这是为什么

Topdu commented 2 years ago

建议从以下几点排查: 1、同一图片在经过这两种预测脚本的预处理后得到的数据是否一致 2、如果预处理后得到的数据相同,排查后处理的结果是否相同,尤其检查特殊字符、空格是否被过滤掉

lyc728 commented 2 years ago

你好,关于infer_rec脚本没有发现数据预处理部分

lyc728 commented 2 years ago

建议从以下几点排查: 1、同一图片在经过这两种预测脚本的预处理后得到的数据是否一致 2、如果预处理后得到的数据相同,排查后处理的结果是否相同,尤其检查特殊字符、空格是否被过滤掉

有没有相应的识别模块部署的脚本呢?(比如svtr转成trt后的)

github-actions[bot] commented 1 year ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed in 7 days if no further activity occurs. Thank you for your contributions.