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

请问下,在中文识别模型中,要识别的文字字典中不存在,我是不是在字典中添加对应的值再参与训练即可?如何提高一些生僻字、图片较模型的数据的准确率呢 #5667

Closed chenyixun1112 closed 2 years ago

chenyixun1112 commented 2 years ago

请提供下述完整信息以便快速定位问题/Please provide the following information to quickly locate the problem

dengmingD commented 2 years ago

在中文识别模型中,要识别的文字字典中不存在,我是不是在字典中添加对应的值再参与训练即可 答:是,但是不要官方的预训模型。因为shape不一样 如何提高一些生僻字、图片较模型的数据的准确率呢 答:增加样本量

chenyixun1112 commented 2 years ago

在中文识别模型中,要识别的文字字典中不存在,我是不是在字典中添加对应的值再参与训练即可 答:是,但是不要官方的预训模型。因为shape不一样 如何提高一些生僻字、图片较模型的数据的准确率呢 答:增加样本量

不要官方的预训练模型指的是不使用预训练模型进行训练吗?

dengmingD commented 2 years ago

是,因为你增加了新字符,需要从新训练

ziyaxuanyi commented 2 years ago

在中文识别模型中,要识别的文字字典中不存在,我是不是在字典中添加对应的值再参与训练即可 答:是,但是不要官方的预训模型。因为shape不一样 如何提高一些生僻字、图片较模型的数据的准确率呢 答:增加样本量

不要官方的预训练模型指的是不使用预训练模型进行训练吗?

依然可以加载官方的预训练模型的,只不过是加载大部分网络参数,最后一个连接层不加载重新训练

WenmuZhou commented 2 years ago

在中文识别模型中,要识别的文字字典中不存在,我是不是在字典中添加对应的值再参与训练即可 答:是,但是不要官方的预训模型。因为shape不一样 如何提高一些生僻字、图片较模型的数据的准确率呢 答:增加样本量

不要官方的预训练模型指的是不使用预训练模型进行训练吗?

依然可以加载官方的预训练模型的,只不过是加载大部分网络参数,最后一个连接层不加载重新训练

这个正确,生僻字可以试一下带centerloss的ctc

dengmingD commented 2 years ago

在中文识别模型中,要识别的文字字典中不存在,我是不是在字典中添加对应的值再参与训练即可 答:是,但是不要官方的预训模型。因为shape不一样 如何提高一些生僻字、图片较模型的数据的准确率呢 答:增加样本量

不要官方的预训练模型指的是不使用预训练模型进行训练吗?

依然可以加载官方的预训练模型的,只不过是加载大部分网络参数,最后一个连接层不加载重新训练

这个正确,生僻字可以试一下带centerloss的ctc

以下步骤是否合理: 目标:21330字符 1.先训练Teacher模型(ch_PP-OCRv2_rec_enhanced_ctc_loss.yml) 2.再用Teacher为预训模型训练(ch_PP-OCRv2_rec_distillation.yml)

ziyaxuanyi commented 2 years ago

顺序反了,先训练ch_PP-OCRv2_rec_distillation.yml,这样你才能计算每个字符的中心center,才能使用center loss

dengmingD commented 2 years ago

顺序反了,先训练ch_PP-OCRv2_rec_distillation.yml,这样你才能计算每个字符的中心center,才能使用center loss

多谢

GivanTsai commented 2 years ago

在中文识别模型中,要识别的文字字典中不存在,我是不是在字典中添加对应的值再参与训练即可 答:是,但是不要官方的预训模型。因为shape不一样 如何提高一些生僻字、图片较模型的数据的准确率呢 答:增加样本量

不要官方的预训练模型指的是不使用预训练模型进行训练吗?

依然可以加载官方的预训练模型的,只不过是加载大部分网络参数,最后一个连接层不加载重新训练

这个正确,生僻字可以试一下带centerloss的ctc

代码哪里重新修改最后一层呢

ziyaxuanyi commented 2 years ago

不需要修改,代码会自动处理的

GivanTsai commented 2 years ago

训练ch_PP-OCRv2_rec_di

因为我想用预训练模型,代码也不用改吗

ziyaxuanyi commented 2 years ago

不需要,有两种方式加载预训练模型训练ch_PP-OCRv2_rec_distillation.yml

第一种是下载官方的预训练模型ch_PP-OCRv2_rec_train.tar解压,在ch_PP-OCRv2_rec_distillation.yml的pretrained_model参数指定路径即可,这种方式我没试过不知道能不能训练出来。

第二种是我目前使用的能够训练出来的方式,同样下载官方的预训练模型ch_PP-OCRv2_rec_train.tar解压,然后按照https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.4/doc/doc_ch/knowledge_distillation.md 这种参考文件的2.1.5节从预训练模型中分别提取出student和teacher模型,然后在ch_PP-OCRv2_rec_distillation.yml的网络定义部分,在student和teacher的pretrained参数分别指定提取出来的student和teacher模型的路径即可。

以上两种方式都不需要更改代码,代码会自动加载网络结构一致的参数,不一样的地方会重新训练。

paddle-bot-old[bot] commented 2 years ago

Since you haven\'t replied for more than 3 months, we have closed this issue/pr. If the problem is not solved or there is a follow-up one, please reopen it at any time and we will continue to follow up. It is recommended to pull and try the latest code first. 由于您超过三个月未回复,我们将关闭这个issue/pr。 若问题未解决或有后续问题,请随时重新打开(建议先拉取最新代码进行尝试),我们会继续跟进。

wzz981 commented 1 year ago

不需要,有两种方式加载预训练模型训练ch PP-ocr v2 rec _ distillation . yml

第一种是下载官方的预训练模型ch_PP-OCRv2_rectrain.tar解压,在ch PP-ocr v2 rec distillation . yml的预训练_模型参数指定路径即可,这种方式我没试过不知道能不能训练出来。

第二种是我目前使用的能够训练出来的方式,同样下载官方的预训练模型ch_PP-OCRv2_rectrain.tar解压,然后按照[https://github . com/paddle paddle/paddle ocr/blob/release/2.4/doc/doc ch/knowledge _ distillation . MD](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.4/doc/doc_ch/knowledge_distillation.md)这种参考文件的2.1.5节从预训练模型中分别提取出学生和教师模型,然后在ch PP-ocr v2 rec _ distillation . yml的网络定义部分,在学生和教师的预训练参数分别指定提取出来的学生和教师模型的路径即可。

以上两种方式都不需要更改代码,代码会自动加载网络结构一致的参数,不一样的地方会重新训练。

你好,我也是想新增生僻字训练识别模型,是按你第二种方法修改ch_PP-OCRv2_rec_distillation.yml进行训练,只需要把.pdparams文件提取出来吗,我分别提取了老师和学生模型的.pdparams文件,然后用下载的训练模型中相同的.pdopt和.states分别和老师和学生模型的.pdparams文件保存到一个目录,然后再修改配置文件的老师模型和学生pretrained为对应目录,其他没有修改,但是好像“最后一个连接层不加载重新训练”没有成功,到第6个epoch后loss和acc都变为nanxxx了。

部分显示如下 image

可以帮忙看看配置文件是不是还需要更改哪些呢,谢谢

Global:
  debug: false
  use_gpu: true
  epoch_num: 800
  log_smooth_window: 20
  print_batch_step: 10
  save_model_dir: /tmp/output/
  save_epoch_step: 3
  eval_batch_step: [0, 2000]
  cal_metric_during_train: true
  pretrained_model:
  checkpoints:
  save_inference_dir:
  use_visualdl: false
  infer_img: doc/imgs_words/ch/word_1.jpg
  character_dict_path: ppocr/utils/ppocr_keys_v2.txt
  max_text_length: 25
  infer_mode: false
  use_space_char: true
  distributed: true
  save_res_path: /tmp/output/predicts_pp-OCRv2_distillation.txt

Optimizer:
  name: Adam
  beta1: 0.9
  beta2: 0.999
  lr:
    name: Piecewise
    decay_epochs : [700, 800]
    values : [0.001, 0.0001]
    warmup_epoch: 5
  regularizer:
    name: L2
    factor: 2.0e-05

Architecture:
  model_type: &model_type "rec"
  name: DistillationModel
  algorithm: Distillation
  Models:
    Teacher:
      pretrained: /tmp/dataset/model/model/teacher/best_accuracy
      freeze_params: false
      return_all_feats: true
      model_type: *model_type
      algorithm: CRNN
      Transform:
      Backbone:
        name: MobileNetV1Enhance
        scale: 0.5
      Neck:
        name: SequenceEncoder
        encoder_type: rnn
        hidden_size: 64
      Head:
        name: CTCHead
        mid_channels: 96
        fc_decay: 0.00002
    Student:
      pretrained: /tmp/dataset/model/model/student/best_accuracy
      freeze_params: false
      return_all_feats: true
      model_type: *model_type
      algorithm: CRNN
      Transform:
      Backbone:
        name: MobileNetV1Enhance
        scale: 0.5
      Neck:
        name: SequenceEncoder
        encoder_type: rnn
        hidden_size: 64
      Head:
        name: CTCHead
        mid_channels: 96
        fc_decay: 0.00002

Loss:
  name: CombinedLoss
  loss_config_list:
  - DistillationCTCLoss:
      weight: 1.0
      model_name_list: ["Student", "Teacher"]
      key: head_out
  - DistillationDMLLoss:
      weight: 1.0
      act: "softmax"
      use_log: true
      model_name_pairs:
      - ["Student", "Teacher"]
      key: head_out
  - DistillationDistanceLoss:
      weight: 1.0
      mode: "l2"
      model_name_pairs:
      - ["Student", "Teacher"]
      key: backbone_out

PostProcess:
  name: DistillationCTCLabelDecode
  model_name: ["Student", "Teacher"]
  key: head_out

Metric:
  name: DistillationMetric
  base_metric_name: RecMetric
  main_indicator: acc
  key: "Student"

Train:
  dataset:
    name: SimpleDataSet
    data_dir: /tmp/dataset/rec_img/rec_img/train/data
    label_file_list:
    - /tmp/dataset/rec_img/rec_img/train/rec_gt_label.txt
    transforms:
    - DecodeImage:
        img_mode: BGR
        channel_first: false
    - RecAug:
    - CTCLabelEncode:
    - RecResizeImg:
        image_shape: [3, 32, 320]
    - KeepKeys:
        keep_keys:
        - image
        - label
        - length
  loader:
    shuffle: true
    batch_size_per_card: 128
    drop_last: true
    num_sections: 1
    num_workers: 8
Eval:
  dataset:
    name: SimpleDataSet
    data_dir: /tmp/dataset/rec_img/rec_img/eval/data
    label_file_list:
    - /tmp/dataset/rec_img/rec_img/eval/rec_gt_label.txt
    transforms:
    - DecodeImage:
        img_mode: BGR
        channel_first: false
    - CTCLabelEncode:
    - RecResizeImg:
        image_shape: [3, 32, 320]
    - KeepKeys:
        keep_keys:
        - image
        - label
        - length
  loader:
    shuffle: false
    drop_last: false
    batch_size_per_card: 128
    num_workers: 8