经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 大数据/云/AI » 人工智能基础 » 查看文章
OCR -- 文本检测 - 训练DB文字检测模型
来源:cnblogs  作者:VipSoft  时间:2023/6/2 10:51:29  对本文有异议

百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 预测部署简介与总览
百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 Paddle Inference 模型推理(离线部署)
百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 基于 Paddle Serving快速使用(服务化部署 - CentOS)
百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 基于 Paddle Serving快速使用(服务化部署 - Docker)

PaddleOCR提供DB文本检测算法,支持MobileNetV3、ResNet50_vd两种骨干网络,可以根据需要选择相应的配置文件,启动训练。

本节以icdar15数据集、MobileNetV3作为骨干网络的DB检测模型(即超轻量模型使用的配置)为例,介绍如何完成PaddleOCR中文字检测模型的训练、评估与测试。

3.1 数据准备

本次实验选取了场景文本检测和识别(Scene Text Detection and Recognition)任务最知名和常用的数据集ICDAR2015。icdar2015数据集的示意图如下图所示:


图 icdar2015数据集示意图


该项目中已经下载了icdar2015数据集,存放在 /home/aistudio/data/data96799 中,可以运行如下指令完成数据集解压,或者从链接中自行下载
image

  1. ~/train_data/icdar2015/text_localization
  2. └─ icdar_c4_train_imgs/ icdar数据集的训练数据
  3. └─ ch4_test_images/ icdar数据集的测试数据
  4. └─ train_icdar2015_label.txt icdar数据集的训练标注
  5. └─ test_icdar2015_label.txt icdar数据集的测试标注

提供的标注文件格式为:

  1. " 图像文件名 json.dumps编码的图像标注信息"
  2. ch4_test_images/img_61.jpg [{"transcription": "MASA", "points": [[310, 104], [416, 141], [418, 216], [312, 179]], ...}]

json.dumps编码前的图像标注信息是包含多个字典的list,字典中的points表示文本框的四个点的坐标(x, y),从左上角的点开始顺时针排列。 transcription中的字段表示当前文本框的文字,在文本检测任务中并不需要这个信息。 如果您想在其他数据集上训练PaddleOCR,可以按照上述形式构建标注文件。

如果"transcription"字段的文字为'*'或者'###',表示对应的标注可以被忽略掉,因此,如果没有文字标签,可以将transcription字段设置为空字符串。

3.2 数据预处理

训练时对输入图片的格式、大小有一定的要求,同时,还需要根据标注信息获取阈值图以及概率图的真实标签。所以,在数据输入模型前,需要对数据进行预处理操作,使得图片和标签满足网络训练和预测的需要。另外,为了扩大训练数据集、抑制过拟合,提升模型的泛化能力,还需要使用了几种基础的数据增广方法。

本实验的数据预处理共包括如下方法:

  • 图像解码:将图像转为Numpy格式;
  • 标签解码:解析txt文件中的标签信息,并按统一格式进行保存;
  • 基础数据增广:包括:随机水平翻转、随机旋转,随机缩放,随机裁剪等;
  • 获取阈值图标签:使用扩张的方式获取算法训练需要的阈值图标签;
  • 获取概率图标签:使用收缩的方式获取算法训练需要的概率图标签;
  • 归一化:通过规范化手段,把神经网络每层中任意神经元的输入值分布改变成均值为0,方差为1的标准正太分布,使得最优解的寻优过程明显会变得平缓,训练过程更容易收敛;
  • 通道变换:图像的数据格式为[H, W, C](即高度、宽度和通道数),而神经网络使用的训练数据的格式为[C, H, W],因此需要对图像数据重新排列,例如[224, 224, 3]变为[3, 224, 224];

图像解码

从训练数据的标注中读取图像,演示DecodeImage类的使用方式。
源码位置:\ppocr\data\imaug\operators.py

  1. import os
  2. import matplotlib.pyplot as plt
  3. from paddleocr.ppocr.data.imaug.operators import DecodeImage
  4. label_path = "../train_data/icdar2015/text_localization/train_icdar2015_label.txt"
  5. img_dir = "../train_data/icdar2015/text_localization/"
  6. # 1. 读取训练标签的第一条数据
  7. f = open(label_path, "r")
  8. lines = f.readlines()
  9. # 2. 取第一条数据
  10. line = lines[0]
  11. print("The first data in train_icdar2015_label.txt is as follows.\n", line)
  12. img_name, gt_label = line.strip().split("\t")
  13. # 3. 读取图像
  14. image = open(os.path.join(img_dir, img_name), 'rb').read()
  15. data = {'image': image, 'label': gt_label}
  16. # 4. 声明DecodeImage类,解码图像
  17. decode_image = DecodeImage(img_mode='RGB', channel_first=False)
  18. data = decode_image(data)
  19. # 5. 打印解码后图像的shape,并可视化图像
  20. print("The shape of decoded image is ", data['image'].shape)
  21. plt.figure(figsize=(10, 10))
  22. plt.imshow(data['image'])
  23. src_img = data['image']
  24. plt.show()

image

标签解码

解析txt文件中的标签信息,并按统一格式进行保存;
源码位置:ppocr/data/imaug/label_ops.py

  1. import os
  2. from paddleocr.ppocr.data.imaug.label_ops import DetLabelEncode
  3. label_path = "../train_data/icdar2015/text_localization/train_icdar2015_label.txt"
  4. img_dir = "../train_data/icdar2015/text_localization/"
  5. # 1. 读取训练标签的第一条数据
  6. f = open(label_path, "r")
  7. lines = f.readlines()
  8. # 2. 取第一条数据
  9. line = lines[0]
  10. print("The first data in train_icdar2015_label.txt is as follows.\n", line)
  11. img_name, gt_label = line.strip().split("\t")
  12. # 3. 读取图像
  13. image = open(os.path.join(img_dir, img_name), 'rb').read()
  14. data = {'image': image, 'label': gt_label}
  15. # 1. 声明标签解码的类
  16. decode_label = DetLabelEncode()
  17. # 2. 打印解码前的标签
  18. print("The label before decode are: ", data['label'])
  19. data = decode_label(data)
  20. print("\n")
  21. # 4. 打印解码后的标签
  22. print("The polygon after decode are: ", data['polys'])
  23. print("The text after decode are: ", data['texts'])

基础数据增广

数据增广是提高模型训练精度,增加模型泛化性的常用方法,文本检测常用的数据增广包括随机水平翻转、随机旋转、随机缩放以及随机裁剪等等。

随机水平翻转、随机旋转、随机缩放的代码实现参考代码。随机裁剪的数据增广代码实现参考代码

获取阈值图标签

使用扩张的方式获取算法训练需要的阈值图标签;
源码位置:ppocr/data/imaug/make_border_map.py

  1. # 从PaddleOCR中import MakeBorderMap
  2. from ppocr.data.imaug.make_border_map import MakeBorderMap
  3. # 1. 声明MakeBorderMap函数
  4. generate_text_border = MakeBorderMap()
  5. # 2. 根据解码后的输入数据计算bordermap信息
  6. data = generate_text_border(data)
  7. # 3. 阈值图可视化
  8. plt.figure(figsize=(10, 10))
  9. plt.imshow(src_img)
  10. text_border_map = data['threshold_map']
  11. plt.figure(figsize=(10, 10))
  12. plt.imshow(text_border_map)

原文链接:https://www.cnblogs.com/vipsoft/p/17431080.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号