ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PaddleOCR 中的 ViTSTR:基于 Vision Transformer 的快速高效场景文本识别算法实战指南

PaddleOCR 中的 ViTSTR:基于 Vision Transformer 的快速高效场景文本识别算法实战指南 PaddleOCR 中的 ViTSTR基于 Vision Transformer 的快速高效场景文本识别算法实战指南【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR导读ViTSTRVision Transformer for Fast and Efficient Scene Text Recognition是 PaddleOCR 内置的纯 Transformer 文本识别算法将 Vision TransformerViT直接应用于场景文本识别任务无需 CNN 主干与循环解码器以更少的参数实现了接近 SOTA 的识别精度。本文以 PaddleOCR 官方算法文档为核心结合仓库中的配置、源码与推理工具系统讲解 ViTSTR 的算法原理、环境准备、训练/评估/预测全流程、Python 推理部署要点与常见 FAQ帮助你在 PaddleOCR 中快速上手并落地该模型。1. 算法简介ViTSTR 出自论文Vision Transformer for Fast and Efficient Scene Text RecognitionRowel AtienzaICDAR 2021arXiv 论文链接。其核心思路非常直接把场景文本识别当作一个序列预测问题直接用 Vision Transformer 对输入图像做编码再通过分类头逐字符输出文本序列整个模型只有 ViT 编码器 分类层不包含 CNN 主干、不包含循环解码器RNN/LSTM、不包含注意力解码器。相比传统CNN 特征提取 序列建模 CTC/Attention 解码的三段式结构ViTSTR 结构更简洁、训练更快、参数量更少。PaddleOCR 在 ppocr/modeling/backbones/rec_vitstr.py 中完整复现了 ViTSTR 骨干网络并支持tiny/small/base三种规格。1.1 复现效果按照 PaddleOCR 官方文档使用MJSynth 和 SynthText两个文本识别数据集进行训练并在IIIT、SVT、IC03、IC13、IC15、SVTP、CUTE基准数据集上评估复现效果如下ModelBackboneconfigAccDownload linkViTSTRViTSTRrec_vitstr_none_ce.yml79.82%trained model注Acc 为英文场景文本识别基准上的平均准确率79.82% 是该复现配置在文档记录的评测条件下的结果。以上模型权重链接为官方文档中提供的下载地址训练/推理时可直接使用。1.2 从源码看 ViTSTR 结构在 rec_vitstr.py 中ViTSTR类继承自nn.Layer关键结构如下scale_dim_heads定义了三种规格的隐藏维度与注意力头数映射tiny: [192, 3]、small: [384, 6]、base: [768, 12]即 embed_dim 与 num_heads 的默认取值。PatchEmbed把图像切分为patch_size[16, 16]的 patch 并做线性投影modelinear来源于同仓库的 rec_svtrnet.py。cls_token与pos_embedViT 标准的可学习类别 token 与位置编码forward_features中把 cls_token 拼接在 patch 序列前并叠加位置编码。blocksdepth12层 Transformer Block复用 SVTR 的Block实现默认mlp_ratio4、qkv_biasTrue、norm_layernn.LayerNorm、act_layernn.GELU。forward取序列前seqlen27个 token对应 224×224 输入、16×16 patch 下 14×14196 个 patch 1 个 cls token共 197 个 token截取前 27 个用于序列预测转置后unsqueeze(2)输出形状可直接喂给 CTC/CE 分类头。从整体配置看见下文第 3 节ViTSTR 的识别流程是ViTSTR Backbone → SequenceEncoder(reshape) → CTCHead即把 ViT 输出的序列特征直接交给 CTC 分类头做逐帧分类。2. 环境准备ViTSTR 的训练与推理运行在 PaddleOCR 框架内无需额外安装第三方算法依赖。环境配置请参照 环境准备文档 完成 PaddleOCR 运行环境Python、PaddlePaddle、依赖包的安装项目代码请参照 项目克隆文档 克隆 PaddleOCR 仓库代码。环境就绪后即可直接使用仓库提供的脚本与配置完成后续全部流程。3. 模型训练 / 评估 / 预测PaddleOCR 对代码做了模块化设计训练不同的识别模型只需要更换配置文件。ViTSTR 对应的配置文件为 configs/rec/rec_vitstr_none_ce.yml无需改动任何代码即可切换算法。3.1 配置文件逐段解析Global: use_gpu: True epoch_num: 20 # 训练轮数 log_smooth_window: 20 print_batch_step: 10 # 每 10 个 batch 打印一次日志 save_model_dir: ./output/rec/vitstr_none_ce/ # 模型保存目录 save_epoch_step: 1 eval_batch_step: [0, 2000] # 从第 0 次迭代开始每 2000 次迭代评估一次 cal_metric_during_train: True pretrained_model: # 预训练权重路径官方复现未使用见 FAQ checkpoints: save_inference_dir: # 推理模型导出目录export_model 时指定 use_visualdl: False infer_img: doc/imgs_words_en/word_10.png # 数据与标签处理 character_dict_path: ppocr/utils/EN_symbol_dict.txt # 英文字符字典 max_text_length: 25 # 最大文本长度 infer_mode: False use_space_char: False # 是否使用空格字符 save_res_path: ./output/rec/predicts_vitstr.txtOptimizer使用Adadelta优化器epsilon: 1.e-8、rho: 0.95、clip_norm: 5.0学习率1.0这与论文的训练策略一致Architecturemodel_type: rec、algorithm: ViTSTR、in_channels: 1单通道灰度图输入Backbone 为ViTSTRscale: tinyNeck 为SequenceEncoderencoder_type: reshape仅做维度整形Head 为CTCHeadLoss使用CELosswith_all: Trueignore_index: 0注释强调必须为 0 或大于字符类别数用于屏蔽 padding 位置PostProcessViTSTRLabelDecode对应后处理实现见 rec_postprocess.pyMetricRecMetric主指标accTrain / Eval 数据集均为LMDBDataSet指向./train_data/data_lmdb_release/training/与./evaluation/transforms 依次为DecodeImage→ViTSTRLabelEncode→GrayRecResizeImg缩放到 224×224resize_type: PIL、inter_type: Image.BICUBIC→KeepKeys。其中ViTSTRLabelEncode的实现位于 label_ops.py它在字典头部追加s、/s两个特殊字符标签序列头部插入ignore_index、尾部追加 1/s的索引并补齐到max_text_len 2长度训练时batch_size_per_card: 48、drop_last: True、num_workers: 8评估时batch_size_per_card: 256。3.2 数据准备ViTSTR 的训练/评估使用 LMDB 格式数据集配置中name: LMDBDataSet。将 MJSynth 与 SynthText 数据整理为 PaddleOCR 约定的 LMDB 目录结构后放置到配置中data_dir指定的路径./train_data/data_lmdb_release/training/与./evaluation/即可。通用数据准备方法可参考 文本识别教程。3.3 训练数据准备完成后即可开始训练。训练命令如下# 单卡训练训练周期长不推荐 python3 tools/train.py -c configs/rec/rec_vitstr_none_ce.yml # 多卡训练通过 --gpus 参数指定 GPU 编号 python3 -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/rec/rec_vitstr_none_ce.yml训练过程中的模型会按save_epoch_step与eval_batch_step配置周期性保存与评估最佳模型通常保存为best_accuracy命名文件位于save_model_dir指定目录默认./output/rec/vitstr_none_ce/。3.4 评估# GPU 评估 python3 -m paddle.distributed.launch --gpus 0 tools/eval.py -c configs/rec/rec_vitstr_none_ce.yml -o Global.pretrained_model{path/to/weights}/best_accuracy通过-o参数覆盖Global.pretrained_model指向训练产出的权重文件如./output/rec/vitstr_none_ce/best_accuracy。评估将依据Global.eval_batch_step定义的迭代节奏执行并输出acc指标。3.5 预测# 预测使用的配置文件必须与训练一致 python3 tools/infer_rec.py -c configs/rec/rec_vitstr_none_ce.yml -o Global.infer_img./doc/imgs_words_en/word_10.png Global.pretrained_model./rec_vitstr_none_ce_train/best_accuracyGlobal.infer_img指定待识别图片Global.pretrained_model指定训练好的权重。预测时配置文件与训练时保持一致可保证预处理224×224 灰度缩放、PIL BICUBIC 插值与后处理链路完全对齐。4. 推理与部署4.1 Python 推理第一步导出推理模型将训练过程中保存的 ViTSTR 识别模型转换为推理模型官方文档提供 模型下载链接转换命令如下python3 tools/export_model.py -c configs/rec/rec_vitstr_none_ce.yml -o Global.pretrained_model./rec_vitstr_none_ce_train/best_accuracy Global.save_inference_dir./inference/rec_vitstr注意事项如果使用自己的数据集训练并修改了字典文件请务必同步修改配置文件中的character_dict_path为修改后的字典文件如果训练时修改了输入尺寸请同步修改 tools/export_model.py 中 ViTSTR 对应的infer_shape。从源码看导出逻辑位于 ppocr/utils/export_model.pyViTSTR 的导出输入形状被固定为[None, 1, 224, 224]单通道灰度图因此修改输入尺寸时必须同步调整该处。转换成功后目录下会生成三个文件/inference/rec_vitstr/ ├── inference.pdiparams ├── inference.pdiparams.info └── inference.pdmodel第二步执行推理使用推理模型进行 ViTSTR 文本识别命令如下python3 tools/infer/predict_rec.py --image_dir./doc/imgs_words_en/word_10.png --rec_model_dir./inference/rec_vitstr/ --rec_algorithmViTSTR --rec_image_shape1,224,224 --rec_char_dict_path./ppocr/utils/EN_symbol_dict.txt执行命令后屏幕会打印上述图片的预测结果识别文本与置信度示例如下Predicts of ./doc/imgs_words_en/word_10.png:(pain, 0.9998350143432617)参数说明--rec_algorithmViTSTR指定识别算法为 ViTSTR。从 predict_rec.py 源码看该参数决定使用ViTSTRLabelDecode后处理--rec_image_shape1,224,224输入图像形状C,H,W必须与训练/导出时的输入尺寸一致--rec_char_dict_path字符字典路径推理时使用的字典必须与训练一致。推理前处理细节源码印证在 predict_rec.py 的resize_norm_img中ViTSTR 走独立分支——先转灰度图再用 PIL 以Image.BICUBIC插值缩放到 224×224最后归一化到[0,1]/255.0而非其他算法常用的x/128 - 1归一化。这与训练阶段GrayRecResizeImgPIL BICUBIC的预处理完全对齐是保证推理精度与训练一致的关键。4.2 C 推理暂不支持。4.3 Serving 服务化部署暂不支持。4.4 更多部署方式暂不支持。5. FAQViTSTR 论文中使用了 ImageNet1k 预训练权重进行初始化训练而 PaddleOCR 的复现没有使用预训练权重最终精度是否有损失没有。官方文档记录未使用预训练权重进行训练最终精度与使用预训练权重相比没有变化甚至有所提升。因此官方配置中Global.pretrained_model留空从零开始训练即可复现文档中的效果配置文件 rec_vitstr_none_ce.yml 中pretrained_model:为空即为佐证。参考引用article{Atienza2021ViTSTR, title {Vision Transformer for Fast and Efficient Scene Text Recognition}, author {Rowel Atienza}, booktitle {ICDAR}, year {2021}, url {https://arxiv.org/abs/2105.08582} }延伸阅读算法总览见 算法概览文档 中 ViTSTR 的定位与其他识别算法的对比通用文本识别训练教程recognition.en.md推理参数全解inference_args.en.mdTIPC 自动化测试配置rec_vitstr_none_ce.yml 与 train_infer_python.txt 中包含了训练推理一体化测试的完整参数约定可据此验证训练、导出、推理全流程的可复现性。【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表