首页 > 其他分享 >OCR -- 文本检测 - 训练DB文字检测模型

OCR -- 文本检测 - 训练DB文字检测模型

时间:2023-06-02 09:56:34浏览次数:51  
标签:img 数据 -- 检测 DB label 标签 icdar2015 data

百度飞桨(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

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

提供的标注文件格式为:

" 图像文件名                    json.dumps编码的图像标注信息"
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

import os
import matplotlib.pyplot as plt
from paddleocr.ppocr.data.imaug.operators import DecodeImage
 

label_path = "../train_data/icdar2015/text_localization/train_icdar2015_label.txt"
img_dir = "../train_data/icdar2015/text_localization/"

# 1. 读取训练标签的第一条数据
f = open(label_path, "r")
lines = f.readlines()

# 2. 取第一条数据
line = lines[0]

print("The first data in train_icdar2015_label.txt is as follows.\n", line)
img_name, gt_label = line.strip().split("\t")

# 3. 读取图像
image = open(os.path.join(img_dir, img_name), 'rb').read()
data = {'image': image, 'label': gt_label}

# 4. 声明DecodeImage类,解码图像
decode_image = DecodeImage(img_mode='RGB', channel_first=False)
data = decode_image(data)

# 5. 打印解码后图像的shape,并可视化图像
print("The shape of decoded image is ", data['image'].shape)

plt.figure(figsize=(10, 10))
plt.imshow(data['image'])
src_img = data['image']
plt.show()

image

标签解码

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

import os
from paddleocr.ppocr.data.imaug.label_ops  import DetLabelEncode

label_path = "../train_data/icdar2015/text_localization/train_icdar2015_label.txt"
img_dir = "../train_data/icdar2015/text_localization/"

# 1. 读取训练标签的第一条数据
f = open(label_path, "r")
lines = f.readlines()

# 2. 取第一条数据
line = lines[0]

print("The first data in train_icdar2015_label.txt is as follows.\n", line)
img_name, gt_label = line.strip().split("\t")

# 3. 读取图像
image = open(os.path.join(img_dir, img_name), 'rb').read()
data = {'image': image, 'label': gt_label}

# 1. 声明标签解码的类
decode_label = DetLabelEncode()
# 2. 打印解码前的标签
print("The label before decode are: ", data['label'])
data = decode_label(data)
print("\n")

# 4. 打印解码后的标签
print("The polygon after decode are: ", data['polys'])
print("The text after decode are: ", data['texts'])

基础数据增广

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

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

获取阈值图标签

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

# 从PaddleOCR中import MakeBorderMap
from ppocr.data.imaug.make_border_map import MakeBorderMap

# 1. 声明MakeBorderMap函数
generate_text_border = MakeBorderMap()

# 2. 根据解码后的输入数据计算bordermap信息
data = generate_text_border(data)

# 3. 阈值图可视化
plt.figure(figsize=(10, 10))
plt.imshow(src_img)

text_border_map = data['threshold_map']
plt.figure(figsize=(10, 10))
plt.imshow(text_border_map)

标签:img,数据,--,检测,DB,label,标签,icdar2015,data
From: https://www.cnblogs.com/vipsoft/p/17431080.html

相关文章

  • 为什么会出现 setTimeout 倒计时误差
    setTimeout倒计时误差的出现主要与JavaScript的事件循环机制和计时器的执行方式有关。在JavaScript中,事件循环是用于管理和调度代码执行的机制。setTimeout函数用于设置一个定时器,在指定的延迟时间后执行回调函数。然而,由于事件循环的机制,setTimeout并不能保证在准确的时......
  • 有道智云翻译
    一、文档https://ai.youdao.com/DOCSIRMA/html/trans/api/wyfy/index.html二、示例#-*-coding:utf-8-*-importsysimportuuidimportrequestsimporthashlibimporttimefromimportlibimportreloadimportjsonimporttimereload(sys)#有道翻译地址YOUDA......
  • [ 基于宝塔部署 ] 恋爱博客 -- Like_Girl 5.0
    1)环境准备云服务器[CentOS7]域名解析love.daxiaoba.cool宝塔面板yuminstall-ywget&&wget-Oinstall.shhttps://download.bt.cn/install/install_6.0.sh&&shinstall.shed8484bec2)宝塔面板https://bt.daxiaoba.cool:9999/username:wangjpassword......
  • 一次网络请求中的流量分发过程 | 京东云技术团队
    1.摘要现代的企业级或互联网系统往往需要进行流量规划,达成透明多级分流。流量从客户端发出到服务端处理这个过程里,流经的与功能无关的技术部件有(达成“透明分流”这个目标所采用的工具与手段):客户端缓存、域名服务器、传输链路、内容分发网络、负载均衡器、服务端缓存。透明分流......
  • spinner自定义[转]
    转自:https://www.jianshu.com/p/7b03ade29091spinner_drop_down_shape的代码<?xmlversion="1.0"encoding="utf-8"?><layer-listxmlns:android="http://schemas.android.com/apk/res/android"><item><shap......
  • linux | CentOS 发送邮件附件
    如图:  配置内容[email protected][email protected]=授权码#在邮箱后台申请setsmtp-auth=login 发送内容:#格式:echo邮件正文mail-s"邮件标题"-a附件地址收件邮箱echohelloword!m......
  • AI智能安监平台EasyCVR多级分组展开按钮无法操作的问题优化
    EasyCVR基于云边端协同,可支持海量视频的轻量化接入与汇聚管理。平台既具备传统安防视频监控的能力,比如:视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲等,也能接入AI智能分析的能力,包括人脸检测、车辆检测、烟火检测、安全帽检测、区域入......
  • 人月神话阅读笔记3
    在之前我的阅读笔记(读后感)更新到2就没有更新了,大概是忘记继续读这本书,转身去读构建之法了。今天来写一篇人月神话的阅读笔记。简单杂碎的记一些重点之前读到了第五章的画蛇添足第六章是贯彻执行设计结果必须由一个人或两个人完成,以确保这些决定是一致的。手册形式化定义......
  • 一、第一个python脚本
    一、第一个python脚本1.使用vi或vim直接写#vim1.py#!/usr/bin/python #声明类型,指明解释器命令路径#-*-coding:utf-8-*- #指定字符格式为utf-8(可以打印中文),python3不用再指定了print"hellowworld" #python2的写法,python3执行会报错print("helloworld") ......
  • 二、print打印
    二、python打印print基本的打印规则换行打印help(print) #帮助方法print("helloworld")print("python") #这是两句分开的打印,会打印两行print("helloworld\npython") #打印的结果会换行print('''helloworldpython''') #打印的结果......