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.21k stars 7.82k forks source link

如何减少或者消除 DB检测方法推理时丢失 清晰的文字 #5229

Closed tairen99 closed 2 years ago

tairen99 commented 2 years ago

你好, PaddleOCR 谢谢你们的项目。

这个链接 我post了类似的问题,但是得到的帮助是采用其他的方法。我想请教您 如果我还是想采用 DB 方法来做文字检测, 该如何减少或者消除 DB检测方法推理时丢失 清晰的文字?

具体问题如下图所示:

image image

我尝试了在推理阶段 将 PostProcess 中的参数进行修改,比如: thresh: 0.1 box_thresh: 0.2 同时也增加了 “limit_side_len” 的参数。

可是上述问题依然存在

请问我应该如何改善,或者解决这个问题(从模型训练, PostProcess, 还有其他方面等等)? 还请指教, 谢谢您!

我现在的训练配置文件 训练和后处理如下,其他的部分与默认相同:

PostProcess:
  name: DBPostProcess
  thresh: 0.3
  box_thresh: 0.5
  max_candidates: 6000
  unclip_ratio: 1.5

Metric:
  name: DetMetric
  main_indicator: hmean

Train:
  dataset:
    name: SimpleDataSet
    data_dir: ./train_data/paddle_train/text_localization/
    label_file_list:
      - ./train_data/paddle_train/text_localization/train_tag.txt
    ratio_list: [1.0]
    transforms:
      - DecodeImage: # load image
          img_mode: BGR
          channel_first: False
      - DetLabelEncode: # Class handling label
      - IaaAugment:
          augmenter_args:
            - { 'type': Fliplr, 'args': { 'p': 0.5 } }
            - { 'type': Affine, 'args': { 'rotate': [-8, 8] } }
            - { 'type': Resize, 'args': { 'size': [0.5, 3] } }
      - EastRandomCropData:
          size: [640, 640]
          max_tries: 50
          keep_ratio: true
      - MakeBorderMap:
          shrink_ratio: 0.4
          thresh_min: 0.3
          thresh_max: 0.7
      - MakeShrinkMap:
          shrink_ratio: 0.4
          min_text_size:4
      - NormalizeImage:
          scale: 1./255.
          mean: [0.485, 0.456, 0.406]
          std: [0.229, 0.224, 0.225]
          order: 'hwc'
      - ToCHWImage:
      - KeepKeys:
          keep_keys: ['image', 'threshold_map', 'threshold_mask', 'shrink_map', 'shrink_mask'] # the order of the dataloader list
Gmgge commented 2 years ago

好奇问下,你的训练数据的标注是按照单词来的吗?我之前按照行文本进行标注的文本数据,漏检情况会好很多,但是还会有一些。

LDOUBLEV commented 2 years ago

你可以先可视化看下预测结果中有没有丢失文字区域的概率图; https://github.com/PaddlePaddle/PaddleOCR/blob/22b1fb3181a2e8e1a86776ab9aa10fb6abe1c896/ppocr/postprocess/db_postprocess.py?_pjax=%23js-repo-pjax-container%2C%20div%5Bitemtype%3D%22http%3A%2F%2Fschema.org%2FSoftwareSourceCode%22%5D%20main%2C%20%5Bdata-pjax-container%5D#L177

可视化方法:

_maps = np.array(segmentation[0, :, :] * 255).astype(np.uint8)
import cv2
cv2.imwrite("vis_segmentation.png", _maps)

如果丢失的文字区域没有响应或者响应区域不规整,说明是没有训练好; 如果是有响应并且响应区域较好说明是后处理没有处理好。

还有就是考虑到你的文字比较模糊了,预测的时候可以放大输入图像再去预测。

tairen99 commented 2 years ago

好奇问下,你的训练数据的标注是按照单词来的吗?我之前按照行文本进行标注的文本数据,漏检情况会好很多,但是还会有一些。

是的,按单词来标注的;针对英文的文本,行文本估计在识别的时候,精度会不高

tairen99 commented 2 years ago

你可以先可视化看下预测结果中有没有丢失文字区域的概率图; https://github.com/PaddlePaddle/PaddleOCR/blob/22b1fb3181a2e8e1a86776ab9aa10fb6abe1c896/ppocr/postprocess/db_postprocess.py?_pjax=%23js-repo-pjax-container%2C%20div%5Bitemtype%3D%22http%3A%2F%2Fschema.org%2FSoftwareSourceCode%22%5D%20main%2C%20%5Bdata-pjax-container%5D#L177

可视化方法:

_maps = np.array(segmentation[0, :, :] * 255).astype(np.uint8)
import cv2
cv2.imwrite("vis_segmentation.png", _maps)

如果丢失的文字区域没有响应或者响应区域不规整,说明是没有训练好; 如果是有响应并且响应区域较好说明是后处理没有处理好。

还有就是考虑到你的文字比较模糊了,预测的时候可以放大输入图像再去预测。

谢谢您详细的回复,这个很大程度上解答了我的疑惑。 谢谢!