moongarden5 2026-04-07 09:28 采纳率: 0%
浏览 5

paddle文字识别:制作数据集时怎么处理竖向排布的集装箱号

现在用的2.7版本训练识别集装箱号,正常横向书写的能正常训练,效果不错。但是竖向排布的集装箱号该怎么处理?用ppocrlabel标注就只直接用四点标注一个框将整个集装箱号都框完的,然后导出rec训练图片自动左旋转90度,我目前训练就是将其和正常横向书写的图片放一起直接训练的,但是训练出来对的模型,用左旋转90度的图片测试,就是乱七八糟的一串。

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-04-07 09:29
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    在使用 PaddlePaddle 的 PP-OCR 进行文字识别时,处理竖向排布的集装箱号是一个比较常见的问题。尤其是当训练数据中包含横向和竖向两种排布的文字时,模型需要具备一定的旋转鲁棒性(即对图像旋转后的识别能力)。你目前的做法是将竖向文本通过标注为一个框后,自动左旋转90度进行训练,但发现效果不佳。


    一、问题分析

    1. 标注方式不准确
      使用四点标注整个竖向集装箱号作为一个框,会导致模型无法区分其中的每个字符,进而影响识别效果。

    2. 数据增强不足
      如果只通过简单的旋转来模拟竖向文本,模型可能无法真正理解“竖向排布”的语义,导致识别失败。

    3. 训练数据不平衡
      横向与竖向样本数量差异大,或没有对竖向样本进行充分的数据增强,也会导致模型对竖向文本识别效果差。


    二、解决方案

    1. 正确标注竖向文本

    重点建议:

    不要将整个竖向集装箱号作为一个框标注,而是应该逐个字符标注。

    原因:

    • 识别模型(如 CRNN 或 Transformer)依赖于字符级别的标注
    • 将多个字符合并成一个框,会误导模型学习到错误的特征。

    正确做法:

    • 使用 ppocrlabel 工具,逐个字符标注竖向排布的集装箱号。
    • 确保每个字符的坐标信息准确,包括位置、方向和大小。

    2. 增加数据增强策略

    重点建议:

    添加旋转、翻转、仿射变换等数据增强手段,提升模型对不同方向文本的适应能力。

    示例代码(修改配置文件):

    Train:
      dataset:
        type: SimpleDataSet
        data_dir: ./train_data/
        label_file_list:
          - ./train_data/train_label.txt
        transforms:
          - type: RotateAugment
            max_rotation_degree: 90
            prob: 0.5
          - type: RandomCrop
            size: [640, 640]
            padding: [0, 0, 0]
          - type: Normalize
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            scale: 1.0 / 255.0
    

    说明:

    • RotateAugment 可以让模型学习到不同角度下的文字识别能力。
    • 你可以根据实际需求调整旋转范围(比如 0° 到 180°)。

    3. 统一训练数据格式

    重点建议:

    确保所有训练数据(横向和竖向)都采用一致的标注格式,并且包含正确的文本内容。

    推荐的标注格式(txt 文件):

    img_1.jpg	ABCD1234
    img_2.jpg	EFGH5678
    ...
    

    对于竖向文本,确保其对应的图片已经被正确旋转或标注为竖向排列。


    4. 使用多方向文本识别模型

    重点建议:

    考虑使用支持多方向文本识别的模型,如 PP-OCRv3 或 PaddleDetection + OCR 结合方案。

    推荐模型:

    • PP-OCRv3:支持多种排版(横、竖、斜)。
    • PP-Structure:可识别表格、多方向文本等复杂场景。

    5. 调整训练参数,提高竖向文本识别精度

    重点建议:

    增加竖向文本的训练权重,或使用类别平衡策略。

    示例代码(修改训练脚本):

    from paddle.io import DataLoader
    from paddle.nn import CrossEntropyLoss
    from paddle.optimizer import AdamW
    
    # 定义损失函数
    loss_fn = CrossEntropyLoss()
    
    # 定义优化器
    optimizer = AdamW(model.parameters(), learning_rate=1e-4)
    
    # 添加权重(可选)
    class_weights = [1.0, 2.0]  # 假设第1类为竖向文本,权重更高
    loss_fn.weight = class_weights
    

    说明:

    • 如果你的数据集中竖向文本较少,可以适当增加其权重,帮助模型更好地学习。

    三、推荐工作流程

    1. 使用 ppocrlabel 标注工具逐个字符标注竖向集装箱号
    2. 构建训练数据集,包含横向和竖向文本。
    3. 添加旋转、翻转等数据增强策略
    4. 使用 PP-OCRv3 或其他高级模型进行训练。
    5. 测试模型时,输入原始图片,不手动旋转,让模型自行判断方向。

    四、示例代码:标注文件结构(txt)

    images/vertical_container_01.jpg	ABCDEFGHIJKL
    images/vertical_container_02.jpg	MNOPQRSTUVWXYZ
    images/horizontal_container_01.jpg	1234567890
    images/horizontal_container_02.jpg	ABC123XYZ
    

    五、总结

    | 问题 | 解决方案 | |------|----------| | 标注方式错误 | 逐个字符标注竖向文本 | | 数据增强不足 | 添加旋转、翻转等增强策略 | | 训练数据不平衡 | 增加竖向文本权重或数据量 | | 模型选择不当 | 使用 PP-OCRv3 等支持多方向文本的模型 |


    如果你有具体的标注文件或训练日志,也可以提供给我,我可以帮你进一步分析模型表现并提出优化建议。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月7日