---
comments: true
---
# 文本行方向分类模块使用教程
## 一、概述
文本行方向分类模块主要是将文本行的方向区分出来,并使用后处理将其矫正。在诸如文档扫描、证照拍摄等过程中,有时为了拍摄更清晰,会将拍摄设备进行旋转,导致得到的文本行也是不同方向的。此时,标准的OCR流程无法很好地应对这些数据。利用图像分类技术,可以预先判断文本行方向,并将其进行方向调整,从而提高OCR处理的准确性。
## 二、支持模型列表
> 推理耗时仅包含模型推理耗时,不包含前后处理耗时。表格中的“常规模式”耗时对应本地 paddle_static 推理引擎。
| 模型 | 模型下载链接 | Top-1 Acc(%) | GPU推理耗时(ms) | CPU推理耗时 (ms) | 模型存储大小(MB) | 介绍 |
|---|---|---|---|---|---|---|
| PP-LCNet_x0_25_textline_ori | 推理模型/训练模型 | 98.85 | 2.16 / 0.41 | 2.37 / 0.73 | 0.96 | 基于PP-LCNet_x0_25的文本行分类模型,含有两个类别,即0度,180度 |
| PP-LCNet_x1_0_textline_ori | 推理模型/训练模型 | 99.42 | - / - | 2.98 / 2.98 | 6.5 | 基于PP-LCNet_x1_0的文本行分类模型,含有两个类别,即0度,180度 |
| 模式 | GPU配置 | CPU配置 | 加速技术组合 |
|---|---|---|---|
| 常规模式 | FP32精度 / 无TRT加速 | FP32精度 / 8线程 | PaddleInference |
| 高性能模式 | 选择先验精度类型和加速策略的最优组合 | FP32精度 / 8线程 | 选择先验最优后端(Paddle/OpenVINO/TRT等) |
paddle_static 推理引擎,请先按照[飞桨框架安装](../paddlepaddle_installation.md)完成 PaddlePaddle 安装。
如果选择 `transformers` 作为推理引擎,请确保已配置 Transformers 环境,然后执行如下命令:
```bash
# 使用 transformers 引擎进行推理
paddleocr textline_orientation_classification -i https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/textline_rot180_demo.jpg \
--engine transformers
```
如果选择 `onnxruntime` 作为推理引擎,请确保已配置 ONNX Runtime 环境,然后执行如下命令:
```bash
# 使用 onnxruntime 引擎进行推理
paddleocr textline_orientation_classification -i https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/textline_rot180_demo.jpg \
--engine onnxruntime
```
在大多数场景下,默认的 `paddle_static` 推理引擎通常具备更好的推理性能,建议优先使用。
注:PaddleOCR 官方模型默认从 HuggingFace 获取,如运行环境访问 HuggingFace 不便,可通过环境变量修改模型源为 BOS:`PADDLE_PDX_MODEL_SOURCE="BOS"`,未来将支持更多主流模型源;
您也可以将文本行方向分类模块中的模型推理集成到您的项目中。运行以下代码前,请您下载[示例图片](https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/textline_rot180_demo.jpg)到本地。
```python
from paddleocr import TextLineOrientationClassification
model = TextLineOrientationClassification(model_name="PP-LCNet_x0_25_textline_ori")
output = model.predict("textline_rot180_demo.jpg", batch_size=1)
for res in output:
res.print(json_format=False)
res.save_to_img("./output/demo.png")
res.save_to_json("./output/res.json")
```
上述示例默认使用 paddle_static 推理引擎,请先按照[飞桨框架安装](../paddlepaddle_installation.md)完成 PaddlePaddle 安装。
如果选择 `transformers` 作为推理引擎,请确保已配置 Transformers 环境,然后执行如下代码:
```python
from paddleocr import TextLineOrientationClassification
model = TextLineOrientationClassification(
model_name="PP-LCNet_x0_25_textline_ori",
engine="transformers",
)
output = model.predict("textline_rot180_demo.jpg", batch_size=1)
for res in output:
res.print(json_format=False)
res.save_to_img("./output/demo.png")
res.save_to_json("./output/res.json")
```
如果选择 `onnxruntime` 作为推理引擎,请确保已配置 ONNX Runtime 环境,然后执行如下代码:
```python
from paddleocr import TextLineOrientationClassification
model = TextLineOrientationClassification(
model_name="PP-LCNet_x0_25_textline_ori",
engine="onnxruntime",
)
output = model.predict("textline_rot180_demo.jpg", batch_size=1)
for res in output:
res.print(json_format=False)
res.save_to_img("./output/demo.png")
res.save_to_json("./output/res.json")
```
在大多数场景下,默认的 `paddle_static` 推理引擎通常具备更好的推理性能,建议优先使用。
训练后的模型如果想使用 `paddle_dynamic` 或 `transformers` 引擎,请参考后文 [推理引擎](#五推理引擎) 中的 [权重转换](#52-权重转换) 部分将模型由 `pdparams` 格式通过 PaddleX 转换为 `safetensors` 格式。
运行后,得到的结果为:
```bash
{'res': {'input_path': 'textline_rot180_demo.jpg', 'page_index': None, 'class_ids': array([1], dtype=int32), 'scores': array([0.99864], dtype=float32), 'label_names': ['180_degree']}}
```
运行结果参数含义如下:
input_path:表示输入图片的路径。page_index:如果输入是PDF文件,则表示当前是PDF的第几页,否则为 Noneclass_ids:表示预测结果的类别 id,含有两个类别,即0度和180度。scores:表示预测结果的置信度。label_names:表示预测结果的类别名。
相关方法、参数等说明如下:
* TextLineOrientationClassification实例化文本行方向分类模型(此处以PP-LCNet_x0_25_textline_ori为例),具体说明如下:
| 参数 | 参数说明 | 参数类型 | 默认值 |
|---|---|---|---|
model_name |
含义:模型名称。 说明: 如果设置为 None,则使用PP-LCNet_x0_25_textline_ori。 |
str|None |
None |
model_dir |
含义:模型存储路径。 | str|None |
None |
device |
含义:用于推理的设备。 说明: 例如: "cpu"、"gpu"、"npu"、"gpu:0"、"gpu:0,1"。如指定多个设备,将进行并行推理。 默认情况下,优先使用 GPU 0;若不可用则使用 CPU。 |
str|None |
None |
engine |
含义:推理引擎。 说明:支持 None(默认值)、paddle、paddle_static、paddle_dynamic、transformers、onnxruntime。保持为默认值 None 时,本地推理默认使用 paddle_static 引擎。详细说明、取值、兼容性规则与示例请参见 推理引擎与配置说明。 |
str|None |
None |
engine_config |
含义:推理引擎配置。 说明:推荐与 engine 搭配使用。详细字段、兼容性规则与示例请参见 推理引擎与配置说明。 |
dict|None |
None |
enable_hpi |
含义:是否启用高性能推理。 | bool |
False |
use_tensorrt |
含义:是否启用 Paddle Inference 的 TensorRT 子图引擎。 说明: 如果模型不支持通过 TensorRT 加速,即使设置了此标志,也不会使用加速。 对于 CUDA 11.8 版本的飞桨,兼容的 TensorRT 版本为 8.x(x>=6),建议安装 TensorRT 8.6.1.6。 |
bool |
False |
precision |
含义:当使用 Paddle Inference 的 TensorRT 子图引擎时设置的计算精度。 说明: 可选项: "fp32"、"fp16"。 |
str |
"fp32" |
enable_mkldnn |
含义:是否启用 MKL-DNN 加速推理。 说明: 如果 MKL-DNN 不可用或模型不支持通过 MKL-DNN 加速,即使设置了此标志,也不会使用加速。 |
bool |
True |
mkldnn_cache_capacity |
含义:MKL-DNN 缓存容量。 | int |
10 |
cpu_threads |
含义:在 CPU 上推理时使用的线程数量。 | int |
10 |
predict() 方法进行推理预测,该方法会返回一个结果列表。另外,本模块还提供了 predict_iter() 方法。两者在参数接受和结果返回方面是完全一致的,区别在于 predict_iter() 返回的是一个 generator,能够逐步处理和获取预测结果,适合处理大型数据集或希望节省内存的场景。可以根据实际需求选择使用这两种方法中的任意一种。predict() 方法参数有 input 和 batch_size,具体说明如下:
| 参数 | 参数说明 | 参数类型 | 默认值 |
|---|---|---|---|
input |
含义:待预测数据,支持多种输入类型,必填。 说明:
|
Python Var|str|list |
|
batch_size |
含义:批大小 说明: 可设置为任意正整数。 |
int |
1 |
json文件的操作:
| 方法 | 方法说明 | 参数 | 参数类型 | 参数说明 | 默认值 |
|---|---|---|---|---|---|
print() |
打印结果到终端 | format_json |
bool |
是否对输出内容进行使用 JSON 缩进格式化 |
True |
indent |
int |
指定缩进级别,以美化输出的 JSON 数据,使其更具可读性,仅当 format_json 为 True 时有效 |
4 | ||
ensure_ascii |
bool |
控制是否将非 ASCII 字符转义为 Unicode。设置为 True 时,所有非 ASCII 字符将被转义;False 则保留原始字符,仅当format_json为True时有效 |
False |
||
save_to_json() |
将结果保存为json格式的文件 | save_path |
str |
保存的文件路径,当为目录时,保存文件命名与输入文件类型命名一致 | 无 |
indent |
int |
指定缩进级别,以美化输出的 JSON 数据,使其更具可读性,仅当 format_json 为 True 时有效 |
4 | ||
ensure_ascii |
bool |
控制是否将非 ASCII 字符转义为 Unicode。设置为 True 时,所有非 ASCII 字符将被转义;False 则保留原始字符,仅当format_json为True时有效 |
False |
||
save_to_img() |
将结果保存为图像格式的文件 | save_path |
str |
保存的文件路径,当为目录时,保存文件命名与输入文件类型命名一致 | 无 |
| 属性 | 属性说明 |
|---|---|
json |
获取预测的json格式的结果 |
img |
获取格式为dict的可视化图像 |
| model | engine | Preprocessing (ms) | Inference (ms) | PostProcessing (ms) | End-to-End (ms) |
|---|---|---|---|---|---|
| PP-LCNet_x0_25_textline_ori | paddle_static | 0.30 | 2.89 | 0.06 | 3.34 |
| paddle_dynamic | 0.28 | 6.52 | 0.08 | 6.98 | |
| transformers | 1.30 | 3.76 | 0.15 | 5.36 | |
| onnxruntime | 0.27 | 0.76 | 0.05 | 1.16 | |
| PP-LCNet_x1_0_textline_ori | paddle_static | 0.33 | 3.20 | 0.06 | 3.69 |
| paddle_dynamic | 0.29 | 7.60 | 0.07 | 8.06 | |
| transformers | 1.28 | 3.47 | 0.14 | 5.04 | |
| onnxruntime | 0.27 | 0.77 | 0.05 | 1.16 |