You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让PaddleOCR正确处理阿拉伯语等RTL语言的文本顺序?

如何让PaddleOCR正确处理阿拉伯语等RTL语言的文本顺序?

首先直接回应你的核心问题:

一、PaddleOCR是否有内置参数支持RTL顺序?

目前PaddleOCR的官方版本中,虽然lang='ar'可以正确识别阿拉伯语字符,但没有专门的内置参数(比如你提到的ocr_order_method)来自动适配RTL语言的文本输出顺序。它默认会以LTR(从左到右)的逻辑输出识别结果,这就导致阿拉伯语的句子或单词顺序出现反转。

二、推荐的Python后处理方案

如果没有内置选项,我们可以通过两种后处理方式来修正顺序,这里结合你的代码给出具体实现:

方法1:轻量反转(适合简单场景)

如果你的识别结果只是单纯的字符串顺序反转(比如整个句子的字符/单词倒过来了),可以直接对每个识别到的文本字符串或文本行列表进行反转:

修改你的代码中提取文本的部分:

from paddleocr import PaddleOCR, draw_ocr
from PIL import Image

ocr = PaddleOCR(use_angle_cls=True, lang='ar') 
img_path = 'image5.jpg'
result = ocr.ocr(img_path, cls=True)

# 后处理步骤:修正RTL顺序
processed_result = result[0][::-1]  # 反转整个文本行的顺序(适配多文本块从右到左的排版)
txts = []
for line in processed_result:
    original_text = line[1][0]
    fixed_text = original_text[::-1]  # 反转单个文本字符串的字符顺序
    txts.append(fixed_text)
    # 打印修正后的结果
    print(f"修正后文本: {fixed_text}, 置信度: {line[1][1]}")

# 绘制识别结果
image = Image.open(img_path).convert('RGB')
boxes = [line[0] for line in processed_result]
scores = [line[1][1] for line in processed_result]
im_show = draw_ocr(image, boxes, txts, scores, font_path='./doc/fonts/arabic.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')

方法2:专业RTL文本处理(推荐,适配复杂场景)

如果遇到阿拉伯语连写字符显示异常、或者更复杂的排版,推荐使用arabic-reshaperpython-bidi库来处理,这两个库专门解决阿拉伯语的文本方向和连写问题:

  1. 先安装依赖:
pip install arabic-reshaper python-bidi
  1. 修改你的代码,加入专业的文本修正函数:
from paddleocr import PaddleOCR, draw_ocr
from PIL import Image
import arabic_reshaper
from bidi.algorithm import get_display

# 定义阿拉伯语文本修正函数
def fix_arabic_rtl(text):
    # 处理阿拉伯语连写
    reshaped_text = arabic_reshaper.reshape(text)
    # 调整文本为RTL显示顺序
    return get_display(reshaped_text)

ocr = PaddleOCR(use_angle_cls=True, lang='ar') 
img_path = 'image5.jpg'
result = ocr.ocr(img_path, cls=True)

# 后处理:修正顺序和显示
processed_result = result[0][::-1]  # 反转文本行顺序,适配RTL排版
txts = [fix_arabic_rtl(line[1][0]) for line in processed_result]
boxes = [line[0] for line in processed_result]
scores = [line[1][1] for line in processed_result]

# 打印修正后的结果
for txt, score in zip(txts, scores):
    print(f"文本: {txt}, 置信度: {score:.2f}")

# 绘制结果
image = Image.open(img_path).convert('RGB')
im_show = draw_ocr(image, boxes, txts, scores, font_path='./doc/fonts/arabic.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')

补充说明

  • 为什么要反转processed_result?因为PaddleOCR是按LTR的顺序检测文本块的,而阿拉伯语的文本块是从右到左排列的,所以需要把整个文本行的列表反转,才能得到正确的阅读顺序。
  • 如果你的单张图片只有一行阿拉伯语文本,可能只需要反转单个字符串或者用fix_arabic_rtl函数处理即可,不需要反转文本行列表,可以根据实际情况调整。

备注:内容来源于stack exchange,提问作者SummerSoft

火山引擎 最新活动