From fdcc9e1d7aa63365f3ee27204752e4229b47b0d7 Mon Sep 17 00:00:00 2001 From: anan505 <1204828624@qq.com> Date: Fri, 6 Dec 2024 11:07:02 +0000 Subject: [PATCH 1/4] update mxVision/OpticalCharacterRecognition/README.md. Signed-off-by: anan505 <1204828624@qq.com> --- .../OpticalCharacterRecognition/README.md | 437 ++++++------------ 1 file changed, 142 insertions(+), 295 deletions(-) diff --git a/mxVision/OpticalCharacterRecognition/README.md b/mxVision/OpticalCharacterRecognition/README.md index e8ec4b32a..5e78164ba 100644 --- a/mxVision/OpticalCharacterRecognition/README.md +++ b/mxVision/OpticalCharacterRecognition/README.md @@ -1,34 +1,37 @@ -# OCR +# 基于MxBase接口的OCR字符识别 -# 1 简介 +## 1 介绍 +### 1.1 简介 -## 1.1 背景介绍 -本参考设计的目的主要包括以下几个方面: +开发样例是基于mxBase开发的OCR应用,实现识别输入图片中的文字功能。 -1.为金融、安防、互联网等客户提供基于Atlas做OCR的参考样例,验证可行性; +### 1.2 支持的产品 -2.作为客户基于mxBase开发OCR应用的编程样例(下称Demo),开放源代码给客户参考,降低客户准入门槛; +本项目支持昇腾Atlas 300I pro、 Atlas 300V pro。 -3.提供新架构下系统优化案例,打造超高性能原型系统,为客户提供选择Atlas的理由。 +### 1.3 支持的版本 +本样例配套的MxVision版本、CANN版本、Driver/Firmware版本如下所示: -本Demo模型选择是面向直排文本,不考虑弯曲文本的情况,并选择JPEG作为输入图像格式,实现识别输入图片中的文字功能。本文档提供对OCR Demo实现方案的说明。 +| MxVision版本 | CANN版本 | Driver/Firmware版本 | +| --------- |---------| -------------- | +| 6.0.RC3 | 8.0.RC3 | 24.1.RC3 | -## 1.2 支持的产品 +### 1.4 三方依赖 -本系统采用Atlas 300I Pro, Atlas 300V Pro作为实验验证的硬件平台。 +第三方依赖软件和版本如下表。请确认环境已安装pip3后,使用`pip3 install * `安装以下依赖: -## 1.3 软件方案介绍 +|软件名称 | 版本 | +|-----------|-----------| +| numpy | 1.24.0 | +| paddle2onnx | 1.2.4 | +| paddlepaddle | 2.6.0 | +| tqdm | 4.66.5 | +| shapely | 2.0.6 | +| joblib | 1.4.2 | -软件方案包含OCR的三个环节:文本检测,方向分类,字符识别。其中文本检测和字符识别是必要环节,方向分类为可选环节。 - -本Demo支持基于Paddle PP-OCR server 2.0的DBNet(检测)和CRNN(识别)模型在310P芯片上进行静态分档推理以及CRNN(识别)模型在310P芯片上进行动态shape推理。为了提高CPU、NPU资源利用率,实现极致性能,Demo采用了流水并行及多路并行处理方案。 - -### 代码主要目录介绍 - -本Demo根目录下src为源码目录,现将src的子目录介绍如下: -**注意**:代码目录中的src/AscendBase/Base/Framework/ModuleProcessors/TextDetectionPost/下的clipper.cpp、clipper.hpp为开源第三方模块,Demo中不包含这两个文件,需用户自行下载这两个文件,然后放在对应位置。 -clipper.cpp、clipper.hpp文件下载链接:https://udomain.dl.sourceforge.net/project/polyclipping/clipper_ver6.4.2.zip +### 1.5 代码目录结构说明 +本工程名称为OpticalCharacterRecognition,工程目录如下图所示: ``` . @@ -82,303 +85,178 @@ clipper.cpp、clipper.hpp文件下载链接:https://udomain.dl.sourceforge.net │ │ ├── dbnet ├── README.md ``` +**注意**:代码目录中的`src/AscendBase/Base/Framework/ModuleProcessors/TextDetectionPost/`下的`lipper.cpp`、`clipper.hpp`为开源第三方模块,需用户自行下载这两个文件,然后放在对应位置。 -# 2 环境搭建 - -### 2.1 软件依赖说明 +- clipper.cpp、clipper.hpp文件[下载链接](https://sourceforge.net/projects/polyclipping/files/clipper_ver6.4.2.zip/download), 在文件夹`cpp`下可以找到。 -**表2-1** 软件依赖说明 +### 1.6 相关约束 -| 依赖软件 | 版本 | 依赖说明 -| ------------- |--------------| ---------------------| -| CANN | 7.0.RC1 | 提供基础acl/himpi接口 | -| mxVision | 5.0.RC3 | 提供基础mxBase的能力 | +本样例是面向直排文本,不考虑弯曲文本的情况,仅支持JPEG作为输入图像格式。 -### 2.2 CANN环境变量设置 +## 2 设置环境变量 ```bash -. ${CANN_INSTALL_PATH}/ascend-toolkit/set_env.sh -``` - -### 2.3 mxVision环境变量设置 +#设置CANN环境变量 +. ${ascend-toolkit-path}/set_env.sh -```bash -. ${MX_SDK_HOME}/set_env.sh +#设置MindX SDK 环境变量,SDK-path为mxVision SDK 安装路径 +. ${SDK-path}/set_env.sh ``` -# 3 模型转换及数据集获取 +## 3 准备模型 -## 3.1 Demo所用模型下载地址 +**步骤1:** 下载模型 -Paddle PP-OCR server 2.0模型: +Paddle PP-OCR server 2.0模型(`.onnx`格式文件): | 名称 | 下载链接 | | --------------- | -------------- | -| Paddle PP-OCR server 2.0 DBNet | https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_infer.tar| -| Paddle PP-OCR server 2.0 Cls | https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar| -| Paddle PP-OCR server 2.0 CRNN | https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_infer.tar| - -识别模型字典文件下载地址: -https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/release/2.5/ppocr/utils/ppocr_keys_v1.txt - - -## 3.2 Demo所用测试数据集下载地址 -数据集ICDAR-2019 LSVT下载地址: - - -| 名称 | 下载链接 | -|---------|----------| -| 图片压缩包1 | https://dataset-bj.cdn.bcebos.com/lsvt/train_full_images_0.tar.gz| -| 图片压缩包2 | https://dataset-bj.cdn.bcebos.com/lsvt/train_full_images_1.tar.gz| -| 标注文件 | https://dataset-bj.cdn.bcebos.com/lsvt/train_full_labels.json| +| Paddle PP-OCR server 2.0 DBNet | [ch_ppocr_server_v2.0_det_infer.onnx](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/mxVision/OpticalCharacterRecognition/ch_ppocr_server_v2.0_det_infer.onnx) | +| Paddle PP-OCR server 2.0 Cls | [ch_ppocr_mobile_v2.0_cls_infer.onnx](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/mxVision/OpticalCharacterRecognition/ch_ppocr_mobile_v2.0_cls_infer.onnx) | +| Paddle PP-OCR server 2.0 CRNN | [ch_ppocr_server_v2.0_rec_infer_argmax.onnx](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/mxVision/OpticalCharacterRecognition/ch_ppocr_server_v2.0_rec_infer_argmax.onnx) | -图片压缩包名为 train_full_images_0.tar.gz 与 train_full_images_1.tar.gz +**步骤2:** 放置模型文件 -标签文件名为 train_full_labels.json +将下载的文件放置在路径`OpticalCharacterRecognition/src/data/models`下对应的文件夹内。 -### 3.2.1 数据集准备 +**步骤3:** 模型转换 -#### 3.2.1.1 数据集下载 -命令参考 -``` -wget https://dataset-bj.cdn.bcebos.com/lsvt/train_full_images_0.tar.gz -wget https://dataset-bj.cdn.bcebos.com/lsvt/train_full_images_1.tar.gz -wget https://dataset-bj.cdn.bcebos.com/lsvt/train_full_labels.json +在三个模型目录下分别执行对应的atc转换脚本: +```bash +bash atc.sh ``` +执行完模型转换脚本后,若提示如下信息说明模型转换成功,并可以找到对应的`.om`模型文件。 -#### 3.2.1.2 数据集目录创建 -创建数据集目录 -``` -mkdir -p ./icdar2019/images -``` -#### 3.2.1.3 解压图片并移动到对应目录 -解压图片压缩包并移动图片到对应目录 -``` -tar -zvxf ./train_full_images_0.tar.gz -tar -zvxf ./train_full_images_1.tar.gz -mv train_full_images_0/* ./icdar2019/images -mv train_full_images_1/* ./icdar2019/images -rm -r train_full_images_0 -rm -r train_full_images_1 ``` -#### 3.2.1.4 标签格式转换 -label文件格式转换为ICDAR2015格式, 转换脚本位于src/Common/LabelTrans/label_trans.py - -运行标签格式转换脚本工具需要依赖的三方库如下所示: -**表3-1** label_trans.py依赖python三方库 - -| 名称 | 版本 | -| --- | --- | -| numpy | =1.22.4 | -| tqdm | =4.64.0 | +ATC run success, welcome to the next use. +``` +**步骤4:** CRNN模型文件放置 -格式转换脚本参考如下: -``` -python3 ./label_trans.py --label_json_path=/xx/xx/train_full_labels.json --output_path=/xx/xx/icdar2019/ +在`OpticalCharacterRecognition/src/data/models/crnn`下应该可以看到5个`.om`模型文件,在该目录下执行以下命令将`.om`模型文件都移动到新建目录`OpticalCharacterRecognition/src/data/models/crnn/static`目录下: +```bash +mkdir static +mv crnn_dynamic_dims_16_bs1.om ./static +mv crnn_dynamic_dims_16_bs4.om ./static +mv crnn_dynamic_dims_16_bs8.om ./static +mv crnn_dynamic_dims_16_bs16.om ./static +mv crnn_dynamic_dims_16_bs32.om ./static ``` -## 3.3 pdmodel模型转换为onnx模型 -- **步骤 1** 将下载好的paddle模型转换成onnx模型。 - 执行以下命令安装转换工具paddle2onnx +## 4 编译与运行 - ``` - pip3 install paddle2onnx==0.9.5 - ``` - 运行paddle2onnx工具需要依赖的三方库如下所示: +**步骤1:** 准备数据集 -**表3-2** paddle2onnx依赖python三方库 +1. 准备识别模型字典文件: -| 名称 | 版本 | -| --- | --- | -| paddlepaddle | 2.3.0 | +- 可通过[下载地址](https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/release/2.5/ppocr/utils/ppocr_keys_v1.txt)直接下载文件; -PP-OCR server 2.0 DBNet模型转成onnx模型指令参考如下: -``` -paddle2onnx --model_dir ./ch_ppocr_server_v2.0_det_infer/ --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./ch_ppocr_server_v2.0_det_infer.onnx --opset_version 11 --enable_onnx_checker True --input_shape_dict="{'x':[-1,3,-1,-1]}" -``` - -PP-OCR server 2.0 CRNN模型转成onnx模型指令参考如下: -``` -paddle2onnx --model_dir ./ch_ppocr_server_v2.0_rec_infer/ --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./ch_ppocr_server_v2.0_rec_infer.onnx --opset_version 11 --enable_onnx_checker True --input_shape_dict="{'x':[-1,3,32,-1]}" -``` - -PP-OCR server 2.0 Cls模型转成onnx模型指令参考如下: -``` -paddle2onnx --model_dir ./ch_ppocr_mobile_v2.0_cls_infer --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./ch_ppocr_mobile_v2.0_cls_infer.onnx --opset_version 11 --enable_onnx_checker True +- 或者通过以下指令下载: +```bash +wget -O ppocr_keys_v1.txt https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/release/2.5/ppocr/utils/ppocr_keys_v1.txt ``` -## 3.4 识别模型插入ArgMax算子 -- **步骤 2** 使用算子插入工具insert_argmax给字符识别模型(CRNN)插入argmax算子。 - -转到src/Common/InsertArgmax目录下,执行脚本,此处需要传入两个参数:'model_path',对应ch_ppocr_server_v2.0_rec_infer.onnx模型所在路径;'check_output_onnx',为是否需要针对输出模型做校验,默认值为True,可选choices=[True, False] - -使用算子插入工具insert_argmax插入argmax算子指令参考: - ``` - python3 insert_argmax.py --model_path /xx/xx/ch_ppocr_server_v2.0_rec_infer.onnx --check_output_onnx True - ``` -**表3-3** 使用自动算子插入工具插入argmax算子。 -|参数名称 | 参数含义 | 默认值 | 可选值 | -| --- | --- | --- | --- | -| model_path | 对应ch_ppocr_server_v2.0_rec_infer.onnx模型所在路径 |''|''| -| check_output_onnx | 是否需要针对输出模型做校验 | True|True,False| -转换出来的结果位于'model_path'路径下,命名为'ch_ppocr_server_v2.0_rec_infer_argmax.onnx'的onnx模型文件。 +2. 准备数据集ICDAR-2019 LSVT: -**表3-4** insert_argmax.py脚本依赖python三方库 +- 可通过下方表格的下载链接直接下载; -| 名称 | 版本 | -| --- | --- | -| onnx | >=1.9.0 | -| onnxruntime | >=1.13.1 | - -## 3.5 模型转换 +| 名称 | 下载链接 | +|---------|----------| +| 图片压缩包1 | (train_full_images_0.tar.gz)[https://dataset-bj.cdn.bcebos.com/lsvt/train_full_images_0.tar.gz]| +| 图片压缩包2 | (train_full_images_1.tar.gz)[https://dataset-bj.cdn.bcebos.com/lsvt/train_full_images_1.tar.gz]| +| 标注文件 | (train_full_labels.json)[https://dataset-bj.cdn.bcebos.com/lsvt/train_full_labels.json]| -****进行模型转换前需设置CANN环境变量**** 默认的路径为 -``` -. /usr/local/Ascend/ascend-toolkit/set_env.sh +- 或通过指令下载: +```bash +wget https://dataset-bj.cdn.bcebos.com/lsvt/train_full_images_0.tar.gz +wget https://dataset-bj.cdn.bcebos.com/lsvt/train_full_images_1.tar.gz +wget https://dataset-bj.cdn.bcebos.com/lsvt/train_full_labels.json ``` -请以实际安装路径为准。 -### 3.5.1 文本检测模型转换 -将文本检测onnx模型转换成om模型,转换指令参考src/data/models/dbnet目录下面的对应的atc转换脚本(ONNX模型路径以实际为准): -``` -bash atc.sh -``` +**步骤2:** 解压并放置数据集 -### 3.5.2 字符识别模型转换 -字符识别支持静态分档模型和动态shape模型两种场景,可通过配置文件setup.config任选其一,详细说明见章节4.2。 -#### 3.5.2.1 静态分档模型 -在静态分档模型场景下,将字符识别onnx模型转换成om模型,转换指令参考src/data/models/crnn目录下面的对应的atc转换脚本atc.sh(ONNX模型路径以实际为准): -``` -bash atc.sh -``` -可在该目录下新建static目录,将转换生成的模型可统一放置static目录内,用于配置文件recModelPath字段的配置。 -#### 3.5.2.2 动态shape模型 -在动态Shape模型场景下,字符识别onnx模型转换成om模型,转换指令参考src/data/models/crnn目录下面的对应的atc转换脚本atc_dynamic.sh(ONNX模型路径以实际为准): -``` -bash atc_dynamic.sh -``` -### 3.5.3 分类模型转换 -将onnx模型转换成om模型。转换指令参考src/demo/data/models/cls目录下面的对应的atc转换脚本(ONNX模型路径以实际为准): +1. 通过以下指令在当前位置创建数据集目录: +```bash +mkdir -p ./icdar2019/images ``` -bash atc.sh +2. 在当前目录下解压图片并移动到对应目录: +```bash +tar -zvxf ./train_full_images_0.tar.gz # 确认当前目录下有对应数据包 +tar -zvxf ./train_full_images_1.tar.gz +mv train_full_images_0/* ./icdar2019/images +mv train_full_images_1/* ./icdar2019/images +rm -r train_full_images_0 +rm -r train_full_images_1 ``` -# 4 编译运行 - -## 4.1 系统方案各子模块功能介绍 -**表4-1** 系统方案各子模块功能: +**步骤3:** 标签格式转换 -| 序号 | 子系统 | 功能描述 | -| --- | --- | --- | -| 1 | 图片分发模块 | 从用户指定的文件夹读取图片,并分发给后续的模块。 | -| 2 | DBNet模型前处理 | 主要负责解码和缩放,在310P芯片上使用dvpp解码。 | -| 3 | DBNet模型推理 | 本模块负责将前处理好的图片输入进检测模型并获得模型推理出的Tensor。 | -| 4 | DBNet模型后处理 | 本模块主要负责将输出的Tensor根据与训练一致的后处理流程将输入图片切割为包含文本的子图。 | -| 5 | Cls模型前处理 | 对dbnet后处理之后切割的子图做resize和归一化操作以及分类模型推理时的batch划分 | -| 6 | Cls模型推理 | 本模块负责将前处理好的图片输入进分类模型并获得模型推理出的Tensor。 | -| 7 | Cls模型后处理 | 将模型输出的Tensor根据与训练一致的后处理流程将需要翻转的子图翻转180度。| -| 8 | Crnn模型前处理 | 对dbnet后处理之后切割的子图做resize和归一化操作以及识别模型推理时的batch划分 | -| 9 | Crnn模型推理 | 本模块负责将前处理好的图片输入进识别模型并获得模型推理出的Tensor。支持动态shape和静态分档的推理。 | -| 10 | Crnn模型后处理 | 将模型输出的Tensor根据字典转换为文字识别的结果。 | -| 11 | 推理结果保存模块 | 保存推理结果,并在推理结束时发送停止信号。 | +label标注文件格式转换为ICDAR2015格式, 执行的转换脚本为`OpticalCharacterRecognition/src/Common/LabelTrans/label_trans.py`。 -## 4.2 配置 +执行命令: +```bash +python3 ./label_trans.py --label_json_path=/xx/xx/train_full_labels.json --output_path=/xx/xx/icdar2019/ +``` -运行前需要在 `/src/data/config/setup.config` 配置以下信息 +**步骤4:** 修改配置文件 -配置程序运行的deviceId,deviceType及模型路径等信息 -**注意**:如果输入图片中包含敏感信息,使用完后请按照当地法律法规要求自行处理,防止信息泄露。 -配置device + 修改配置文件`OpticalCharacterRecognition/src/data/config/setup.config`: + 1. 第5行修改推理使用的device的ID: ```bash deviceId = 0 // 进行推理的device的id - deviceType = 310P //310P ``` - -配置模型路径 +2. 第28行配置文本识别模型字符标签文件: ```bash - detModelPath = ./data/models/dbnet/dbnet_dy_dynamic_shape.om // DbNet模型路径 - recModelPath = ./data/models/crnn/static // CRNN模型路径,静态分档时仅需输入包含识别模型的文件夹的路径即可,动态shape时需要输入模型的路径 - clsModelPath = ./data/models/cls/cls_310P.om // CLS模型路径 + dictPath = dictPath = /path/to/ppocr_keys_v1.txt // 识别模型字典文件 ``` -配置文本识别模型输入要求的高、宽的步长 - ```bash - staticRecModelMode = true // true时采用静态分档,false时采用动态shape - recHeight = 32 // 识别模型输入要求的高,需和crnn转om模型的参数对应 [仅需在使用动态shape模型时配置] - recMinWidth = 32 // 识别模型输入宽的最小值,需和crnn转om模型的参数对应 [仅需在使用动态shape模型时配置] - recMaxWidth = 4096 // 识别模型输入宽的最大值,需和crnn转om模型的参数对应 [仅需在使用动态shape模型时配置] - ``` +**步骤5:** 编译项目 -配置文本识别模型字符标签文件 +在目录`OpticalCharacterRecognition/src/`下执行: ```bash - dictPath = ./data/models/crnn/ppocr_keys_v1.txt // 识别模型字典文件 + bash build.sh ``` +编译完成后,在`OpticalCharacterRecognition/src/dist/`目录下会生成可执行文件`main`。 -配置识别文字的输出结果路径 - ```bash - saveInferResult = false // 是否保存推理结果到文件,默认不保存,如果需要,该值设置为true,并配置推理结果保存路径 - resultPath = ./result // 推理结果保存路径 - ``` -**注意**:推理结果写文件是追加写的,如果推理结果保存路径中已经存在推理结果文件,推理前请手动删除推理结果文件,如果有需要,提前做好备份。 - -## 4.3 编译 - -- **步骤 1** 登录服务器操作后台,安装CANN及mxVision并设置环境变量。 - -- **步骤 2** 将mxOCR压缩包下载至任意目录,如“/home/HwHiAiUser/mxOCR”,解压。 +**步骤6:** 准备输入图片 -- **步骤 3** 执行如下命令,构建代码。 - - ``` - cd /home/HwHiAiUser/mxOCR/OpticalCharacterRecognition/src/; - bash build.sh - ``` +需要使用的输入图片必须为JPEG格式,图片名格式为前缀+下划线+数字的形式,如`xxx_xx.jpg`。 +将需要输入的图片放在目录`/xx/xx/icdar2019/images/`下。 - *提示:编译完成后会生成可执行文件“main”,存放在“/home/HwHiAiUser/mxOCR/OpticalCharacterRecognition/src/dist/”目录下。* - ## 4.4 运行 - **注意 C++ Demo 运行时日志打印调用的是mxVision里面的日志模块,mxVision默认打印日志级别为error,如果需要查看info日志,请将配置文件logging.conf中的console_level值设为0。** - logging.conf文件路径:mxVison安装目录/mxVision/config/logging.conf +**步骤7:** 运行程序 - ### 输入图像约束 +执行如下命令,启动程序: - 仅支持JPEG格式,图片名格式为前缀+下划线+数字的形式,如xxx_xx.jpg。 - - ### 运行程序 - **注意 在模型的档位较多,或者设置并发数过大的情况下,有可能会导致超出device内存。请关注报错信息。** - - 执行如下命令,启动程序。 - - ``` - ./dist/main -image_path /xx/xx/icdar2019/images/ -thread_num 1 -direction_classification false -config ./data/config/setup.config - ``` +```bash +./dist/main -image_path /xx/xx/icdar2019/images/ -thread_num 1 -direction_classification false -config ./data/config/setup.config +``` +运行可使用的参数说明: - 根据屏幕日志确认是否执行成功。 +| 选项 | 意义 | +| --- | --- | +| -image_path | 输入图片所在的文件夹路径。 | +| -thread_num | 运行程序的线程数,取值范围1-4,请根据环境内存设置合适值。 | +| -direction_classification | 是否在检测模型之后使用方向分类模型。 | +| -config | 配置文件setup.config的完整路径。 | - 识别结果默认存放在“/home/HwHiAiUser/mxOCR/OpticalCharacterRecognition/src/result”目录下。 +**步骤8:** 查看结果 -*提示:输入./dist/main -h可查看该命令所有信息。运行可使用的参数如表4-2 运行可使用的参数说明所示。* +- 结果位置: -**表4-2** 运行可使用的参数说明 +根据屏幕日志确认是否执行成功。 -| 选项 | 意义 | 默认值 | -| --- | --- | --- | -| -image_path | 输入图片所在的文件夹路径 | ./data/imagePath | -| -thread_num | 运行程序的线程数,取值范围1-4,请根据环境内存设置合适值。 | 1 | -| -direction_classification | 是否在检测模型之后使用方向分类模型。 | false | -| -config | 配置文件setup.config的完整路径。 | ./data/config/setup.config | +识别结果默认存放在`OpticalCharacterRecognition/src/result`目录下。 -*提示:image_path路径下包含的图片会根据thread_num数目进行数据集分割,分割结果存放在/**/**/OpticalCharacterRecognition/src/data/config目录下。* +**注意**:推理结果写文件是追加写的,如果推理结果保存路径中已经存在推理结果文件,推理前请手动删除推理结果文件,如果有需要,提前做好备份。 -### 结果展示 +- 结果内容: -OCR识别结果保存在配置文件中指定路径的infer_img_x.txt中(x 为图片id) -每个infer_img_x.txt中保存了每个图片文本框四个顶点的坐标位置以及文本内容,格式如下: +每个infer_img_x.txt(x 为图片id)中保存了每个图片文本框四个顶点的坐标位置以及文本内容,格式如下: ```bash 1183,1826,1711,1837,1710,1887,1181,1876,签发机关/Authority 2214,1608,2821,1625,2820,1676,2212,1659,有效期至/Dateofexpin @@ -388,62 +266,31 @@ OCR识别结果保存在配置文件中指定路径的infer_img_x.txt中(x 为 ``` **注意**:如果输入图片中包含敏感信息,使用完后请按照当地法律法规要求自行处理,防止信息泄露。 -# 4.5 动态库依赖说明 -Demo动态库依赖可参见代码中“src”目录的“CMakeLists.txt”文件中“target_link_libraries”参数处。 +# 5 精度验证 -**表4-3** 动态库依赖说明 +**步骤1:** 准备验证数据集 -| 依赖软件 | 说明 | -| --- | --- | -| libascendcl.so | ACL框架接口,具体介绍可参见ACL接口文档。 | -| libacl_dvpp.so | ACL框架接口,具体介绍可参见ACL接口文档。 | -| libpthread.so | C++的线程库。 | -| libglog.so | C++的日志库。 | -| libopencv_world.so | OpenCV的基本组件,用于图像的基本处理。| -| libmxbase.so | 基础SDK的基本组件,用于模型推理及内存拷贝等。| +执行完“4 编译与运行”的“步骤2”后的`icdar2019/images`为测试所用的所有输入图片。 -# 5 精度测试脚本使用 +**步骤2:** 生成运行结果 -## 5.1 依赖python三方库安装 +按照上述的“4 编译与运行”完成所有输入图片的结果生成。 -精度测试脚本运行依赖的三方库如表5-1所示 +**步骤3:** 进行精度计算 -**表5-1** 依赖python三方库 - -| 名称 | 版本 | -| --- | --- | -| shapely | >=1.8.2 | -| numpy | >=1.22.4 | -| joblib | >=1.1.0 | -| tqdm | >4.64.0 | - -安装命令 - ``` - pip3 install + 包名 - ``` - -## 5.2 运行 - -### 运行程序 - -- **步骤 1** 将mxOCR压缩包下载至任意目录,如“/home/HwHiAiUser/mxOCR”,解压。 -- **步骤 2** 运行ocr Demo生成推理结果文件。 -- **步骤 3** 执行如下命令,启动精度测试脚本,命令中各个参数请根据实际情况指定。 - - ``` - cd /home/HwHiAiUser/mxOCR/OpticalCharacterRecognition/src/Common/EvalScript; - python3 eval_script.py --gt_path=/xx/xx/icdar2019/labels --pred_path=/xx/xx/result - ``` - - 根据屏幕日志确认是否执行成功。 +在目录`OpticalCharacterRecognition/src/Common/EvalScript`下执行: +```bash +python3 eval_script.py --gt_path=/xx/xx/icdar2019/labels --pred_path=/xx/xx/result +``` +运行可使用的参数说明: -*运行可使用的参数如表5-2 运行可使用的参数说明所示。* +| 选项 | 意义 | +| --- | --- | +| --gt_path | 测试数据集标注文件路径。 | +| --pred_path | Ocr Demo运行的推理结果存放路径。 | +| --parallel_num | 并行数。 | -**表5-2** 运行可使用的参数说明 +**步骤4:** 查看精度结果 -| 选项 | 意义 | 默认值 | -| --- | --- | --- | -| --gt_path | 测试数据集标注文件路径。 | "" | -| --pred_path | Ocr Demo运行的推理结果存放路径。 | "" | -| --parallel_num | 并行数。 | 32 | \ No newline at end of file +根据屏幕回显日志获取精度结果。 \ No newline at end of file -- Gitee From e2d4e43756d68b53989ff21bfa4f6630d286cfbf Mon Sep 17 00:00:00 2001 From: anan505 <1204828624@qq.com> Date: Fri, 6 Dec 2024 11:07:21 +0000 Subject: [PATCH 2/4] update mxVision/OpticalCharacterRecognition/src/CMakeLists.txt. Signed-off-by: anan505 <1204828624@qq.com> --- mxVision/OpticalCharacterRecognition/src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mxVision/OpticalCharacterRecognition/src/CMakeLists.txt b/mxVision/OpticalCharacterRecognition/src/CMakeLists.txt index d82ece48e..a757853c9 100644 --- a/mxVision/OpticalCharacterRecognition/src/CMakeLists.txt +++ b/mxVision/OpticalCharacterRecognition/src/CMakeLists.txt @@ -9,7 +9,7 @@ set(PROJECT_SRC_ROOT ${CMAKE_CURRENT_LIST_DIR}) set(CMAKE_MODULE_PATH ${PROJECT_SRC_ROOT}/CMake) set(CMAKE_SKIP_BUILD_RPATH True) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SRC_ROOT}/dist) -add_compile_options(-std=c++11 -fPIE -fstack-protector-all -Wall) +add_compile_options(-std=c++14 -fPIE -fstack-protector-all -Wall) add_definitions(-DENABLE_DVPP_INTERFACE) set(AscendBaseFolder ${PROJECT_SRC_ROOT}/AscendBase/Base) -- Gitee From 61cf63883eb456cb0c5aabf37fe3f5626f1b5c45 Mon Sep 17 00:00:00 2001 From: anan505 <1204828624@qq.com> Date: Fri, 6 Dec 2024 11:10:57 +0000 Subject: [PATCH 3/4] update mxVision/OpticalCharacterRecognition/src/data/config/setup.config. Signed-off-by: anan505 <1204828624@qq.com> --- .../OpticalCharacterRecognition/src/data/config/setup.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mxVision/OpticalCharacterRecognition/src/data/config/setup.config b/mxVision/OpticalCharacterRecognition/src/data/config/setup.config index b8a02e782..71edf5c3b 100644 --- a/mxVision/OpticalCharacterRecognition/src/data/config/setup.config +++ b/mxVision/OpticalCharacterRecognition/src/data/config/setup.config @@ -25,7 +25,7 @@ recMinWidth = 32 recMaxWidth = 4096 #rec model dictionary path -dictPath = ./data/models/crnn/ppocr_keys_v1.txt +dictPath = /path/to/ppocr_keys_v1.txt #switch of save infer resultHandOutProcess.cpp saveInferResult = true -- Gitee From 2d381d40a0f7eb29a74379309076e9f6f61957aa Mon Sep 17 00:00:00 2001 From: anan505 <1204828624@qq.com> Date: Fri, 6 Dec 2024 19:14:13 +0800 Subject: [PATCH 4/4] xx --- contrib/EdgeDetectionPicture/README.md | 20 +- contrib/ReID/README.md | 30 +- .../OpticalCharacterRecognition/README.md | 436 ++++++------------ .../ModuleProcessors/Utils/Utils.cpp | 1 + .../src/CMakeLists.txt | 2 +- .../src/data/config/setup.config | 2 +- tutorials/mxBaseSample/README.md | 3 + 7 files changed, 174 insertions(+), 320 deletions(-) diff --git a/contrib/EdgeDetectionPicture/README.md b/contrib/EdgeDetectionPicture/README.md index ee63cd5e6..750c625d6 100644 --- a/contrib/EdgeDetectionPicture/README.md +++ b/contrib/EdgeDetectionPicture/README.md @@ -10,7 +10,7 @@ Init > ReadImage >Resize > Inference >PostProcess >DeInit ### 1.2 支持的产品 -本项目支持昇腾Atlas 300I pro、 Atlas 300V pro。 +本项目支持昇腾Atlas 300I pro、 Atlas 300V pro ### 1.3 支持的版本 本样例配套的MxVision版本、CANN版本、Driver/Firmware版本如下所示: @@ -19,6 +19,8 @@ Init > ReadImage >Resize > Inference >PostProcess >DeInit | --------- | ------------------ | -------------- | | 6.0.RC3 | 8.0.RC3 | 24.1.RC3 | +### 1.4 三方依赖 +无 ### 1.5 代码目录结构说明 本工程名称为EdgeDetectionPicture,工程目录如下图所示: @@ -50,11 +52,11 @@ Init > ReadImage >Resize > Inference >PostProcess >DeInit ``` ## 3 准备模型 -**步骤1:** 通过[下载地址](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/EdgeDetectionPicture/model.zip)下载RCF模型文件包。 +**步骤1** 通过[下载地址](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/EdgeDetectionPicture/model.zip)下载RCF模型文件包。 -**步骤2:** 将获取到的RCF模型文件内的`rcf.prototxt`文件和`rcf_bsds.caffemodel`文件放在`EdgeDetectionPicture/model/`下。 +**步骤2** 将获取到的RCF模型文件内的`rcf.prototxt`文件和`rcf_bsds.caffemodel`文件放在`EdgeDetectionPicture/model/`下。 -**步骤3:** 在`EdgeDetectionPicture/model/`下执行模型转换命令: +**步骤3** 在`EdgeDetectionPicture/model/`下执行模型转换命令: ```bash atc --model=rcf.prototxt --weight=./rcf_bsds.caffemodel --framework=0 --output=rcf --soc_version=Ascend310P3 --insert_op_conf=./aipp.cfg --input_format=NCHW --output_type=FP32 ``` @@ -67,19 +69,19 @@ ATC run success, welcome to the next use. ## 4 编译与运行 -**步骤1:** 在`EdgeDetectionPicture/`下执行如下编译命令: +**步骤1** 在`EdgeDetectionPicture/`下执行如下编译命令: ```bash bash build.sh ``` -**步骤2:** 进行图像边缘检测: +**步骤2** 进行图像边缘检测 1. 在`EdgeDetectionPicture/`下创建文件夹`data`。 -2. 请自行准备jpg格式的测试图像,保存在`data/`文件夹内(例如 `data/**.jpg`)。 +2. 请自行准备jpg格式的测试图像,保存在`data/`文件夹内(例如 `data/**.jpg`) 3. 在`EdgeDetectionPicture/`下执行如下命令来进行边缘检测: ```bash ./edge_detection_picture ./data ``` -**步骤3:** 查看结果: +**步骤3** 查看结果 -生成的边缘检测图像会以原测试图像名称保存在`EdgeDetectionPicture/result/`文件夹内(如`result/**.jpg`)。 +生成的边缘检测图像会以原测试图像名称保存在`EdgeDetectionPicture/result/`文件夹内。 (如`result/**.jpg`) diff --git a/contrib/ReID/README.md b/contrib/ReID/README.md index 7d1817d82..82f89f87c 100644 --- a/contrib/ReID/README.md +++ b/contrib/ReID/README.md @@ -5,10 +5,10 @@ 本开发样例基于MindX SDK实现了端到端的行人重识别(Person Re-identification, ReID),支持检索给定照片中的行人ID。 其主要流程为: -1. 程序入口分别接收查询图片和行人底库所在的文件路径。 -2. 利用目标检测模型YOLOv3检测查询图片中的行人,检测结果经过抠图与调整大小,再利用ReID模型提取图片中每个行人的特征向量。 -3. 将行人底库图片调整大小,利用ReID模型提取相应的特征向量。 -4. 进行行人检索。 将查询图片中行人的特征向量与底库中的特征向量比对,为每个查询图片中的行人检索最有可能的ID,通过识别框和文字信息进行可视化标记。 +1. 首先,程序入口分别接收查询图片和行人底库所在的文件路径。 +2. 其次,利用目标检测模型YOLOv3检测查询图片中的行人,检测结果经过抠图与调整大小,再利用ReID模型提取图片中每个行人的特征向量。 +3. 之后,将行人底库图片调整大小,利用ReID模型提取相应的特征向量。 +4. 最后进行行人检索。 将查询图片中行人的特征向量与底库中的特征向量比对,为每个查询图片中的行人检索最有可能的ID,通过识别框和文字信息进行可视化标记。 参考链接: > 特定行人检索:[Person Search Demo](https://github.com/songwsx/person_search_demo) @@ -41,8 +41,10 @@ ``` ReID |---- data -| |---- gallerySet // 查询场景图片文件夹(需要用户自行创建) -| |---- querySet // 行人底库图片文件夹(需要用户自行创建) +| |---- gallerySet // 查询场景图片文件夹 +| |---- querySet // 行人底库图片文件夹 +| |---- ownDataset // 行人底库原图形文件夹 +| |---- cropOwnDataset // 行人底库结果文件夹 |---- models // 目标检测、ReID模型与配置文件夹 | | |---- yolov3.cfg | | |---- coco.names @@ -117,22 +119,20 @@ ATC run success, welcome to the next use. **步骤1:** 准备行人底库数据集。 -1. 在目录`ReID/data/`下创建文件夹`querySet`。 -2. 通过[链接](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/ReID/ReID%E7%9B%B8%E5%85%B3%E6%96%87%E4%BB%B6.rar)下载压缩包`ReID相关文件`。 在压缩包`ReID相关文件`中有`文件夹Market1501数据集`,该文件夹内有压缩文件`Market-1501-v15.09.15.zip`。 +通过[链接](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/ReID/ReID%E7%9B%B8%E5%85%B3%E6%96%87%E4%BB%B6.rar)下载压缩包`ReID相关文件`。 在压缩包`ReID相关文件`中有`文件夹Market1501数据集`,该文件夹内有压缩文件`Market-1501-v15.09.15.zip`。 请解压`Market-1501-v15.09.15.zip`,在`Market-1501-v15.09.15\Market1501\gt_bbox`中选择想要查询的行人图片,将图片放在`ReID/data/querySet`中。 -- 推荐每次查询1人,使用2-6张图片作为底库,效果较好; -- 如需要查询多人,请保证待查询行人之间的着装风格差异较大,否则会较容易出现误报; -- 该项目需要为每张图片提取行人ID,行人图片的命名格式为:'0001(行人ID)_c1(相机ID)s1(录像序列ID)_000151(视频帧ID)_00(检测框ID).jpg'。 +> 推荐每次查询1人,使用2-6张图片作为底库,效果较好; +> 如需要查询多人,请保证待查询行人之间的着装风格差异较大,否则会较容易出现误报; +> 该项目需要为每张图片提取行人ID,行人图片的命名格式为: +> '0001(行人ID)_c1(相机ID)s1(录像序列ID)_000151(视频帧ID)_00(检测框ID).jpg'。 **步骤2:** 准备场景图片数据集。 -1. 在目录`ReID/data/`下创建文件夹`gallerySet`。 - -2. 在步骤1的压缩包`ReID相关文件`中有`场景图片`,该文件夹内有压缩文件`search_samples.rar`。 +在上一步骤的压缩包`ReID相关文件`中有`场景图片`,该文件夹内有压缩文件`search_samples.rar`。 请解压`search_samples.rar`,然后将获取的图片放在`ReID/data/gallerySet`中。 -- gallerySet下的图片必须是1920*1080大小的jpg。 +> gallery下的图片必须是1920*1080大小的jpg。 **步骤3:** 配置pipeline。 diff --git a/mxVision/OpticalCharacterRecognition/README.md b/mxVision/OpticalCharacterRecognition/README.md index e8ec4b32a..76475bd61 100644 --- a/mxVision/OpticalCharacterRecognition/README.md +++ b/mxVision/OpticalCharacterRecognition/README.md @@ -1,34 +1,37 @@ -# OCR +# 基于MxBase接口的OCR字符识别 -# 1 简介 +## 1 介绍 +### 1.1 简介 -## 1.1 背景介绍 -本参考设计的目的主要包括以下几个方面: +开发样例是基于mxBase开发的OCR应用,实现识别输入图片中的文字功能。 -1.为金融、安防、互联网等客户提供基于Atlas做OCR的参考样例,验证可行性; +### 1.2 支持的产品 -2.作为客户基于mxBase开发OCR应用的编程样例(下称Demo),开放源代码给客户参考,降低客户准入门槛; +本项目支持昇腾Atlas 300I pro、 Atlas 300V pro。 -3.提供新架构下系统优化案例,打造超高性能原型系统,为客户提供选择Atlas的理由。 +### 1.3 支持的版本 +本样例配套的MxVision版本、CANN版本、Driver/Firmware版本如下所示: -本Demo模型选择是面向直排文本,不考虑弯曲文本的情况,并选择JPEG作为输入图像格式,实现识别输入图片中的文字功能。本文档提供对OCR Demo实现方案的说明。 +| MxVision版本 | CANN版本 | Driver/Firmware版本 | +| --------- |---------| -------------- | +| 6.0.RC3 | 8.0.RC3 | 24.1.RC3 | -## 1.2 支持的产品 +### 1.4 三方依赖 -本系统采用Atlas 300I Pro, Atlas 300V Pro作为实验验证的硬件平台。 +第三方依赖软件和版本如下表。请确认环境已安装pip3后,使用`pip3 install * `安装以下依赖: -## 1.3 软件方案介绍 +|软件名称 | 版本 | +|-----------|-----------| +| numpy | 1.24.0 | +| paddle2onnx | 1.2.4 | +| paddlepaddle | 2.6.0 | +| tqdm | 4.66.5 | +| shapely | 2.0.6 | +| joblib | 1.4.2 | -软件方案包含OCR的三个环节:文本检测,方向分类,字符识别。其中文本检测和字符识别是必要环节,方向分类为可选环节。 - -本Demo支持基于Paddle PP-OCR server 2.0的DBNet(检测)和CRNN(识别)模型在310P芯片上进行静态分档推理以及CRNN(识别)模型在310P芯片上进行动态shape推理。为了提高CPU、NPU资源利用率,实现极致性能,Demo采用了流水并行及多路并行处理方案。 - -### 代码主要目录介绍 - -本Demo根目录下src为源码目录,现将src的子目录介绍如下: -**注意**:代码目录中的src/AscendBase/Base/Framework/ModuleProcessors/TextDetectionPost/下的clipper.cpp、clipper.hpp为开源第三方模块,Demo中不包含这两个文件,需用户自行下载这两个文件,然后放在对应位置。 -clipper.cpp、clipper.hpp文件下载链接:https://udomain.dl.sourceforge.net/project/polyclipping/clipper_ver6.4.2.zip +### 1.5 代码目录结构说明 +本工程名称为OpticalCharacterRecognition,工程目录如下图所示: ``` . @@ -82,303 +85,178 @@ clipper.cpp、clipper.hpp文件下载链接:https://udomain.dl.sourceforge.net │ │ ├── dbnet ├── README.md ``` +**注意**:代码目录中的`src/AscendBase/Base/Framework/ModuleProcessors/TextDetectionPost/`下的`lipper.cpp`、`clipper.hpp`为开源第三方模块,需用户自行下载这两个文件,然后放在对应位置。 -# 2 环境搭建 - -### 2.1 软件依赖说明 +- clipper.cpp、clipper.hpp文件[下载链接](https://sourceforge.net/projects/polyclipping/files/clipper_ver6.4.2.zip/download), 在文件夹`cpp`下可以找到。 -**表2-1** 软件依赖说明 +### 1.6 相关约束 -| 依赖软件 | 版本 | 依赖说明 -| ------------- |--------------| ---------------------| -| CANN | 7.0.RC1 | 提供基础acl/himpi接口 | -| mxVision | 5.0.RC3 | 提供基础mxBase的能力 | +本样例是面向直排文本,不考虑弯曲文本的情况,仅支持JPEG作为输入图像格式。 -### 2.2 CANN环境变量设置 +## 2 设置环境变量 ```bash -. ${CANN_INSTALL_PATH}/ascend-toolkit/set_env.sh -``` - -### 2.3 mxVision环境变量设置 +#设置CANN环境变量 +. ${ascend-toolkit-path}/set_env.sh -```bash -. ${MX_SDK_HOME}/set_env.sh +#设置MindX SDK 环境变量,SDK-path为mxVision SDK 安装路径 +. ${SDK-path}/set_env.sh ``` -# 3 模型转换及数据集获取 +## 3 准备模型 -## 3.1 Demo所用模型下载地址 +**步骤1:** 下载模型 -Paddle PP-OCR server 2.0模型: +Paddle PP-OCR server 2.0模型(`.onnx`格式文件): | 名称 | 下载链接 | | --------------- | -------------- | -| Paddle PP-OCR server 2.0 DBNet | https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_infer.tar| -| Paddle PP-OCR server 2.0 Cls | https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar| -| Paddle PP-OCR server 2.0 CRNN | https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_infer.tar| - -识别模型字典文件下载地址: -https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/release/2.5/ppocr/utils/ppocr_keys_v1.txt - - -## 3.2 Demo所用测试数据集下载地址 -数据集ICDAR-2019 LSVT下载地址: - - -| 名称 | 下载链接 | -|---------|----------| -| 图片压缩包1 | https://dataset-bj.cdn.bcebos.com/lsvt/train_full_images_0.tar.gz| -| 图片压缩包2 | https://dataset-bj.cdn.bcebos.com/lsvt/train_full_images_1.tar.gz| -| 标注文件 | https://dataset-bj.cdn.bcebos.com/lsvt/train_full_labels.json| +| Paddle PP-OCR server 2.0 DBNet | [ch_ppocr_server_v2.0_det_infer.onnx](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/mxVision/OpticalCharacterRecognition/ch_ppocr_server_v2.0_det_infer.onnx) | +| Paddle PP-OCR server 2.0 Cls | [ch_ppocr_mobile_v2.0_cls_infer.onnx](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/mxVision/OpticalCharacterRecognition/ch_ppocr_mobile_v2.0_cls_infer.onnx) | +| Paddle PP-OCR server 2.0 CRNN | [ch_ppocr_server_v2.0_rec_infer_argmax.onnx](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/mxVision/OpticalCharacterRecognition/ch_ppocr_server_v2.0_rec_infer_argmax.onnx) | -图片压缩包名为 train_full_images_0.tar.gz 与 train_full_images_1.tar.gz +**步骤2:** 放置模型文件 -标签文件名为 train_full_labels.json +将下载的文件放置在路径`OpticalCharacterRecognition/src/data/models`下对应的文件夹内。 -### 3.2.1 数据集准备 +**步骤3:** 模型转换 -#### 3.2.1.1 数据集下载 -命令参考 -``` -wget https://dataset-bj.cdn.bcebos.com/lsvt/train_full_images_0.tar.gz -wget https://dataset-bj.cdn.bcebos.com/lsvt/train_full_images_1.tar.gz -wget https://dataset-bj.cdn.bcebos.com/lsvt/train_full_labels.json +在三个模型目录下分别执行对应的atc转换脚本: +```bash +bash atc.sh ``` +执行完模型转换脚本后,若提示如下信息说明模型转换成功,并可以找到对应的`.om`模型文件。 -#### 3.2.1.2 数据集目录创建 -创建数据集目录 ``` -mkdir -p ./icdar2019/images -``` -#### 3.2.1.3 解压图片并移动到对应目录 -解压图片压缩包并移动图片到对应目录 -``` -tar -zvxf ./train_full_images_0.tar.gz -tar -zvxf ./train_full_images_1.tar.gz -mv train_full_images_0/* ./icdar2019/images -mv train_full_images_1/* ./icdar2019/images -rm -r train_full_images_0 -rm -r train_full_images_1 -``` -#### 3.2.1.4 标签格式转换 -label文件格式转换为ICDAR2015格式, 转换脚本位于src/Common/LabelTrans/label_trans.py - -运行标签格式转换脚本工具需要依赖的三方库如下所示: -**表3-1** label_trans.py依赖python三方库 - -| 名称 | 版本 | -| --- | --- | -| numpy | =1.22.4 | -| tqdm | =4.64.0 | +ATC run success, welcome to the next use. +``` +**步骤4:** CRNN模型文件放置 -格式转换脚本参考如下: -``` -python3 ./label_trans.py --label_json_path=/xx/xx/train_full_labels.json --output_path=/xx/xx/icdar2019/ +在`OpticalCharacterRecognition/src/data/models/crnn`下应该可以看到5个`.om`模型文件,在该目录下执行以下命令将`.om`模型文件都移动到新建目录`OpticalCharacterRecognition/src/data/models/crnn/static`目录下: +```bash +mkdir static +mv crnn_dynamic_dims_16_bs1.om ./static +mv crnn_dynamic_dims_16_bs4.om ./static +mv crnn_dynamic_dims_16_bs8.om ./static +mv crnn_dynamic_dims_16_bs16.om ./static +mv crnn_dynamic_dims_16_bs32.om ./static ``` -## 3.3 pdmodel模型转换为onnx模型 -- **步骤 1** 将下载好的paddle模型转换成onnx模型。 - 执行以下命令安装转换工具paddle2onnx +## 4 编译与运行 - ``` - pip3 install paddle2onnx==0.9.5 - ``` - 运行paddle2onnx工具需要依赖的三方库如下所示: - -**表3-2** paddle2onnx依赖python三方库 +**步骤1:** 准备数据集 -| 名称 | 版本 | -| --- | --- | -| paddlepaddle | 2.3.0 | - -PP-OCR server 2.0 DBNet模型转成onnx模型指令参考如下: -``` -paddle2onnx --model_dir ./ch_ppocr_server_v2.0_det_infer/ --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./ch_ppocr_server_v2.0_det_infer.onnx --opset_version 11 --enable_onnx_checker True --input_shape_dict="{'x':[-1,3,-1,-1]}" -``` +1. 准备识别模型字典文件: -PP-OCR server 2.0 CRNN模型转成onnx模型指令参考如下: -``` -paddle2onnx --model_dir ./ch_ppocr_server_v2.0_rec_infer/ --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./ch_ppocr_server_v2.0_rec_infer.onnx --opset_version 11 --enable_onnx_checker True --input_shape_dict="{'x':[-1,3,32,-1]}" -``` +- 可通过[下载地址](https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/release/2.5/ppocr/utils/ppocr_keys_v1.txt)直接下载文件; -PP-OCR server 2.0 Cls模型转成onnx模型指令参考如下: -``` -paddle2onnx --model_dir ./ch_ppocr_mobile_v2.0_cls_infer --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./ch_ppocr_mobile_v2.0_cls_infer.onnx --opset_version 11 --enable_onnx_checker True +- 或者通过以下指令下载: +```bash +wget -O ppocr_keys_v1.txt https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/release/2.5/ppocr/utils/ppocr_keys_v1.txt ``` -## 3.4 识别模型插入ArgMax算子 -- **步骤 2** 使用算子插入工具insert_argmax给字符识别模型(CRNN)插入argmax算子。 -转到src/Common/InsertArgmax目录下,执行脚本,此处需要传入两个参数:'model_path',对应ch_ppocr_server_v2.0_rec_infer.onnx模型所在路径;'check_output_onnx',为是否需要针对输出模型做校验,默认值为True,可选choices=[True, False] - -使用算子插入工具insert_argmax插入argmax算子指令参考: - ``` - python3 insert_argmax.py --model_path /xx/xx/ch_ppocr_server_v2.0_rec_infer.onnx --check_output_onnx True - ``` -**表3-3** 使用自动算子插入工具插入argmax算子。 -|参数名称 | 参数含义 | 默认值 | 可选值 | -| --- | --- | --- | --- | -| model_path | 对应ch_ppocr_server_v2.0_rec_infer.onnx模型所在路径 |''|''| -| check_output_onnx | 是否需要针对输出模型做校验 | True|True,False| +2. 准备数据集ICDAR-2019 LSVT: -转换出来的结果位于'model_path'路径下,命名为'ch_ppocr_server_v2.0_rec_infer_argmax.onnx'的onnx模型文件。 +- 可通过下方表格的下载链接直接下载; -**表3-4** insert_argmax.py脚本依赖python三方库 - -| 名称 | 版本 | -| --- | --- | -| onnx | >=1.9.0 | -| onnxruntime | >=1.13.1 | - -## 3.5 模型转换 +| 名称 | 下载链接 | +|---------|----------| +| 图片压缩包1 | (train_full_images_0.tar.gz)[https://dataset-bj.cdn.bcebos.com/lsvt/train_full_images_0.tar.gz]| +| 图片压缩包2 | (train_full_images_1.tar.gz)[https://dataset-bj.cdn.bcebos.com/lsvt/train_full_images_1.tar.gz]| +| 标注文件 | (train_full_labels.json)[https://dataset-bj.cdn.bcebos.com/lsvt/train_full_labels.json]| -****进行模型转换前需设置CANN环境变量**** 默认的路径为 -``` -. /usr/local/Ascend/ascend-toolkit/set_env.sh +- 或通过指令下载: +```bash +wget https://dataset-bj.cdn.bcebos.com/lsvt/train_full_images_0.tar.gz +wget https://dataset-bj.cdn.bcebos.com/lsvt/train_full_images_1.tar.gz +wget https://dataset-bj.cdn.bcebos.com/lsvt/train_full_labels.json ``` -请以实际安装路径为准。 -### 3.5.1 文本检测模型转换 -将文本检测onnx模型转换成om模型,转换指令参考src/data/models/dbnet目录下面的对应的atc转换脚本(ONNX模型路径以实际为准): -``` -bash atc.sh -``` +**步骤2:** 解压并放置数据集 -### 3.5.2 字符识别模型转换 -字符识别支持静态分档模型和动态shape模型两种场景,可通过配置文件setup.config任选其一,详细说明见章节4.2。 -#### 3.5.2.1 静态分档模型 -在静态分档模型场景下,将字符识别onnx模型转换成om模型,转换指令参考src/data/models/crnn目录下面的对应的atc转换脚本atc.sh(ONNX模型路径以实际为准): -``` -bash atc.sh -``` -可在该目录下新建static目录,将转换生成的模型可统一放置static目录内,用于配置文件recModelPath字段的配置。 -#### 3.5.2.2 动态shape模型 -在动态Shape模型场景下,字符识别onnx模型转换成om模型,转换指令参考src/data/models/crnn目录下面的对应的atc转换脚本atc_dynamic.sh(ONNX模型路径以实际为准): -``` -bash atc_dynamic.sh -``` -### 3.5.3 分类模型转换 -将onnx模型转换成om模型。转换指令参考src/demo/data/models/cls目录下面的对应的atc转换脚本(ONNX模型路径以实际为准): +1. 通过以下指令在当前位置创建数据集目录: +```bash +mkdir -p ./icdar2019/images ``` -bash atc.sh +2. 在当前目录下解压图片并移动到对应目录: +```bash +tar -zvxf ./train_full_images_0.tar.gz # 确认当前目录下有对应数据包 +tar -zvxf ./train_full_images_1.tar.gz +mv train_full_images_0/* ./icdar2019/images +mv train_full_images_1/* ./icdar2019/images +rm -r train_full_images_0 +rm -r train_full_images_1 ``` -# 4 编译运行 - -## 4.1 系统方案各子模块功能介绍 -**表4-1** 系统方案各子模块功能: +**步骤3:** 标签格式转换 -| 序号 | 子系统 | 功能描述 | -| --- | --- | --- | -| 1 | 图片分发模块 | 从用户指定的文件夹读取图片,并分发给后续的模块。 | -| 2 | DBNet模型前处理 | 主要负责解码和缩放,在310P芯片上使用dvpp解码。 | -| 3 | DBNet模型推理 | 本模块负责将前处理好的图片输入进检测模型并获得模型推理出的Tensor。 | -| 4 | DBNet模型后处理 | 本模块主要负责将输出的Tensor根据与训练一致的后处理流程将输入图片切割为包含文本的子图。 | -| 5 | Cls模型前处理 | 对dbnet后处理之后切割的子图做resize和归一化操作以及分类模型推理时的batch划分 | -| 6 | Cls模型推理 | 本模块负责将前处理好的图片输入进分类模型并获得模型推理出的Tensor。 | -| 7 | Cls模型后处理 | 将模型输出的Tensor根据与训练一致的后处理流程将需要翻转的子图翻转180度。| -| 8 | Crnn模型前处理 | 对dbnet后处理之后切割的子图做resize和归一化操作以及识别模型推理时的batch划分 | -| 9 | Crnn模型推理 | 本模块负责将前处理好的图片输入进识别模型并获得模型推理出的Tensor。支持动态shape和静态分档的推理。 | -| 10 | Crnn模型后处理 | 将模型输出的Tensor根据字典转换为文字识别的结果。 | -| 11 | 推理结果保存模块 | 保存推理结果,并在推理结束时发送停止信号。 | +label标注文件格式转换为ICDAR2015格式, 执行的转换脚本为`OpticalCharacterRecognition/src/Common/LabelTrans/label_trans.py`。 -## 4.2 配置 +执行命令: +```bash +python3 ./label_trans.py --label_json_path=/xx/xx/train_full_labels.json --output_path=/xx/xx/icdar2019/ +``` -运行前需要在 `/src/data/config/setup.config` 配置以下信息 +**步骤4:** 修改配置文件 -配置程序运行的deviceId,deviceType及模型路径等信息 -**注意**:如果输入图片中包含敏感信息,使用完后请按照当地法律法规要求自行处理,防止信息泄露。 -配置device + 修改配置文件`OpticalCharacterRecognition/src/data/config/setup.config`: + 1. 第5行修改推理使用的device的ID: ```bash deviceId = 0 // 进行推理的device的id - deviceType = 310P //310P ``` - -配置模型路径 +2. 第28行配置文本识别模型字符标签文件: ```bash - detModelPath = ./data/models/dbnet/dbnet_dy_dynamic_shape.om // DbNet模型路径 - recModelPath = ./data/models/crnn/static // CRNN模型路径,静态分档时仅需输入包含识别模型的文件夹的路径即可,动态shape时需要输入模型的路径 - clsModelPath = ./data/models/cls/cls_310P.om // CLS模型路径 + dictPath = dictPath = /path/to/ppocr_keys_v1.txt // 识别模型字典文件 ``` -配置文本识别模型输入要求的高、宽的步长 - ```bash - staticRecModelMode = true // true时采用静态分档,false时采用动态shape - recHeight = 32 // 识别模型输入要求的高,需和crnn转om模型的参数对应 [仅需在使用动态shape模型时配置] - recMinWidth = 32 // 识别模型输入宽的最小值,需和crnn转om模型的参数对应 [仅需在使用动态shape模型时配置] - recMaxWidth = 4096 // 识别模型输入宽的最大值,需和crnn转om模型的参数对应 [仅需在使用动态shape模型时配置] - ``` +**步骤5:** 编译项目 -配置文本识别模型字符标签文件 +在目录`OpticalCharacterRecognition/src/`下执行: ```bash - dictPath = ./data/models/crnn/ppocr_keys_v1.txt // 识别模型字典文件 + bash build.sh ``` +编译完成后,在`OpticalCharacterRecognition/src/dist/`目录下会生成可执行文件`main`。 -配置识别文字的输出结果路径 - ```bash - saveInferResult = false // 是否保存推理结果到文件,默认不保存,如果需要,该值设置为true,并配置推理结果保存路径 - resultPath = ./result // 推理结果保存路径 - ``` -**注意**:推理结果写文件是追加写的,如果推理结果保存路径中已经存在推理结果文件,推理前请手动删除推理结果文件,如果有需要,提前做好备份。 - -## 4.3 编译 - -- **步骤 1** 登录服务器操作后台,安装CANN及mxVision并设置环境变量。 +**步骤6:** 准备输入图片 -- **步骤 2** 将mxOCR压缩包下载至任意目录,如“/home/HwHiAiUser/mxOCR”,解压。 +需要使用的输入图片必须为JPEG格式,图片名格式为前缀+下划线+数字的形式,如`xxx_xx.jpg`。 +将需要输入的图片放在目录`/xx/xx/icdar2019/images/`下。 -- **步骤 3** 执行如下命令,构建代码。 - - ``` - cd /home/HwHiAiUser/mxOCR/OpticalCharacterRecognition/src/; - bash build.sh - ``` - *提示:编译完成后会生成可执行文件“main”,存放在“/home/HwHiAiUser/mxOCR/OpticalCharacterRecognition/src/dist/”目录下。* +**步骤7:** 运行程序 - ## 4.4 运行 - **注意 C++ Demo 运行时日志打印调用的是mxVision里面的日志模块,mxVision默认打印日志级别为error,如果需要查看info日志,请将配置文件logging.conf中的console_level值设为0。** - logging.conf文件路径:mxVison安装目录/mxVision/config/logging.conf +执行如下命令,启动程序: - ### 输入图像约束 - - 仅支持JPEG格式,图片名格式为前缀+下划线+数字的形式,如xxx_xx.jpg。 - - ### 运行程序 - **注意 在模型的档位较多,或者设置并发数过大的情况下,有可能会导致超出device内存。请关注报错信息。** - - 执行如下命令,启动程序。 - - ``` - ./dist/main -image_path /xx/xx/icdar2019/images/ -thread_num 1 -direction_classification false -config ./data/config/setup.config - ``` +```bash +./dist/main -image_path /xx/xx/icdar2019/images/ -thread_num 1 -direction_classification false -config ./data/config/setup.config +``` +运行可使用的参数说明: - 根据屏幕日志确认是否执行成功。 +| 选项 | 意义 | +| --- | --- | +| -image_path | 输入图片所在的文件夹路径。 | +| -thread_num | 运行程序的线程数,取值范围1-4,请根据环境内存设置合适值。 | +| -direction_classification | 是否在检测模型之后使用方向分类模型。 | +| -config | 配置文件setup.config的完整路径。 | - 识别结果默认存放在“/home/HwHiAiUser/mxOCR/OpticalCharacterRecognition/src/result”目录下。 +**步骤8:** 查看结果 -*提示:输入./dist/main -h可查看该命令所有信息。运行可使用的参数如表4-2 运行可使用的参数说明所示。* +- 结果位置: -**表4-2** 运行可使用的参数说明 +根据屏幕日志确认是否执行成功。 -| 选项 | 意义 | 默认值 | -| --- | --- | --- | -| -image_path | 输入图片所在的文件夹路径 | ./data/imagePath | -| -thread_num | 运行程序的线程数,取值范围1-4,请根据环境内存设置合适值。 | 1 | -| -direction_classification | 是否在检测模型之后使用方向分类模型。 | false | -| -config | 配置文件setup.config的完整路径。 | ./data/config/setup.config | +识别结果默认存放在`OpticalCharacterRecognition/src/result`目录下。 -*提示:image_path路径下包含的图片会根据thread_num数目进行数据集分割,分割结果存放在/**/**/OpticalCharacterRecognition/src/data/config目录下。* +**注意**:推理结果写文件是追加写的,如果推理结果保存路径中已经存在推理结果文件,推理前请手动删除推理结果文件,如果有需要,提前做好备份。 -### 结果展示 +- 结果内容: -OCR识别结果保存在配置文件中指定路径的infer_img_x.txt中(x 为图片id) -每个infer_img_x.txt中保存了每个图片文本框四个顶点的坐标位置以及文本内容,格式如下: +每个infer_img_x.txt(x 为图片id)中保存了每个图片文本框四个顶点的坐标位置以及文本内容,格式如下: ```bash 1183,1826,1711,1837,1710,1887,1181,1876,签发机关/Authority 2214,1608,2821,1625,2820,1676,2212,1659,有效期至/Dateofexpin @@ -388,62 +266,32 @@ OCR识别结果保存在配置文件中指定路径的infer_img_x.txt中(x 为 ``` **注意**:如果输入图片中包含敏感信息,使用完后请按照当地法律法规要求自行处理,防止信息泄露。 -# 4.5 动态库依赖说明 - -Demo动态库依赖可参见代码中“src”目录的“CMakeLists.txt”文件中“target_link_libraries”参数处。 - -**表4-3** 动态库依赖说明 - -| 依赖软件 | 说明 | -| --- | --- | -| libascendcl.so | ACL框架接口,具体介绍可参见ACL接口文档。 | -| libacl_dvpp.so | ACL框架接口,具体介绍可参见ACL接口文档。 | -| libpthread.so | C++的线程库。 | -| libglog.so | C++的日志库。 | -| libopencv_world.so | OpenCV的基本组件,用于图像的基本处理。| -| libmxbase.so | 基础SDK的基本组件,用于模型推理及内存拷贝等。| -# 5 精度测试脚本使用 +# 5 精度验证 -## 5.1 依赖python三方库安装 +**步骤1:** 准备验证数据集 -精度测试脚本运行依赖的三方库如表5-1所示 +执行完“4 编译与运行”的“步骤2”后的`icdar2019/images`为测试所用的所有输入图片。 -**表5-1** 依赖python三方库 +**步骤2:** 生成运行结果 -| 名称 | 版本 | -| --- | --- | -| shapely | >=1.8.2 | -| numpy | >=1.22.4 | -| joblib | >=1.1.0 | -| tqdm | >4.64.0 | - -安装命令 - ``` - pip3 install + 包名 - ``` +按照上述的“4 编译与运行”完成所有输入图片的结果生成。 -## 5.2 运行 +**步骤3:** 进行精度计算 -### 运行程序 - -- **步骤 1** 将mxOCR压缩包下载至任意目录,如“/home/HwHiAiUser/mxOCR”,解压。 -- **步骤 2** 运行ocr Demo生成推理结果文件。 -- **步骤 3** 执行如下命令,启动精度测试脚本,命令中各个参数请根据实际情况指定。 - - ``` - cd /home/HwHiAiUser/mxOCR/OpticalCharacterRecognition/src/Common/EvalScript; - python3 eval_script.py --gt_path=/xx/xx/icdar2019/labels --pred_path=/xx/xx/result - ``` +在目录`OpticalCharacterRecognition/src/Common/EvalScript`下执行: +```bash +python3 eval_script.py --gt_path=/xx/xx/icdar2019/labels --pred_path=/xx/xx/result +``` +运行可使用的参数说明: - 根据屏幕日志确认是否执行成功。 +| 选项 | 意义 | +| --- | --- | +| --gt_path | 测试数据集标注文件路径。 | +| --pred_path | Ocr Demo运行的推理结果存放路径。 | +| --parallel_num | 并行数。 | -*运行可使用的参数如表5-2 运行可使用的参数说明所示。* +**步骤4:** 查看精度结果 -**表5-2** 运行可使用的参数说明 +根据屏幕回显日志获取精度结果。 -| 选项 | 意义 | 默认值 | -| --- | --- | --- | -| --gt_path | 测试数据集标注文件路径。 | "" | -| --pred_path | Ocr Demo运行的推理结果存放路径。 | "" | -| --parallel_num | 并行数。 | 32 | \ No newline at end of file diff --git a/mxVision/OpticalCharacterRecognition/src/AscendBase/Base/Framework/ModuleProcessors/Utils/Utils.cpp b/mxVision/OpticalCharacterRecognition/src/AscendBase/Base/Framework/ModuleProcessors/Utils/Utils.cpp index 58cdcb18b..b8dd0d899 100644 --- a/mxVision/OpticalCharacterRecognition/src/AscendBase/Base/Framework/ModuleProcessors/Utils/Utils.cpp +++ b/mxVision/OpticalCharacterRecognition/src/AscendBase/Base/Framework/ModuleProcessors/Utils/Utils.cpp @@ -7,6 +7,7 @@ */ #include "Utils.h" +#include "MxBase/Log/Log.h" uint32_t Utils::ImageChanSizeF32(uint32_t width, uint32_t height) { diff --git a/mxVision/OpticalCharacterRecognition/src/CMakeLists.txt b/mxVision/OpticalCharacterRecognition/src/CMakeLists.txt index d82ece48e..a757853c9 100644 --- a/mxVision/OpticalCharacterRecognition/src/CMakeLists.txt +++ b/mxVision/OpticalCharacterRecognition/src/CMakeLists.txt @@ -9,7 +9,7 @@ set(PROJECT_SRC_ROOT ${CMAKE_CURRENT_LIST_DIR}) set(CMAKE_MODULE_PATH ${PROJECT_SRC_ROOT}/CMake) set(CMAKE_SKIP_BUILD_RPATH True) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SRC_ROOT}/dist) -add_compile_options(-std=c++11 -fPIE -fstack-protector-all -Wall) +add_compile_options(-std=c++14 -fPIE -fstack-protector-all -Wall) add_definitions(-DENABLE_DVPP_INTERFACE) set(AscendBaseFolder ${PROJECT_SRC_ROOT}/AscendBase/Base) diff --git a/mxVision/OpticalCharacterRecognition/src/data/config/setup.config b/mxVision/OpticalCharacterRecognition/src/data/config/setup.config index b8a02e782..71edf5c3b 100644 --- a/mxVision/OpticalCharacterRecognition/src/data/config/setup.config +++ b/mxVision/OpticalCharacterRecognition/src/data/config/setup.config @@ -25,7 +25,7 @@ recMinWidth = 32 recMaxWidth = 4096 #rec model dictionary path -dictPath = ./data/models/crnn/ppocr_keys_v1.txt +dictPath = /path/to/ppocr_keys_v1.txt #switch of save infer resultHandOutProcess.cpp saveInferResult = true diff --git a/tutorials/mxBaseSample/README.md b/tutorials/mxBaseSample/README.md index f7a160392..ae90ca746 100644 --- a/tutorials/mxBaseSample/README.md +++ b/tutorials/mxBaseSample/README.md @@ -75,4 +75,7 @@ bash build.sh **步骤3:** 查看结果 结果以`result.jpg`的形式保存在`mxBaseSample/`目录下。 +<<<<<<< HEAD +======= +>>>>>>> e6e5ac97 (xx) -- Gitee