拓冰建站拓冰建站
首页 / 资讯中心 / 正文

PaddleOCR 文本方向分类器(angle_class)实战:从数据准备、训练评估到源码原理全解析

PaddleOCR 文本方向分类器angle_class实战从数据准备、训练评估到源码原理全解析【免费下载链接】PaddleOCR飞桨多语言OCR工具包实用超轻量OCR系统支持80种语言识别提供数据标注与合成工具支持服务器、移动端、嵌入式及IoT设备端的训练与部署 Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80 languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR导读文本方向分类器angle_class也常被称为文本行方向分类/旋转矫正模块是 PaddleOCR 端到端识别链路中位于文字检测与文字识别之间的关键一环当输入图片中的文本并非正向例如整张图片旋转了 180 度时检测模型得到的文本行图片也是倒着的直接送入识别模型会严重影响识别精度。本文以 docs/version2.x/ppocr/model_train/angle_class.md 为主线结合当前仓库中的训练配置 configs/cls/cls_mv3.yml 与相关源码实现系统讲解文本方向分类器的原理、数据准备、训练/评估/预测全流程以及其底层模型结构与数据增强实现帮助你掌握在 PaddleOCR 中完整训练一个文本方向分类器的方法。1. 方法介绍为什么需要文本方向分类器文本方向分类器主要服务于图片非 0 度的应用场景。在 PaddleOCR 的系统流程中文字检测模块之后得到的文本行图片会经过仿射变换后送入识别模型如果原图整体发生了旋转最常见的场景是整幅图片旋转了 180 度那么裁剪出的文本行也是倒置的此时识别模型难以正确输出文字。PaddleOCR 内置的文本方向分类器只支持 0 度和 180 度两个类别的分类原因在于文字检测得到的文本行图片在送入识别模型前只需要判断其是否需要转正即只需区分 0 度正向与 180 度倒置两种情况。若业务场景需要支持更多角度如 90 度、270 度可以自行修改算法进行扩展后文会说明需要同步调整的配置点。需要说明的是方向分类器主要解决的是整图/文本行整体旋转的问题与针对复杂版面排版的 PP-Structure 等方向矫正模块定位不同在 PaddleOCR 的检测 → 方向分类 → 识别三阶段流程中方向分类器属于可选的中间增强模块。2. 数据准备2.1 数据目录与软链接训练数据的默认存储路径为PaddleOCR/train_data/cls。如果你的磁盘上已经准备好了数据集只需创建软链接指向该目录ln -sf path/to/dataset path/to/paddle_ocr/train_data/cls/dataset请按下文描述的组织方式来准备数据。2.2 训练集建议将训练图片放入同一个文件夹并用一个 txt 文件cls_gt_train.txt记录图片路径和标签。注意默认请将图片路径和图片标签用\t分割如使用其他方式分割将造成训练报错。其中0和180分别表示图片的角度为 0 度和 180 度 图像文件名 图像标注信息 train/cls/train/word_001.jpg 0 train/cls/train/word_002.jpg 180最终训练集应具有如下文件结构|-train_data |-cls |- cls_gt_train.txt |- train |- word_001.png |- word_002.jpg |- word_003.jpg | ...2.3 测试集测试集与训练集类似需要提供一个包含所有图片的文件夹test和一个cls_gt_test.txt标注文件结构如下|-train_data |-cls |- cls_gt_test.txt |- test |- word_001.jpg |- word_002.jpg |- word_003.jpg | ...3. 启动训练3.1 配置文件关键字段将准备好的 txt 文件和图片文件夹路径分别写入配置文件的Train/Eval.dataset.label_file_list与Train/Eval.dataset.data_dir字段。data_dir字段下的路径与 txt 文件里记载的图片名共同构成了图片的绝对路径。以 configs/cls/cls_mv3.yml 为例数据集相关字段的默认配置为Train: dataset: name: SimpleDataSet data_dir: ./train_data/cls label_file_list: - ./train_data/cls/train.txt Eval: dataset: name: SimpleDataSet data_dir: ./train_data/cls label_file_list: - ./train_data/cls/test.txt即默认使用SimpleDataSet数据集训练标注文件为train.txt、评估标注文件为test.txt与原文档中的cls_gt_train.txt/cls_gt_test.txt为同一类格式可自行命名并在配置中对应指向。PaddleOCR 提供了训练脚本、评估脚本和预测脚本分别对应 tools/train.py、tools/eval.py 与 tools/infer_cls.py。3.2 启动训练命令如果您安装的是 CPU 版本请将配置文件中的use_gpu字段修改为false。# GPU 训练支持单卡与多卡训练通过 --gpus 指定卡号。 # 启动训练下面的命令已写入 train.sh 文件中只需修改文件里的配置文件路径即可 python3 -m paddle.distributed.launch --gpus 0,1,2,3,4,5,6,7 tools/train.py -c configs/cls/cls_mv3.yml从 tools/program.py 的流程可以看到训练时会依据配置依次构建模型build_model、损失函数build_loss、优化器与后处理build_post_process并按Train.dataset中的 transforms 构建数据流水线因此配置文件的完整性与一致性直接决定了训练能否正常进行。3.3 数据增强PaddleOCR 提供了多种数据增强方式。如果希望在训练时加入扰动请在配置文件中取消Train.dataset.transforms下RecAug和RandAugment字段的注释。默认的扰动方式包括颜色空间转换cvtColor、模糊blur、抖动jitter、噪声Gaussian noise、随机切割random crop、透视perspective、颜色反转reverse以及随机数据增强RandAugment。训练过程中除随机数据增强外每种扰动方式以 50% 的概率被选择。具体代码实现可参考rec_img_aug.py其中的RecAug与BaseDataAugmentation实现了上述扰动。从源码看每种扰动crop、reverse、noise、jitter、blur、hsv默认的概率参数均为0.4*_prob0.4且tia_probTIA 透视/拉伸/畸变默认也为0.4可在实例化时按需调整原文档中以 50% 的概率被选择对应的是该类内部对扰动组件的组合选择逻辑具体以实际代码版本为准。randaugment.py实现了 RandAugment默认num_layers2、magnitude5操作池包括 shearX/shearY、translateX/translateY、rotate、color、posterize、solarize、contrast、sharpness、brightness、autocontrast、equalize、invert 等。由于 OpenCV 的兼容性问题扰动操作暂时只支持 Linux 系统。4. 训练过程中的检查点与评估节奏PaddleOCR 支持训练和评估交替进行。可以在 configs/cls/cls_mv3.yml 中修改Global.eval_batch_step设置评估频率默认每 1000 个 iter 评估一次配置中为eval_batch_step: [0, 1000]即从第 0 个 iter 起每 1000 个 iter 执行一次评估。训练过程中将会保存如下内容├── best_accuracy.pdopt # 最佳模型的优化器参数 ├── best_accuracy.pdparams # 最佳模型的参数 ├── best_accuracy.states # 最佳模型的指标和epoch等信息 ├── config.yml # 本次实验的配置文件 ├── latest.pdopt # 最新模型的优化器参数 ├── latest.pdparams # 最新模型的参数 ├── latest.states # 最新模型的指标和epoch等信息 └── train.log # 训练日志如果验证集很大测试将会比较耗时建议减少评估次数或训练完再进行评估。注意预测/评估时的配置文件请务必与训练一致。5. 评估评估数据集可以通过修改 configs/cls/cls_mv3.yml 文件里的Eval.dataset.label_file_list字段设置。export CUDA_VISIBLE_DEVICES0 # GPU 评估Global.checkpoints 为待测权重 python3 tools/eval.py -c configs/cls/cls_mv3.yml -o Global.checkpoints{path/to/weights}/best_accuracy6. 预测训练引擎的预测使用 PaddleOCR 训练好的模型可以通过以下脚本进行快速预测。通过Global.infer_img指定预测图片或文件夹路径通过Global.checkpoints指定权重# 预测分类结果 python3 tools/infer_cls.py -c configs/cls/cls_mv3.yml -o Global.pretrained_model{path/to/weights}/best_accuracy Global.load_static_weightsfalse Global.infer_imgdoc/imgs_words/ch/word_1.jpg预测图片得到输入图像的预测结果infer_img: doc/imgs_words/ch/word_1.jpg result: (0, 0.9998784)结果中的元组含义为(预测类别, 置信度)0表示该文本行被判定为 0 度正向置信度约为 0.9998784。若判定为180则说明该文本行倒置PaddleOCR 后续会将其旋转 180 度后再送入识别模型。7. 源码级原理剖析7.1 整体配置结构configs/cls/cls_mv3.yml 中方向分类器相关的核心配置如下Global: use_gpu: true epoch_num: 100 save_model_dir: ./output/cls/mv3/ save_epoch_step: 3 eval_batch_step: [0, 1000] label_list: [0,180] Architecture: model_type: cls algorithm: CLS Backbone: name: MobileNetV3 scale: 0.35 model_name: small Head: name: ClsHead class_dim: 2 Loss: name: ClsLoss Optimizer: name: Adam beta1: 0.9 beta2: 0.999 lr: name: Cosine learning_rate: 0.001 PostProcess: name: ClsPostProcess Metric: name: ClsMetric main_indicator: acc Train: dataset: transforms: - DecodeImage: img_mode: BGR channel_first: False - ClsLabelEncode: - BaseDataAugmentation: - RandAugment: - ClsResizeImg: image_shape: [3, 48, 192] - KeepKeys: keep_keys: [image, label] loader: shuffle: True batch_size_per_card: 512 drop_last: True num_workers: 8 Eval: dataset: transforms: - DecodeImage: img_mode: BGR channel_first: False - ClsLabelEncode: - ClsResizeImg: image_shape: [3, 48, 192] - KeepKeys: keep_keys: [image, label] loader: shuffle: False drop_last: False batch_size_per_card: 512 num_workers: 4值得关注的点Global.label_list: [0,180]定义了类别标签与数据标注中的0/180一一对应数据变换ClsLabelEncode会依据该列表将标签文本编码为类别索引。ClsResizeImg.image_shape: [3, 48, 192]将输入图像统一缩放为高 48、宽 192 的三通道图即[C, H, W]。训练使用Adam优化器 Cosine余弦学习率初始 0.001 L2 正则factor 0训练 100 个 epoch。评估/训练的数据增强不同训练侧包含BaseDataAugmentation与RandAugment评估侧仅做解码与 resize不做扰动以保证评估指标稳定可复现。7.2 模型结构MobileNetV3 ClsHead方向分类器的模型由Backbone Head组成BackboneMobileNetV3scale0.35、model_namesmall作为轻量特征提取网络HeadClsHead实现在 ppocr/modeling/heads/cls_head.py。ClsHead的 forward 流程为输入特征图先经过AdaptiveAvgPool2D(1)全局平均池化reshape 成[batch, channels]后送入全连接层fc输入维度in_channels输出维度class_dim2。训练阶段直接输出 logits推理阶段not self.training会对输出做 softmax得到两个类别的概率分布这也是预测结果中置信度的来源。从源码结构可以推断class_dim即分类类别数。因此若要扩展支持 90 度、270 度等更多角度需要同步修改Global.label_list与Head.class_dim并准备对应角度的标注数据与模型输出映射逻辑。7.3 损失函数交叉熵分类损失ClsLoss实现在 ppocr/losses/cls_loss.py内部直接使用paddle.nn.CrossEntropyLoss(reductionmean)将 batch 中的标签转为 int64 后与模型预测的 logits 计算平均交叉熵损失返回{loss: loss}供训练框架使用。7.4 后处理argmax 解码后处理ClsPostProcess实现在 ppocr/postprocess/cls_postprocess.py。其核心逻辑是对 softmax 后的预测概率沿axis1取argmax得到类别索引再通过label_list映射回0/180这样的类别名并取出对应的置信度最终返回形如(0, 0.9998784)的(类别, 置信度)列表。7.5 评估指标分类准确率评估指标ClsMetric实现在 ppocr/metrics/cls_metric.py主指标为acc统计预测类别与真实类别一致的样本数correct_num除以总样本数all_num得到分类准确率并加了eps1e-5防止除零。训练日志与评估输出中的acc即来源于此。7.6 预测脚本调用链tools/infer_cls.py 是分类预测的入口其核心流程为依据配置构建后处理build_post_process与模型build_model通过load_model加载Global.pretrained_model指定的权重复用Eval.dataset.transforms构建预测数据流水线跳过Label类算子并将KeepKeys收缩为只保留image对Global.infer_img指定的图片或文件夹内所有图片逐张前向推理输出(类别, 置信度)结果。8. 总结与实践建议文本方向分类器是 PaddleOCR 在非正向文本场景下保证识别精度的关键模块。完整流程可归纳为按train/cls目录结构 \t分隔的标注文件准备数据 → 修改 configs/cls/cls_mv3.yml 中的data_dir与label_file_list→ 执行训练/评估/预测脚本。其中label_list、class_dim、ClsResizeImg输入尺寸、数据增强开关等配置直接影响模型行为。实践建议若图片整体旋转 180 度场景较多务必训练并串联方向分类器PaddleOCR 训练好的文本方向分类模型在识别链路中的默认用法可参考 tools/infer/ 下的相关推理入口。数据标注务必使用\t分隔图片路径与标签否则训练会报错。评估与预测时使用的配置文件必须与训练保持一致尤其是Transforms、label_list与模型结构字段。训练样本建议同时包含 0 度和 180 度两类、且文本行内容多样不同字体、颜色、背景以提升分类器的泛化能力训练时可开启RecAug/RandAugment增强抗干扰能力。参考源码与配置索引原文档docs/version2.x/ppocr/model_train/angle_class.md训练配置configs/cls/cls_mv3.yml分类头实现ppocr/modeling/heads/cls_head.py损失函数ppocr/losses/cls_loss.py后处理实现ppocr/postprocess/cls_postprocess.py评估指标ppocr/metrics/cls_metric.py数据增强ppocr/data/imaug/rec_img_aug.py、ppocr/data/imaug/randaugment.py训练/评估/预测脚本tools/train.py、tools/eval.py、tools/infer_cls.py【免费下载链接】PaddleOCR飞桨多语言OCR工具包实用超轻量OCR系统支持80种语言识别提供数据标注与合成工具支持服务器、移动端、嵌入式及IoT设备端的训练与部署 Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80 languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门