Paddle OCR v4 微调训练文字识别SVTRNet模型实践

文字识别步骤参考:https://github.com/PaddlePaddle/PaddleOCR/blob/main/doc/doc_ch/recognition.md

微调步骤参考:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7.1/doc/doc_ch/finetune.md

训练必要性

在这里插入图片描述
在这里插入图片描述

原始模型标点符号和括号容易识别不到

数据准备

参考:https://github.com/PaddlePaddle/PaddleOCR/blob/main/doc/doc_ch/dataset/ocr_datasets.md
通用数据 用于训练以文本文件存储的数据集(SimpleDataSet);

一张图片 一行文本
格式类似:
在这里插入图片描述
在这里插入图片描述

注意:图像文件名写xxx.jpg即可,文件夹名可以在配置文件中指定

数据源:垂直领域的pdf,经过剪裁生成了10万张图片(文本内容没有去重,为了保证一些词出现的频率不变)

开始训练

训练v4的模型,所以选择配置文件:ch_PP-OCRv4_rec.yml ,需要做如下更改
更改学习率为[1e-4, 2e-5]左右,
更改图片文件夹路径
更改batch_size大小(训练报错时,适当调节大小,)

下载pretrain model,使用v4预训练模型
https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_rec_train.tar

注意:v4预训练模型没有best,只有student

正常启动训练

python3 tools/train.py -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec.yml -o Global.pretrained_model=./pretrain_models/ch_PP-OCRv4_rec_train/student Global.save_model_dir=./output/rec_ppocr_v4

注意使用ch_PP-OCRv4_rec_distill.yml配置文件训练,报错KeyError: ‘NRTRLabelDecode’,官方暂时没有解决。

python3 tools/train.py -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec_distill.yml -o Global.pretrained_model=./pretrain_models/ch_PP-OCRv4_rec_train/student

导出模型

python3 tools/export_model.py -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec_jilin.yml  -o Global.pretrained_model=./output/rec_ppocr_v4/best_accuracy  Global.save_inference_dir=./inference/PP-OCRv4_rec_jilin/
python3 tools/infer/predict_rec.py --rec_model_dir="./inference/PP-OCRv4_rec/"  --image_dir="./train_data/rec/jilin_001_0_27_5.jpg"

推理

python3 tools/infer_rec.py -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec.yml -o Global.pretrained_model=./output/rec_ppocr_v4/best_accuracy Global.infer_img=./train_data/rec/jilin_001_0_27_5.jpg

实践:
参考:https://blog.csdn.net/qq_52852432/article/details/131817619
在这里插入图片描述
一共训练了20轮,第五轮训练测试集达到最大精度,85%,之后精度逐渐下降

在这里插入图片描述

预测

图片:

在这里插入图片描述
在这里插入图片描述

训练的模型:

(‘2218白城师范学院(吉林省白城市,10206)’, 0.9582517743110657)
(‘2225吉林警察学院(长春市,11441)’, 0.9862592816352844)
原始v4模型:

(2218白城师范学院(吉林省白城市,10206)', 0.9726919531822205)
(‘2225吉林警察学院(长春市,11441)’, 0.9829413294792175)

总结

可以看到,训练后模型识别括号基本统一成英文了。其实光是识别,起始v4效果已经很好了,原来检测的效果不太行,会拉低识别正确率

改进:微调文字检测模型,待完成后补充

其他需要注意的

实践时,使用了预训练模型,但一开始模型准确率acc一直为0,因为数据准备错误了,图片包含了多行文字,后来修正了图片,acc飞速提高。

其他版本

由于我数据集存在很多文本, 更改max_length,从25改到50,并且image.shape的宽从320改成640,batch_size改成了32
在这里插入图片描述
第5个epoch达到最大的acc 65%,效果不够好

训练模型可能有的疑问

参考:添加链接描述

  • 如何识别文字比较长的文本
    在这里插入图片描述

  • 合成数据与真实数据比例
    在这里插入图片描述

  • 如何生成数据
    在这里插入图片描述

  • 文本识别训练时宽高比大于 10 或者文本长度大于 25 的图像会直接丢弃吗?会
    参考:https://github.com/PaddlePaddle/PaddleOCR/issues/5017

  • 如果大部分图像都超过了25个字符,建议训练时根据实际情况修改:max_text_length,并将input_size设置为宽高比更大的比例
    参考:https://github.com/PaddlePaddle/PaddleOCR/issues/7500

  • 英文长度是按照字母计算的,需要将空格计算在内。
    我印象中,定义的max_text_length需要比实际的长度至少多两位数。
    比如要想识别身份证号,实际中身份证号是18位,那在config文件中定义的max_text_length至少要为20,否则会报错。

  • 训练检测模型时,不会用到标签中的文本字段。

  • 如果训练数据较少的话,配置越高越容易过拟合。

参考:https://aistudio.baidu.com/projectdetail/4484441
1.7 简单的对于精度要求不高的OCR任务,数据集需要准备多少张呢?

A:(1)训练数据的数量和需要解决问题的复杂度有关系。难度越大,精度要求越高,则数据集需求越大,而且一般情况实际中的训练数据越多效果越好。

(2)对于精度要求不高的场景,检测任务和识别任务需要的数据量是不一样的。对于检测任务,500张图像可以保证基本的检测效果。对于识别任务,需要保证识别字典中每个字符出现在不同场景的行文本图像数目需要大于200张(举例,如果有字典中有5个字,每个字都需要出现在200张图片以上,那么最少要求的图像数量应该在200-1000张之间),这样可以保证基本的识别效果。

1.8 当训练数据量少时,如何获取更多的数据?

A:当训练数据量少时,可以尝试以下三种方式获取更多的数据:(1)人工采集更多的训练数据,最直接也是最有效的方式。(2)基于PIL和opencv基本图像处理或者变换。例如PIL中ImageFont, Image, ImageDraw三个模块将文字写到背景中,opencv的旋转仿射变换,高斯滤波等。(3)利用数据生成算法合成数据,例如pix2pix等算法。

1.9 如何更换文本检测/识别的backbone?

A:无论是文字检测,还是文字识别,骨干网络的选择是预测效果和预测效率的权衡。一般,选择更大规模的骨干网络,例如ResNet101_vd,则检测或识别更准确,但预测耗时相应也会增加。而选择更小规模的骨干网络,例如MobileNetV3_small_x0_35,则预测更快,但检测或识别的准确率会大打折扣。幸运的是不同骨干网络的检测或识别效果与在ImageNet数据集图像1000分类任务效果正相关。飞桨图像分类套件PaddleClas汇总了ResNet_vd、Res2Net、HRNet、MobileNetV3、GhostNet等23种系列的分类网络结构,在上述图像分类任务的top1识别准确率,GPU(V100和T4)和CPU(骁龙855)的预测耗时以及相应的117个预训练模型下载地址。

(1)文字检测骨干网络的替换,主要是确定类似与ResNet的4个stages,以方便集成后续的类似FPN的检测头。此外,对于文字检测问题,使用ImageNet训练的分类预训练模型,可以加速收敛和效果提升。

(2)文字识别的骨干网络的替换,需要注意网络宽高stride的下降位置。由于文本识别一般宽高比例很大,因此高度下降频率少一些,宽度下降频率多一些。可以参考PaddleOCR中MobileNetV3骨干网络的改动。

V4使用的高精度中文场景文本识别模型SVTR详解

参考:https://aistudio.baidu.com/projectdetail/4263032
参考:https://github.com/PaddlePaddle/PaddleOCR/blob/main/applications/%E9%AB%98%E7%B2%BE%E5%BA%A6%E4%B8%AD%E6%96%87%E8%AF%86%E5%88%AB%E6%A8%A1%E5%9E%8B.md,但一直没下载成功SVTR中文模型文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/4538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动化机器学习:让机器学习更智能

自动化机器学习:让机器学习更智能 在当今数据驱动的时代,机器学习技术已经成为了许多行业和领域的核心。然而,随着数据量的增加和模型复杂度的提升,传统的机器学习方法往往需要大量的人力和时间进行调参和优化,这在某…

3步教你成为微信客户管理高手,助你事半功倍!

在如今的商业世界中,与客户建立良好的关系并提供个性化的服务已成为企业成功的关键。今天就 分享三个简单的步骤,让大家成为微信客户管理的高手,事半功倍! 第一步:客户分类与精细化服务 为了更好地管理客户&#xff…

mongodb使用debezium

前置 服务器上需要安装jdk11 jdk下载地址 kafka安装 官网下载地址 安装教程 debezium 安装 运行 Debezium 连接器需要 Java 11 或更高版本 Debezium 并不是一个独立的软件,而是很多个 Kafka 连接器的总称。这些 Kafka 连接器分别对应不同的数据库,…

【C++】C\C++内存管理

下面是围绕C\C内存管理这一块知识谈论相关的内存管理机制,有需要借鉴即可。 同时,我在下面也放了快速建立链表的模板,方便oj题目拿到vs上进行调试。 内存管理目录 1.CPP内存管理1.1new、delete关键字概念1.2特性1.3总结 2.new、delete的底层…

电商API数据采集接口||大数据的发展,带动电子商务产业链,促进了社会的进步

最近几年计算机技术在诸多领域得到了有效的应用,同时在多方面深刻影响着我国经济水平的发展。除此之外,人民群众的日常生活水平也受大数据技术的影响。 主流电商API数据采集接口||在这其中电子商务领域也在大数据技术的支持下,得到了明显的进…

《逃离塔科夫》PVE模式加入付费特别版引发玩家不满

《逃离塔科夫》PVE模式加入付费特别版引发玩家不满 近期,《逃离塔科夫》开发者Battlestate发布了多个新版本,但其中PVE模式只能在价格最高的“Unheard Edition”中购买,导致玩家不满。据悉,“Unheard Edition”售价高达250欧元&a…

Linxu系统服务管理,systemd知识/进程优先级/平均负载/php进程CPU100%怎么解决系列知识!

shell脚本(命令)放后台 sleep 300& 放到后台运行,脚本或命令要全路径 nohup:用户推出系统进程继续工作 【功能说明】 nohup 命令可以将程序以忽略挂起信号的方式运行起来,被运行程序的输出信息将不会显示到终端 如…

小程序的合同是怎么样写的

​很多商家找第三方做小程序都遭遇到了各种问题,如访问速度慢、服务器关闭、反复收费等。如果当初商家找的是正规的第三方服务商,双方签订了明确的合同条款,出现任何问题后,相信都能够进行解决。下面将具体介绍合同内容&#xff0…

大田场景下的路径检测论文汇总

文章目录 2020Visual Servoing-based Navigation for Monitoring Row-Crop Fields 2020 Visual Servoing-based Navigation for Monitoring Row-Crop Fields code: https://github.com/PRBonn/visual-crop-row-navigation 摘要: 自主导航是野外机器人执行精确农业…

ElasticSearch自动补全

一、拼音分词器: 当用户在搜索框输入字符时,我们应该提示出与该字符有关的搜索项,如图: 这种根据用户输入的字母,提示完整词条的功能,就是自动补全了。 GET /_analyze {"text":"我爱螺蛳粉…

opencv图片绘制图形-------c++

绘制图形 #include <opencv2/opencv.hpp> #include <opencv2/core.hpp> #include <filesystem>bool opencvTool::drawPolygon(std::string image_p, std::vector<cv::Point> points) {cv::Mat ima cv::imread(image_p.c_str()); // 读取图像&#xf…

制造业智慧工厂

在信息化、智能化浪潮的推动下&#xff0c;制造业正迎来一场前所未有的变革。智慧工厂&#xff0c;作为这一变革的核心载体&#xff0c;正逐渐成为制造业发展的新引擎。HiWoo Cloud平台&#xff0c;以其卓越的物联网云技术&#xff0c;为制造业智慧工厂的构建提供了强有力的支持…

Linux逻辑方式合并物理磁盘

在日常生活中&#xff0c;我们总是遇到一个文件太大&#xff0c;以至于我们的两个磁盘都装不下&#xff0c;这时我们就需要将两块物理磁盘逻辑化的连接在一起&#xff0c;把物理磁盘使用逻辑化的方法合并在一起&#xff0c;形成卷组&#xff0c;使得磁盘空间可以公用&#xff1…

【 AIGC 研究最新方向(上)】面向平面、视觉、时尚设计的高可用 AIGC 研究方向总结

目前面向平面、视觉、时尚等设计领域的高可用 AIGC 方向有以下 4 种&#xff1a; 透明图层生成可控生成图像定制化SVG 生成 本篇&#xff08;上篇&#xff09;介绍 1、2&#xff0c;而下篇将介绍 3、4。 透明图层生成 LayerDiffuse 代表性论文&#xff1a;Transparent Imag…

请编写函数fun,该函数的功能是:实现B=A+A‘,即把矩阵A加上A的转置,存放在矩阵B中。计算结果在main函数中输出。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 请编…

redis基础(一)

启动与关闭 启动命令在/usr/local/bin目录 服务端后台启动&#xff1a;redis-server opt/redis-6.2.1/redis.conf 客户端连接&#xff1a;执行 redis-cli 关闭操作 ​ 方式1&#xff1a;进入终端后关闭 ​ 方式2&#xff1a;直接kill 掉进程 方式3&#xff1a;通过实例关闭 …

【力扣周赛】第394场周赛

文章目录 1.统计特殊字母的数量2.使矩阵满足条件的最少操作次数 1.统计特殊字母的数量 题目链接 &#x1f34e;该题涉及的小技巧&#xff1a;&#x1f425; &#x1f427;①大写字母和对应的小写字母低5位都是相等的&#xff1b; &#x1f427;②大写字母ASCII二进制第 6 位…

应用实战|只需几步,即可享有外卖订餐小程序

本示例是一个简单的外卖查看店铺点菜的外卖微信小程序&#xff0c;小程序后端服务使用了MemFire Cloud&#xff0c;其中使用到的MemFire Cloud功能包括&#xff1a; 其中使用到的MemFire Cloud功能包括&#xff1a; 云数据库&#xff1a;存储外卖微信小程序所有数据表的信息。…

实时采集麦克风并播放(springboot+webscoekt+webrtc)

项目技术 springbootwebscoektwebrtc 项目介绍 项目通过前端webrtc采集麦克风声音&#xff0c;通过websocket发送后台&#xff0c;然后处理成g711-alaw字节数据发生给广播UDP并播放。 后台处理项目使用线程池(5个线程)接受webrtc数据并处理g711-alaw字节数组放到Map容器中&…

PotatoPie 4.0 实验教程(26) —— FPGA实现摄像头图像拉普拉斯锐化

为什么要对图像进行拉普拉斯锐化 对图像进行拉普拉斯锐化的目的是增强图像的边缘和细节&#xff0c;使图像看起来更加清晰和锐利。这种技术常用于图像处理中&#xff0c;具体原因如下&#xff1a; 增强图像的边缘信息&#xff1a;拉普拉斯锐化可以突出图像中的边缘特征&#x…