Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
NextGuido opened this issue May 22, 2020 · 14 comments

Comments

@NextGuido
Copy link

我更改了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
Copy link
Collaborator

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

@NextGuido
Copy link
Author

@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
Copy link

DuckJ commented Jun 5, 2020

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

@DuckJ
Copy link

DuckJ commented Jun 5, 2020

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

@tink2123
Copy link
Collaborator

tink2123 commented Jun 8, 2020

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

@DuckJ
Copy link

DuckJ commented Jun 9, 2020

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

@tink2123
Copy link
Collaborator

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

@DuckJ
Copy link

DuckJ commented Jun 12, 2020

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

@tink2123
Copy link
Collaborator

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

@DuckJ
Copy link

DuckJ commented Jun 12, 2020

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

@tink2123
Copy link
Collaborator

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

@DuckJ
Copy link

DuckJ commented Jun 12, 2020

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

@tink2123
Copy link
Collaborator

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

@dyning dyning closed this as completed Jul 23, 2020
@dyning
Copy link
Collaborator

dyning commented Jul 23, 2020

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

an1018 pushed a commit to an1018/PaddleOCR that referenced this issue Aug 17, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants