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
43.9k stars 7.8k forks source link

使用rec_chinese_lite_train.yml配置文件训练中文数据集效果不好 #88

Closed NextGuido closed 4 years ago

NextGuido commented 4 years ago

我更改了rec_chinese_lite_train.yml配置文件的内容,如下:

Global:
  algorithm: CRNN
  use_gpu: true
  epoch_num: 300
  log_smooth_window: 20
  print_batch_step: 10
  save_model_dir: ./output/rec_CRNN
  save_epoch_step: 3
  eval_batch_step: 2000
  train_batch_size_per_card: 160
  test_batch_size_per_card: 160
  image_shape: [3, 32, 320]
  max_text_length: 25
  character_type: ch
  character_dict_path: ./ppocr/utils/18548.txt
  loss_type: ctc
  reader_yml: ./configs/rec/rec_chinese_reader_csv.yml
  pretrain_weights: ./pretrain_models/rec_mv3_none_bilstm_ctc/best_accuracy
  checkpoints:
  save_inference_dir:
Architecture:
  function: ppocr.modeling.architectures.rec_model,RecModel

Backbone:
  function: ppocr.modeling.backbones.rec_mobilenet_v3,MobileNetV3
  scale: 0.5
  model_name: small

Head:
  function: ppocr.modeling.heads.rec_ctc_head,CTCPredict
  encoder_type: rnn
  SeqRNN:
    hidden_size: 48

Loss:
  function: ppocr.modeling.losses.rec_ctc_loss,CTCLoss

Optimizer:
  function: ppocr.optimizer,AdamDecay
  base_lr: 0.0005
  beta1: 0.9
  beta2: 0.999

其实只更改了epoch_num,batch_size,character_dict_path,reader_yml,pretrain_weights这几处,但是迭代了100轮左右,现在的train acc只有0.2左右。我的字符集有18000多个,请问这个轻量级的网络目前来看是不是欠拟合了?因为我发现如果我换成resnet50作为backbone,网络可以训练的不错

LDOUBLEV commented 4 years ago

你的字符那么多,训轻量级网络可以训久点,或者需要对网络做一些调整,18000字符,CTC最后一层的参数太多了。大网络会在表达能力上更强些,问下你用大网络的测试精度怎么样?

NextGuido commented 4 years ago

@LDOUBLEV 大网络的测试结果: 2020-05-21 07:04:09,672-INFO: Test iter: 68000, acc:0.950456, best_acc:0.957234, best_epoch:82, best_batch_id:66000, eval_sample_num:41014 和上面的轻量级网路同样的参数配置(除了head的hidden_size改为256,backbone改为ResNet50_vd),精度还不错,只训练到86轮acc就达到用我之前自己的网络的效果了

DuckJ commented 4 years ago

@LDOUBLEV (1)请问识别部分crnn好像没有用到不定长识别吧,看源码好像是固定到统一size,然后缺少的用0 padding? (2)请问这种的话如果数据集中有的图片字符数很少,padding很多的话,不会影响效果么

DuckJ commented 4 years ago

在利用lsvt语料生成数据集的时候,你们会控制字符么?

tink2123 commented 4 years ago

@DuckJ 针对长文本识别效果较差的情况,我们把shape扩大到了(3,32,320)。如果您不需要识别过长字符串可以减小长度。我们用语料合成数据时,限制最长不超过25个字符,实际中超过25个字符的也比较少。

DuckJ commented 4 years ago

@tink2123 感谢回复。你们将shape扩大到了(3,32,320),那么针对图片的宽度远小于320的图片(比如图片只含有一个汉字),我看源码你们是padding 0的,请问这种padding太多,不会影响效果么

tink2123 commented 4 years ago

在短文本(单字)上验证不会影响识别效果,由于paddle是静态图组网,训练时无法改变输入shape,目前只能以最大值为准

DuckJ commented 4 years ago

@tink2123 谢谢回复,关于识别中中英混合识别,两个相邻的英文单词之间识别结果英文会连在一起,请问这方面能怎样解决,能给点指导么

tink2123 commented 4 years ago

@DuckJ 这是因为目前我们模型中没有识别空格,您可以修改训练字典,添加一个空格类别,然后加入一些带空格的样本进行finetune,应该可以解决这个问题

DuckJ commented 4 years ago

@tink2123 谢谢回复,加入空格finetune的时候,想问一下,这种汉字跟汉字之间的就无须将其label加上空格了吧,finetune时候是不是可以着重构造这种两个连接的英文这种情况

tink2123 commented 4 years ago

@DuckJ 是的,可以只加入英文数据集进行训练

DuckJ commented 4 years ago

@tink2123 好的,谢谢。我有个疑问,你们识别的时候没有对数据进行数据增强么

tink2123 commented 4 years ago

@DuckJ 暂时没有,因为我们在合成数据时已经做了一些扰动,颜色反转等变化。后续会在代码库中添加数据增强的代码。

dyning commented 4 years ago

2020.7.9 添加数据增强、学习率衰减策略,具体参考配置文件

xiaotangwan commented 3 months ago

@DuckJ 暂时没有,因为我们在合成数据时已经做了一些扰动,颜色反转等变化。后续会在代码库中添加数据增强的代码。

你好 ,我想问一下,你之前微调的时候数据是包括已有字符和新生成的字符吗,数据量大概是多少呢?比例是多少呢?

xiaotangwan commented 3 months ago

@LDOUBLEV 大网络的测试结果: 2020-05-21 07:04:09,672-INFO: Test iter: 68000, acc:0.950456, best_acc:0.957234, best_epoch:82, best_batch_id:66000, eval_sample_num:41014 和上面的轻量级网路同样的参数配置(除了head的hidden_size改为256,backbone改为ResNet50_vd),精度还不错,只训练到86轮acc就达到用我之前自己的网络的效果了

你好 ,我想问一下,你之前微调的时候数据是包括已有字符和新生成的字符吗,数据量大概是多少呢?比例是多少呢?