Paddle OCR v4 微调训练文字识别SVTRNet模型实践
paddle ocr v4 微调训练文字识别模型实践
文字识别步骤参考: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
svtr介绍
参考:https://papers.cool/arxiv/2205.00159
Q: 这篇论文试图解决什么问题?
A: 这篇论文试图解决的问题是场景文本识别(Scene Text Recognition, STR)中的效率和准确性问题。传统的场景文本识别模型通常包含两个主要部分:一个视觉模型用于特征提取和一个序列模型用于文本转录。这种混合架构虽然准确,但复杂且效率较低。为了解决这一问题,论文提出了一种名为SVTR(Single Visual model for Scene Text recognition)的新方法,该方法在图像分片(patch-wise)的框架内,完全摒弃了序列建模,仅使用单个视觉模型来完成场景文本的识别任务。
具体来说,SVTR首先将图像文本分解为小的片段,称为字符组件(character components),然后通过层次化阶段进行字符组件级别的混合、合并和/或组合操作。通过设计全局和局部混合块来感知字符间的和字符内部的模式,实现了多粒度的字符组件感知。最终,通过简单的线性预测来识别字符。这种方法在提高准确性的同时,也提高了模型的运行速度,并且具有很强的跨语言适应性。
Q: 有哪些相关研究?
A: 这篇论文中提到了以下几类相关研究:
CNN-RNN 基线模型:这类模型首先使用卷积神经网络(CNN)进行特征提取,然后将特征重塑为序列,并通过双向长短期记忆网络(BiLSTM)和连接时分类(CTC)损失来获得预测。这类模型因其效率而受到青睐,但对文本干扰(如变形、遮挡等)较为敏感,限制了其有效性。
编码器-解码器模型:这些模型将文本识别视为一个迭代解码过程,通过考虑上下文信息来提高准确性。然而,由于字符逐个转录的特性,推理速度较慢。
视觉-语言模型:这类模型进一步扩展了文本识别流程,将语言知识整合到模型中,并进行并行预测。尽管这类模型通常需要较大的容量或复杂的识别范式来确保识别准确性,这限制了它们的效率。
简化架构:最近的研究强调开发简化的架构以提高速度,例如CRNN-RNN、PREN2D和VisionLAN。这些模型在训练时使用复杂的范式,但在推理时应用简单的模型以平衡准确性和速度。
单一视觉模型:一些研究提出了基于现成的CNN或ViT作为特征提取器的识别器。尽管这些模型在效率上具有优势,但与最先进方法相比,它们的准确性竞争力较低。
论文中提出的SVTR方法旨在通过增强视觉模型来提高识别能力,通过提取具有区分性的字符特征(包括字符内部的局部模式和字符间的长期依赖性)来实现准确、快速和跨语言的场景文本识别。
Q: 论文如何解决这个问题?
A: 论文通过提出一种名为SVTR(Single Visual model for Scene Text recognition)的新方法来解决场景文本识别中的效率和准确性问题。SVTR的核心思想是完全摒弃序列建模,仅使用单个视觉模型来完成从图像到字符序列的跨模态映射。具体的解决方案包括以下几个关键步骤:
图像分片:首先将图像文本分解为小的2D块,称为字符组件(character components)。每个字符组件可能只包含字符的一部分。
层次化特征提取:设计了一个三阶段的网络结构,每个阶段都包含一系列混合块(mixing blocks),通过这些块来提取字符组件级别的特征。这些混合块分为全局混合块和局部混合块,分别用于捕捉字符间的长期依赖性和字符内部的局部模式。
全局和局部混合块:
全局混合块:评估所有字符组件之间的依赖性,建立不同字符之间的长期依赖关系。
局部混合块:评估预定义窗口内的组件之间的相关性,编码字符形态特征,并建立字符内部组件之间的关联。
合并操作:为了减少计算成本并构建文本定制的层次结构,在每个阶段(除了最后一个阶段)之后执行合并操作,通过卷积层减少高度维度,同时增加通道维度以补偿信息损失。
识别预测:在最后阶段,使用合并操作将字符组件进一步压缩成特征序列,并通过简单的并行线性预测来实现字符识别。
模型变体:通过调整SVTR中的超参数(如通道深度、头的数量、混合块的数量和排列顺序),构建了不同容量的SVTR架构变体,以满足不同的应用需求。
通过这种方法,SVTR能够在提高准确性的同时,显著提高模型的运行速度,并且具有很强的跨语言适应性。实验结果表明,SVTR在英文和中文场景文本识别任务上都取得了与现有最先进方法相当或更好的性能,同时运行速度更快。
Q: 论文做了哪些实验?
A: 论文中进行了一系列实验来验证SVTR模型的有效性,具体包括:
数据集:使用了多个英文和中文的场景文本识别数据集进行训练和测试,包括合成数据集(如MJSynth和SynthText)和真实场景数据集(如ICDAR系列、Street View Text及其变体、IIIT5K-Words、CUTE80和中文场景数据集)。
模型配置:构建了四种不同容量的SVTR架构变体(SVTR-T, SVTR-S, SVTR-B, SVTR-L),并通过实验比较了它们的性能。
消融实验:
Patch Embedding:比较了不同的图像分片策略,包括线性投影和重叠补丁嵌入,以评估其对模型性能的影响。
Mixing Block Permutation:研究了全局和局部混合块的不同排列顺序对模型性能的影响。
Merging Operation:比较了在每个阶段使用合并操作与保持恒定空间分辨率的效果。
与现有方法的比较:将SVTR与现有的场景文本识别方法进行比较,包括未使用语言信息的模型(lan-free)和使用了语言信息的模型(lan-aware)。比较了它们在多个英文和中文数据集上的识别准确性和速度。
可视化分析:可视化了SVTR-T模型在解码不同字符组件时的注意力图,以展示模型如何捕捉不同粒度的特征。
性能评估:使用字准确率(Word Accuracy)作为评估指标,对模型在各个数据集上的性能进行了定量分析。
通过这些实验,论文展示了SVTR模型在英文和中文场景文本识别任务上的优越性能,特别是在准确性、速度和跨语言适应性方面。实验结果表明,SVTR模型在多个公开基准数据集上都取得了最先进的性能,同时具有较快的推理速度和较小的模型大小。
Q: 有什么可以进一步探索的点?
A: 尽管SVTR在场景文本识别方面取得了显著的成果,但仍有一些方向可以进一步探索:
多任务学习:探索SVTR在场景文本识别之外的其他任务上的应用,例如文本检测、文本分割或与其他计算机视觉任务的结合。
鲁棒性提升:研究如何进一步提高SVTR在面对图像质量问题(如模糊、噪声、遮挡等)时的鲁棒性。
模型压缩和加速:虽然SVTR-T已经是一个小型且快速的模型,但仍然可以探索更多的模型压缩和加速技术,如知识蒸馏、模型剪枝、量化等,以便在资源受限的设备上部署。
跨域和跨语言泛化:研究SVTR在不同领域和语言之间的泛化能力,例如在多语言场景文本数据集上进行训练和测试。
端到端训练:虽然SVTR简化了模型架构,但仍然可以探索端到端训练的可能性,以进一步优化模型性能。
自适应特征提取:研究如何使SVTR能够自适应地调整其特征提取策略,以更好地适应不同类型的文本和背景。
解释性和可视化:提高模型的解释性,开发新的可视化技术来更好地理解SVTR如何通过不同的层次和组件进行文本识别。
实际应用场景:将SVTR应用于实际问题,例如自动驾驶、辅助视觉、智能监控等领域,并评估其在实际环境中的表现。
与其他模型的融合:探索将SVTR与其他类型的模型(如基于RNN、Transformer或图神经网络的模型)进行融合,以利用各自的优势。
数据集和评估协议:构建新的数据集,包含更多样化和更具挑战性的文本场景,并开发更全面的评估协议来衡量模型的性能。
通过这些进一步的探索,研究者可以继续提升场景文本识别技术的性能和实用性,推动该领域的研究进展。
Q: 总结一下论文的主要内容
A: 这篇论文的主要内容可以总结如下:
问题定义:论文针对场景文本识别(STR)中的效率和准确性问题,提出了一种新的方法,旨在提高模型的运行速度和识别准确性,同时保持跨语言的适应性。
方法提出:提出了SVTR(Single Visual model for Scene Text recognition),一种基于单个视觉模型的场景文本识别方法。SVTR通过图像分片和层次化的特征提取来避免使用序列模型,从而简化了传统STR模型的混合架构。
关键技术:
图像分片:将图像文本分解为小的2D块,称为字符组件。
混合块:设计了全局和局部混合块来分别捕捉字符间的长期依赖性和字符内部的局部模式。
合并操作:通过卷积层减少高度维度,同时增加通道维度以构建层次结构并减少计算成本。
实验验证:
在多个英文和中文场景文本数据集上进行了广泛的实验。
构建了不同容量的SVTR架构变体(SVTR-T, SVTR-S, SVTR-B, SVTR-L)。
进行了消融实验来验证所提方法的有效性。
与现有方法进行了比较,展示了SVTR在准确性、速度和参数效率方面的优势。
可视化分析:通过可视化注意力图,展示了SVTR如何捕捉不同粒度的特征,包括字符内部的局部模式和字符间的依赖性。
结论:SVTR作为一种新的STR方法,成功地提高了场景文本识别的准确性和效率,同时具有很强的跨语言适应性。论文希望SVTR能够促进场景文本识别领域的进一步研究。
训练必要性
原始模型标点符号和括号容易识别不到
数据准备
参考: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
参考: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中文模型文件
更多推荐
所有评论(0)