通用文字识别(中英文)

1 介绍

1.1 简介

通用文字识别样例基于Vision SDK进行开发,主要支持识别文本小图上的中英文字样。

1.2 支持的产品

本项目支持昇腾Atlas 300I pro、Atlas 300V pro。

1.3 支持的版本

本样例配套的Vision SDK版本、CANN版本、Driver/Firmware版本如下所示:

Vision SDK版本 CANN版本 Driver/Firmware版本
26.0.0 9.0.0 26.0.RC1

1.4 三方依赖

软件名称 版本
paddle2onnx 1.3.1
paddlepaddle 2.6.0
onnx 1.14.1

1.4 代码目录结构说明

|-- mxVision
|   |-- GeneralTextRecognition
|   |   |-- C++
|   |   |   |-- CMakeLists.txt
|   |   |   |-- main.cpp
|   |   |   |-- run.sh
|   |   |-- License.md
|   |   |-- README.md
|   |   |-- THIRD PARTY OPEN SOURCE SOFTWARE NOTICE.md
|   |   |-- data
|   |   |   |-- OCR.pipeline
|   |   |   |-- config
|   |   |   |   |-- cls
|   |   |   |   |   |-- cls.cfg
|   |   |   |   |   |-- ic15.names
|   |   |   |   |-- det
|   |   |   |   |   |-- det.cfg
|   |   |   |   |-- rec
|   |   |   |       |-- rec_cfg.txt
|   |   |   |-- model
|   |   |       |-- cls_aipp.cfg
|   |   |       |-- det_aipp.cfg
|   |   |       |-- rec_aipp.cfg
|   |   |       |-- run.sh
|   |   |-- main_ocr.py
|   |   |-- src
|   |       |-- Clipper
|   |       |   |-- CMakeLists.txt
|   |       |-- DBPostProcess
|   |       |   |-- CMakeLists.txt
|   |       |   |-- DBPostProcess.cpp
|   |       |   |-- DBPostProcess.h

1.5 相关约束

本项目支持通用文字识别,支持图片格式为jpg、jpeg、png。

2 设置环境变量

source /usr/local/Ascend/ascend-toolkit/set_env.sh   # toolkit默认安装路径,根据实际安装路径修改
source /usr/local/mxVision/set_env.sh       # sdk安装路径,根据实际安装路径修改

3 准备模型

步骤1: 模型下载。

本样例采用PaddleOCR的release/2.1分支作为基准,预训练模型请下载"PP-OCR 2.0 series model list(Update on Dec 15)"->"Chinese and English general OCR model (143.4M)" 对应的三个推理模型:

  1. Detection model: DBNet
  2. Direction classifier model: Mobilenet
  3. Recognition model: CRNN

步骤2: 将下载的3个模型tar包移动至<Project_Root>/data/model目录下。其中,Project_Root为样例代码根目录。

步骤3: 执行<Project_Root>/data/model下的run.sh脚本,等待片刻。

bash run.sh

如果执行成功,界面上会显示3段如下内容(非连续显示),表示om模型已经转换完成:

ATC start working now, please wait for a moment.
.....
ATC run success, welcome to the next use.

4 编译与运行

4.1 编译准备

步骤1: 编译clipper动态库。

Clipper网站下载clipper_ver6.4.2.zip压缩包,解压后将路径cpp下的 clipper.hpp、clipper.cpp 到<Project_Root>/src/Clipper目录下。在该目录依次执行如下命令:

mkdir build
cd build
cmake ..
make -j
make install

步骤2: 编译后处理动态库DBPostProcess。

进入到<Project_Root>/src/DBPostProcess路径目录下。依次执行如下命令:

mkdir build
cd build
cmake ..
make -j
make install

步骤3: 权限设置。

DB后处理目前支持两种缩放方式:拉伸缩放Resizer_Stretch、 等比例缩放Resizer_KeepAspectRatio_Fit。 因此,需要确保编译生成的libclipper.so和libDBPostProcess.so文件权限不高于640, 如果文件权限不满足要求, 进入到<Project_Root>/lib目录, 执行如下命令修改文件权限:

chmod 640 libclipper.so libDBPostProcess.so

执行命令,添加环境变量,其中<Project_Root>需替换为实际项目路径:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<Project_Root>/lib

步骤4: 准备字典数据。

下载文字识别模型的字典, 由于样例使用的CRNN模型,对应的字典从1开始,0代表为空,请在下载的字典首行添加一行"blank",并将修改后的字典保存到<Project_Root>/data/config/rec目录,文件命名为ppocr_keys_v1.txt, 修改示例如下:

blank
'
疗
绚
诚
娇
.
.
.

步骤5: 修改配置根目录下的配置文件。

将<Project_Root>/data/OCR.pipeline内所有deviceId字段值替换为实际使用的device的id值,可用的deviceId值可以使用如下命令查看:

npu-smi info

文本检测使用的DBNet后处理由步骤2编译得到,默认生成到"<Project_Root>/lib/libDBpostprocess.so",如有修改,请修改<Project_Root>/data/OCR.pipeline的对应配置,OCR.pipeline示例如下:

# 44行         "modelPath": "<Project_Root>/data/model/Dynamic24_ch_ppocr_server_v2.0_det_infer.om"
.
.
# 55行         "postProcessConfigPath": "<Project_Root>/data/config/det/det.cfg",
# 56行         "postProcessLibPath": "<Project_Root>/lib/libDBPostProcess.so"
.
.
# 199行        "labelPath": "<Project_Root>/data/config/rec/ppocr_keys_v1.txt",

最后,请将pipline下的所有<Project_Root>路径更换为实际的项目路径,例如/root/GeneralTextRecognition/data/config/rec/rec_cfg.txt,/root/GeneralTextRecognition为实际项目路径。

步骤6: 准备测试图片,在根目录下创建input_data目录,并将包含中英文的JPG或PNG图片拷贝到input_data目录下

4.2 c++样例运行

步骤1: 按照4.1小节中完成编译准备。

步骤2: 执行样例程序。

进入到<Project_Root>/C++目录,执行如下命令:

bash run.sh

步骤3: 查看结果。

运行完成后,会通过屏幕输出文字识别结果,示例如下:

[OCR0] GetResult ... {"MxpiTextsInfo": [{"text":["识别结果111"]}]} ..

4.2 Python样例运行

步骤1: 按照4.1小节中完成编译准备。

步骤2: 执行样例程序。

提供简易python运行样例,进入到<Project_Root>/python目录,执行如下命令:

python3 main_ocr.py

步骤3: 查看结果。

运行完成后,会通过屏幕输出文字识别结果,示例如下:

... {"MxpiTextsInfo": [{"text":["识别结果111"]}]} ..