Commit f3239ab0 authored by shizhm's avatar shizhm
Browse files

修改readme

parent c1464a9c
# CRNN文本识别 # CRNN文本识别
本示例基于CRNN文本识别模型实现了两种MIGraphX推理:静态推理和动态shape推理。静态推理时CRNN模型只接受固定尺寸的图像输入,而动态shape推理则可以输入不同尺寸的图像进行识别。本份文档首先对CRNN算法进行简介,然后介绍了如何导出静态和动态的CRNN onnx格式模型,最后介绍了两种模式下的推理流程,并给出静态推理和动态推理的结果。 本示例基于CRNN文本识别模型实现了两种MIGraphX推理:静态推理和动态shape推理。静态推理时CRNN模型只接受固定尺寸的图像输入,而动态shape推理则可以输入不同尺寸的图像进行识别。
## 模型简介 ## 模型简介
...@@ -8,83 +8,7 @@ CRNN是文本识别领域的一种经典算法。该算法的主要思想是认 ...@@ -8,83 +8,7 @@ CRNN是文本识别领域的一种经典算法。该算法的主要思想是认
<img src="./CRNN_01.jpg" alt="CRNN_01" /> <img src="./CRNN_01.jpg" alt="CRNN_01" />
本示例采用了如下的开源实现:https://github.com/meijieru/crnn.pytorch, 作者提供了CRNN的预训练模型,下载CRNN的预训练模型保存到CRNN工程的weights目录。 本示例采用了如下的开源实现:https://github.com/meijieru/crnn.pytorch, 作者提供了CRNN的预训练模型。
## 模型转换
本示例采用的开源实现未提供CRNN导出onnx模型的程序,所以需要在CRNN工程下创建export.py文件,在文件中添加导出crnn.onnx模型的程序,该程序根据参数输入的不同,可以分别导出满足CRNN动态和静态两种推理所需的onnx模型,代码如下。
```
import torch
import models.crnn as crnn
import argparse
def export_onnx(modelpath, is_dynamic):
model = crnn.CRNN(32, 1, 37, 256)
model.load_state_dict(torch.load(modelpath))
dummy_input = torch.randn(1, 1, 32, 100)
input_names = ["input"]
output_names = ["output"]
if is_dynamic:
dynamic_axes = {"input": [3]}
torch.onnx.export(model,
dummy_input,
"crnn_dynamic.onnx",
verbose=True,
dynamic_axes=dynamic_axes,
input_names=input_names,
output_names=output_names)
else:
torch.onnx.export(model,
dummy_input,
"crnn.onnx",
verbose=True,
dynamic_axes=None,
input_names=input_names,
output_names=output_names)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--weights', nargs='+', type=str, default='./weights/crnn.pth', help='model.pt path(s)')
parser.add_argument('--dynamic', action="store_true", help='ONNX/TF/TensorRT: dynamic axes')
opt = parser.parse_args()
export_onnx(opt.weights, opt.dynamic)
```
export.py程序中dummy_input表示onnx模型的输入尺寸,数据排布为NCHW。在导出静态模型时,模型的输入尺寸是固定的,本示例为了和开源实现中提供的demo示例保持一致设为(1, 1, 32, 100)。在导出用于动态shape推理的模型时,将CRNN模型的NCH维度固定(1, 1, 32),W维度设为动态维度dynamic_axes。
通过添加导出onnx模型程序后,按照如下步骤可将crnn.pth转化为onnx格式:
1. 安装DTK版的Pytorch,下载地址:https://cancon.hpccube.com:65024/4/main/pytorch
2. 安装依赖
```
# 进入migraphx samples工程根目录
cd <path_to_migraphx_samples>
# 进入示例程序目录
cd Python/Ocr/CRNN
# 环境配置
pip install -r requirements.txt
```
3. 静态模型转换
```
python export.py --weights ./weights/crnn.pth
```
4. 动态模型转换
```
python export.py --weights ./weights/crnn.pth --dynamic
```
模型导出后,可以通过netron工具:https://netron.app/ 进行模型可视化,检查模型的输入输出。**动态模型通过设置既可以执行动态推理,也可以执行静态推理,本示例中的静态推理和动态shape推理则是基于导出的动态模型实现。**
## 模型初始化 ## 模型初始化
...@@ -274,7 +198,7 @@ inferenceResults是crnn.onnx模型的MIGraphX推理结果,CRNN模型包含一 ...@@ -274,7 +198,7 @@ inferenceResults是crnn.onnx模型的MIGraphX推理结果,CRNN模型包含一
### 动态shape推理 ### 动态shape推理
动态shape推理需要处理多张图像,每次输入新图像执行与静态推理一致的操作,相关过程定义在Sample.cpp文件中,代码如下: 动态shape推理需要处理多张图像,每次输入新图像执行与静态推理一致的操作,相关过程定义在main.cpp文件中,代码如下:
``` ```
void Sample_Crnn_Dynamic() void Sample_Crnn_Dynamic()
......
...@@ -8,83 +8,7 @@ CRNN是文本识别领域的一种经典算法。该算法的主要思想是认 ...@@ -8,83 +8,7 @@ CRNN是文本识别领域的一种经典算法。该算法的主要思想是认
<img src="./CRNN_01.jpg" alt="CRNN_01" /> <img src="./CRNN_01.jpg" alt="CRNN_01" />
本示例采用了如下的开源实现:https://github.com/meijieru/crnn.pytorch, 作者提供了CRNN的预训练模型,下载CRNN的预训练模型保存到CRNN工程的weights目录。 本示例采用了如下的开源实现:https://github.com/meijieru/crnn.pytorch, 作者提供了CRNN的预训练模型。
## 模型转换
本示例采用的开源实现未提供CRNN导出onnx模型的程序,所以需要在CRNN工程下创建export.py文件,在文件中添加导出crnn.onnx模型的程序,该程序根据参数输入的不同,可以分别导出满足CRNN动态和静态两种推理所需的onnx模型,代码如下。
```
import torch
import models.crnn as crnn
import argparse
def export_onnx(modelpath, is_dynamic):
model = crnn.CRNN(32, 1, 37, 256)
model.load_state_dict(torch.load(modelpath))
dummy_input = torch.randn(1, 1, 32, 100)
input_names = ["input"]
output_names = ["output"]
if is_dynamic:
dynamic_axes = {"input": [3]}
torch.onnx.export(model,
dummy_input,
"crnn_dynamic.onnx",
verbose=True,
dynamic_axes=dynamic_axes,
input_names=input_names,
output_names=output_names)
else:
torch.onnx.export(model,
dummy_input,
"crnn.onnx",
verbose=True,
dynamic_axes=None,
input_names=input_names,
output_names=output_names)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--weights', nargs='+', type=str, default='./weights/crnn.pth', help='model.pt path(s)')
parser.add_argument('--dynamic', action="store_true", help='ONNX/TF/TensorRT: dynamic axes')
opt = parser.parse_args()
export_onnx(opt.weights, opt.dynamic)
```
export.py程序中dummy_input表示onnx模型的输入尺寸,数据排布为NCHW。在导出静态模型时,模型的输入尺寸是固定的,本示例为了和开源实现中提供的demo示例保持一致设为(1, 1, 32, 100)。在导出用于动态shape推理的模型时,将CRNN模型的NCH维度固定(1, 1, 32),W维度设为动态维度dynamic_axes。
通过添加导出onnx模型程序后,按照如下步骤可将crnn.pth转化为onnx格式:
1. 安装DTK版的Pytorch,下载地址:https://cancon.hpccube.com:65024/4/main/pytorch
2. 安装依赖
```
# 进入migraphx samples工程根目录
cd <path_to_migraphx_samples>
# 进入示例程序目录
cd Python/Ocr/CRNN
# 环境配置
pip install -r requirements.txt
```
3. 静态模型转换
```
python export.py --weights ./weights/crnn.pth
```
4. 动态模型转换
```
python export.py --weights ./weights/crnn.pth --dynamic
```
模型导出后,可以通过netron工具:https://netron.app/ 进行模型可视化,检查模型的输入输出。
## 预处理 ## 预处理
......
...@@ -75,13 +75,13 @@ rbuild build -d depend ...@@ -75,13 +75,13 @@ rbuild build -d depend
**Centos**: **Centos**:
``` ```
export LD_LIBRARY_PATH=<path_to_migraphx_samples>/depend/lib64/:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=<path_to_crnn_migraphx>/depend/lib64/:$LD_LIBRARY_PATH
``` ```
**Ubuntu**: **Ubuntu**:
``` ```
export LD_LIBRARY_PATH=<path_to_migraphx_samples>/depend/lib/:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=<path_to_crnn_migraphx>/depend/lib/:$LD_LIBRARY_PATH
``` ```
然后执行: 然后执行:
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment