
PaddleOCR Text Gestalt 文本超分辨率实战基于 Stroke-Aware 的 TSRN 模型训练、评估与推理部署【免费下载链接】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/PaddleOCRText Gestalt文本完形是 PaddleOCR 提供的场景文本图像超分辨率Scene Text Image Super-Resolution, STISR算法专门用于将模糊、低分辨率LR的文字图像重建为清晰的高分辨率HR图像从而提升下游文字识别OCR的准确率。本文以 PaddleOCR 仓库中的 算法文档 为骨架结合配置、源码与推理工具完整讲解 Text Gestalt 的原理、数据准备、训练、评估、预测以及模型导出与部署的完整链路。读完本文你将能够基于 PaddleOCR 独立复现 Text Gestalt 超分辨率模型并掌握将训练权重转换为可部署推理模型的全部操作。1. Text Gestalt 算法简介Text Gestalt论文Text Gestalt: Stroke-Aware Scene Text Image Super-ResolutionChen, Jingye 等发表于 AAAI 2022是一类笔画感知Stroke-Aware的场景文本图像超分辨率算法。其核心思想是普通图像超分只关注像素重建而文本图像的超分必须同时关注文字笔画的结构完整性才能在放大分辨率的同时保持文字可读性。Paper: Text Gestalt: Stroke-Aware Scene Text Image Super-Resolution Chen, Jingye and Yu, Haiyang and Ma, Jianqi and Li, Bin and Xue, Xiangyang AAAI, 2022在 PaddleOCR 中Text Gestalt 的实现与 FudanOCR复旦大学开源仓库的text-gestalt分支一脉相承ppocr/modeling/transforms/tsrn.py顶部明确标注This code is refer from: https://github.com/FudanVI/FudanOCR/blob/main/text-gestalt/model/tsrn.py损失函数 stroke_focus_loss.py 同样源自 FudanOCR 的text-gestalt/loss/stroke_focus_loss.py因此数据准备可完全参照 FudanOCR 的 TextZoom 数据下载说明。1.1 TextZoom 测试集效果参照 FudanOCR 的数据下载说明Text Gestalt 超分算法在 TextZoom 测试集上的效果如下表所示ModelBackboneconfigAccDownload linkText Gestalttsrnconfigs/sr/sr_tsrn_transformer_strock.yml19.28 (PSNRSSIM)0.6560 (识别准确率)其中Backbone为tsrn即 TSRNText Super-Resolution Network网络Acc0.6560表示超分后的图像送入识别模型得到的文字识别准确率19.28为 PSNR 与 SSIM 之和SRMetric中以all psnr_avg ssim_avg作为主指标见下文源码分析预训练权重可从官方 bcebos 链接sr_tsrn_transformer_strock_train.tar下载文档中给出的下载地址为https://paddleocr.bj.bcebos.com/sr_tsrn_transformer_strock_train.tar。1.2 从源码看 Text Gestalt 的网络构成TSRN 网络定义于 ppocr/modeling/transforms/tsrn.py 的TSRN类其结构可以拆解为以下三大部分SR 重建主干Recurrent Residual Block Upsample首个卷积层将输入从 3 通道映射到2 * hidden_units默认hidden_units32通道中间堆叠srb_nums5个RecurrentResidualBlock循环残差块内部由Conv2D BatchNorm2D Mish GruBlock组成最后通过UpsampleBLockConv2D PixelShuffle Mish完成上采样上采样倍数由scale_factor2决定upsample_block_num int(math.log(scale_factor, 2))输出经paddle.tanh归一化得到sr_img。STN 空间变换可选当配置中STN: True时TSRN 会先通过STN_model预测控制点再经TPSSpatialTransformerTPS 薄板样条变换对输入进行形变矫正缓解场景文本的透视/弯曲问题。源码中tps_inputsize [height // scale_factor, width // scale_factor]即 STN 在低分辨率尺度上工作。Transformer 识别分支训练时冻结TSRN 内嵌一个r34_transformer Transformer()定义于 ppocr/modeling/heads/sr_rensnet_transformer.py且构造后所有参数trainable False。训练时它对超分图sr_img和高清图hr_img分别做识别产出sr_pred/hr_pred以及word_attention_map_pred/word_attention_map_gt两组注意力图用于计算笔画聚焦损失。推理时该分支不参与计算if self.training:分支跳过。TSRN.forward的输出字典在训练阶段包含sr_img、hr_img、hr_pred、sr_pred、word_attention_map_gt、word_attention_map_pred等键在推理阶段infer_modeTrue仅输出lr_img与sr_img这也与 tools/infer_sr.py 中preds[sr_img]、preds[lr_img]的取值方式一一对应。1.3 StrokeFocusLoss 笔画聚焦损失训练使用的损失函数是 StrokeFocusLoss其前向计算逻辑为mse_loss self.mse_loss(sr_img, hr_img) attention_loss paddle.nn.functional.l1_loss( word_attention_map_gt, word_attention_map_pred ) loss (mse_loss attention_loss * 50) * 100即总损失由两部分组成像素级 MSE 损失约束超分图与高清图在像素层面一致笔画注意力 L1 损失权重 50约束超分图上的文字笔画注意力图与高清图一致这正是 Text Gestalt笔画感知的核心体现整体再乘以 100 放大梯度尺度。损失内部维护的english_stroke_dict将字符映射到笔画分解序列数字见 2.3 节与SRLabelEncode中的映射保持一致。1.4 SRMetric 评估指标评估指标SRMetric定义于 ppocr/metrics/sr_metric.py它同时计算并累计 PSNR 与 SSIMcalculate_psnr基于 MSE 计算峰值信噪比mse 0时返回infcalculate_ssim使用内置的SSIM类计算结构相似度get_metric返回{psnr_avg: ..., ssim_avg: ..., all: psnr_avg ssim_avg}其中all即配置文件中Metric.main_indicator: all对应的主指标——文档表格中 Text Gestalt 的19.28正是该all值。2. 环境准备与数据准备2.1 环境配置与项目克隆请参照 环境准备 配置 PaddleOCR 运行环境包括安装 PaddlePaddle 与 PaddleOCR 依赖并参照 项目克隆 克隆当前仓库代码。2.2 数据准备TextZoomText Gestalt 训练/评估使用 TextZoom 数据集。参照 FudanOCRtext-gestalt分支的数据下载说明完成下载后将数据整理为 PaddleOCR 期望的 LMDB 格式并放置到配置指定的路径下训练数据目录./train_data/srdata/train配置Train.dataset.data_dir测试数据目录./train_data/srdata/test配置Eval.dataset.data_dir数据集中的每一条样本应包含低分辨率图image_lr、高清图image_hr以及对应的文字标签label供 LMDBDataSetSR 读取。2.3 字符笔画分解字典配置中两处引用了./train_data/srdata/english_decomposition.txtGlobal.character_dict_path 与Loss.character_dict_path。该字典的格式为每行一个字符及其笔画分解序列例如A 012345 B 023456 ...从 SRLabelEncode 的加载逻辑character, sequence line.split()与StrokeFocusLoss的读取方式character, sequence line.split()可以看到字典将字符映射为笔画数字序列0-9 数字标签编码时把单词的每个字符替换为笔画序列并以0结尾得到stroke_sequence再按english_stroke_dict 0123456789映射为整数张量input_tensor与长度length。这一字符 → 笔画序列编码是笔画聚焦机制的数据基础。3. 模型训练 / 评估 / 预测PaddleOCR 采用模块化设计训练不同模型只需修改配置文件。Text Gestalt 的完整配置见 configs/sr/sr_tsrn_transformer_strock.yml其关键模块说明如下配置模块值说明Global.model_typesr模型类型为超分辨率Architecture.algorithmGestalt算法标识为 GestaltArchitecture.Transform.nameTSRN网络主干Architecture.Transform.STNTrue启用 TPS 空间变换矫正Loss.nameStrokeFocusLoss笔画聚焦损失PostProcess.nameNone无后处理Metric.nameSRMetricPSNR SSIM 指标Metric.main_indicatorall主指标为 PSNR 与 SSIM 之和Train.dataset.nameLMDBDataSetSR训练数据读取器数据增强管道Train.dataset.transforms与Eval.dataset.transforms包含三个算子SRResizeimgH: 32, imgW: 128, down_sample_scale: 2。从 operators.py 中的 SRResize 看它把高清图缩放到(128, 32)把低清图缩放到(imgW // down_sample_scale, imgH // down_sample_scale) (64, 16)即内部生成 2 倍降采样后的 LR 图infer_modeTrue时只保留img_lr。SRLabelEncode基于笔画分解字典做标签编码产出length与input_tensor。KeepKeys按[img_lr, img_hr, length, input_tensor, label]顺序组织 DataLoader 返回值。训练超参数方面Global.epoch_num: 500、save_epoch_step: 3、eval_batch_step: [0, 1000]每 1000 个 iteration 评估一次优化器为 Adambeta1: 0.5, beta2: 0.999, clip_norm: 0.25学习率0.0001Train.loader.batch_size_per_card: 16。3.1 模型训练数据准备完成后即可开始训练# 单卡训练训练周期较长不推荐 python3 tools/train.py -c configs/sr/sr_tsrn_transformer_strock.yml # 多卡训练通过 --gpus 指定使用的 GPU 编号 python3 -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/sr/sr_tsrn_transformer_strock.yml3.2 模型评估# GPU 评估 python3 -m paddle.distributed.launch --gpus 0 tools/eval.py -c configs/sr/sr_tsrn_transformer_strock.yml -o Global.pretrained_model{path/to/weights}/best_accuracy其中Global.pretrained_model指向训练过程中保存的最佳权重save_model_dir下的best_accuracy评估输出即SRMetric的psnr_avg、ssim_avg与all。3.3 模型预测预测使用专用的 tools/infer_sr.py# 预测所用配置文件必须与训练一致 python3 tools/infer_sr.py -c configs/sr/sr_tsrn_transformer_strock.yml -o Global.pretrained_model{path/to/weights}/best_accuracy Global.infer_imgdoc/imgs_words_en/word_52.pnginfer_sr.py的推理流程对应 源码 L50-L94为将Architecture.Transform.infer_mode置为True构建模型并加载权重复用Eval.dataset.transforms构建预处理算子跳过SRLabelEncode并令SRResize.infer_modeTrue、KeepKeys只保留img_lr逐张读取Global.infer_img指定的图片前向得到sr_img与lr_img将结果乘以 255 并转置为 HWC 格式保存为infer_result/sr_{原文件名}保存目录由Global.save_visual控制默认infer_result/。输入图doc/imgs_words_en/word_52.png超分结果示例4. 推理与部署4.1 Python 推理首先需要把训练过程保存的模型导出为推理模型也可直接使用官方sr_tsrn_transformer_strock_train.tar权重python3 tools/export_model.py -c configs/sr/sr_tsrn_transformer_strock.yml -o Global.pretrained_model{path/to/weights}/best_accuracy Global.save_inference_dir./inference/sr_out导出完成后使用 tools/infer/predict_sr.py 进行 Text Gestalt 超分推理python3 tools/infer/predict_sr.py --sr_model_dir./inference/sr_out --image_dirdoc/imgs_words_en/word_52.png --sr_image_shape3,32,128参数说明--sr_model_dir导出后的推理模型目录--image_dir待超分的图像路径或目录--sr_image_shape通道数,高,宽默认3,32,128即期望的超分输出尺寸--sr_batch_num推理批大小见 predict_sr.py 的 TextSR 类。从 TextSR.resize_norm_img 可以看到Python 推理时输入图先被缩放到(imgW // 2, imgH // 2) (64, 16)作为 LR 输入与训练时down_sample_scale: 2的预处理保持一致经create_predictor创建 Paddle Inference 预测器后前向得到超分结果。执行上述命令后word_52.png的超分结果如下4.2 C 推理暂不支持。4.3 Serving 服务化部署暂不支持。4.4 更多部署方式暂不支持。5. 常见问题FAQ训练时显存不足怎么办可调低Train.loader.batch_size_per_card默认 16或num_workers并配合Global.print_batch_step观察训练进度。推理输出与预期尺寸不符请检查--sr_image_shape是否与训练配置中的SRResize.imgH/imgW一致默认3,32,128且推理配置文件必须与训练一致。识别准确率提升不明显Text Gestalt 是针对场景文本图像如 TextZoom 数据设计的对极端模糊或畸变文本建议配合 STNSTN: True与充足的低-高清成对数据训练。引用如果 Text Gestalt 对你的研究或工作有帮助请引用原论文inproceedings{chen2022text, title{Text gestalt: Stroke-aware scene text image super-resolution}, author{Chen, Jingye and Yu, Haiyang and Ma, Jianqi and Li, Bin and Xue, Xiangyang}, booktitle{Proceedings of the AAAI Conference on Artificial Intelligence}, volume{36}, number{1}, pages{285--293}, year{2022} }延伸阅读同目录下的另一超分算法Text Telescope 超分辨率算法文档文本识别训练通用流程Text Recognition Tutorial更多训练/推理脚本参见 tools/train.py、tools/eval.py 与 tools/export_model.py。【免费下载链接】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),仅供参考