Commit 84c7a8c8 authored by liucong's avatar liucong
Browse files

修改crnn工程格式

parent f1b9035f
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
CRNN是文本识别领域的一种经典算法。该算法的主要思想是认为文本识别需要对序列进行预测,所以采用了预测序列常用的RNN网络。算法通过CNN提取图片特征,然后采用RNN对序列进行预测,最终使用CTC方法得到最终结果。模型的主要结构包括基于CNN的图像特征提取模块以及基于双向LSTM的文字序列特征提取模块,网络结构如下图所示。 CRNN是文本识别领域的一种经典算法。该算法的主要思想是认为文本识别需要对序列进行预测,所以采用了预测序列常用的RNN网络。算法通过CNN提取图片特征,然后采用RNN对序列进行预测,最终使用CTC方法得到最终结果。模型的主要结构包括基于CNN的图像特征提取模块以及基于双向LSTM的文字序列特征提取模块,网络结构如下图所示。
<img src="./CRNN_01.jpg" alt="CRNN_01" /> <img src="./Images/CRNN_01.jpg" alt="CRNN_01" />
本示例采用了如下的开源实现:https://github.com/meijieru/crnn.pytorch, 作者提供了CRNN的预训练模型。 本示例采用了如下的开源实现:https://github.com/meijieru/crnn.pytorch, 作者提供了CRNN的预训练模型。
...@@ -123,7 +123,10 @@ CRNN是文本识别领域的一种经典算法。该算法的主要思想是认 ...@@ -123,7 +123,10 @@ CRNN是文本识别领域的一种经典算法。该算法的主要思想是认
// 推理 // 推理
std::vector<migraphx::argument> inferenceResults = net.eval(inputData); std::vector<migraphx::argument> inferenceResults = net.eval(inputData);
// 如果想要指定输出节点,可以给eval()函数中提供outputNames参数来实现
//std::vector<std::string> outputNames = {"output"};
//std::vector<migraphx::argument> inferenceResults = net.eval(inputData, outputNames);
// 获取推理结果 // 获取推理结果
std::vector<cv::Mat> outs; std::vector<cv::Mat> outs;
migraphx::argument result = inferenceResults[0]; migraphx::argument result = inferenceResults[0];
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
CRNN是文本识别领域的一种经典算法。该算法的主要思想是认为文本识别需要对序列进行预测,所以采用了预测序列常用的RNN网络。算法通过CNN提取图片特征,然后采用RNN对序列进行预测,最终使用CTC方法得到最终结果。模型的主要结构包括基于CNN的图像特征提取模块以及基于双向LSTM的文字序列特征提取模块,网络结构如下图所示。 CRNN是文本识别领域的一种经典算法。该算法的主要思想是认为文本识别需要对序列进行预测,所以采用了预测序列常用的RNN网络。算法通过CNN提取图片特征,然后采用RNN对序列进行预测,最终使用CTC方法得到最终结果。模型的主要结构包括基于CNN的图像特征提取模块以及基于双向LSTM的文字序列特征提取模块,网络结构如下图所示。
<img src="./CRNN_01.jpg" alt="CRNN_01" /> <img src="./Images/CRNN_01.jpg" alt="CRNN_01"/>
本示例采用了如下的开源实现:https://github.com/meijieru/crnn.pytorch, 作者提供了CRNN的预训练模型。 本示例采用了如下的开源实现:https://github.com/meijieru/crnn.pytorch, 作者提供了CRNN的预训练模型。
...@@ -35,12 +35,23 @@ class Crnn: ...@@ -35,12 +35,23 @@ class Crnn:
def __init__(self, path): def __init__(self, path):
# 解析推理模型 # 解析推理模型
self.model = migraphx.parse_onnx(path) self.model = migraphx.parse_onnx(path)
# 获取模型输入/输出节点信息
print("inputs:")
inputs = self.model.get_inputs()
for key,value in inputs.items():
print("{}:{}".format(key,value))
print("outputs:")
outputs = self.model.get_outputs()
for key,value in outputs.items():
print("{}:{}".format(key,value))
# 获取模型的输入name # 获取模型的输入name
self.inputName = self.model.get_parameter_names()[0] self.inputName = self.model.get_parameter_names()[0]
# 获取模型的输入尺寸 # 获取模型的输入尺寸
self.inputShape = self.model.get_parameter_shapes()[self.inputName].lens() self.inputShape = inputs[self.inputName].lens()
... ...
``` ```
......
# Convolutional Recurrent Neural Network(CRNN) # CRNN
## 模型介绍 ## 论文
CRNN是文本识别领域的一种经典算法,该算法的主要思想是认为文本识别需要对序列进行预测,所以采用了预测序列常用的RNN网络。算法通过CNN提取图片特征,然后采用RNN对序列进行预测,最终使用CTC方法得到最终结果。 An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition
- https://arxiv.org/abs/1507.05717
## 模型结构 ## 模型结构
CRNN模型的主要结构包括基于CNN的图像特征提取模块以及基于双向LSTM的文字序列特征提取模块。 CRNN模型的主要结构包括基于CNN的图像特征提取模块以及基于双向LSTM的文字序列特征提取模块。
## Python版本推理 <img src="./Doc/Images/CRNN_01.jpg" style="zoom:100%;" align=middle>
下面介绍如何运行Python代码示例,Python示例的详细说明见Doc目录下的Tutorial_Python.md。 ## 算法原理
CRNN是文本识别领域的一种经典算法,该算法的主要思想是认为文本识别需要对序列进行预测,所以采用了预测序列常用的RNN网络。该算法首先通过CNN提取图片特征,然后采用RNN对序列进行预测,最终使用CTC方法得到最终结果。
## 环境配置
### 下载镜像 ### Docker
下载MIGraphX镜像: 拉取镜像:
```python ```plaintext
docker pull sugonhub/migraphx:3.2.1-centos7.6-dtk-23.04.1-py38 docker pull sugonhub/migraphx:3.2.1-centos7.6-dtk-23.04.1-py38
``` ```
### 设置Python环境变量 创建并启动容器,安装相关依赖:
```plaintext
docker run --shm-size 16g --network=host --name=crnn_migraphx --privileged --device=/dev/kfd --device=/dev/dri --group-add video --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -v $PWD/crnn_migraphx:/home/crnn_migraphx -it <Your Image ID> /bin/bash
# 激活dtk
source /opt/dtk/env.sh
```
## 数据集
根据提供的样本数据,进行文本识别。
## 推理
### Python版本推理
下面介绍如何运行Python代码示例,Python示例的详细说明见Doc目录下的Tutorial_Python.md。
#### 设置环境变量
``` ```
export PYTHONPATH=/opt/dtk/lib:$PYTHONPATH export PYTHONPATH=/opt/dtk/lib:$PYTHONPATH
``` ```
### 安装依赖 #### 运行示例
CRNN工程的Python推理示例仅提供静态推理,可使用如下命令运行: CRNN工程的Python推理示例仅提供静态推理,可使用如下命令运行:
...@@ -35,43 +60,24 @@ CRNN工程的Python推理示例仅提供静态推理,可使用如下命令运 ...@@ -35,43 +60,24 @@ CRNN工程的Python推理示例仅提供静态推理,可使用如下命令运
cd <path_to_crnn_migraphx>/Python cd <path_to_crnn_migraphx>/Python
# 安装依赖 # 安装依赖
pip install -r requirements.txt pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
```
### 运行示例
在Python目录下执行如下命令运行该示例程序: # 运行示例
```
python Crnn_infer_migraphx.py python Crnn_infer_migraphx.py
``` ```
文本识别结果为: ### C++版本推理
```
a-----v--a-i-l-a-bb-l-e--- => available
```
## C++版本推理
下面介绍如何运行C++代码示例,C++示例的详细说明见Doc目录下的Tutorial_Cpp.md。 下面介绍如何运行C++代码示例,C++示例的详细说明见Doc目录下的Tutorial_Cpp.md。
### 下载镜像
下载MIGraphX镜像: #### 构建工程
```
docker pull sugonhub/migraphx:3.2.1-centos7.6-dtk-23.04.1-py38
```
### 构建工程
``` ```
rbuild build -d depend rbuild build -d depend
``` ```
### 设置环境变量 #### 设置环境变量
将依赖库依赖加入环境变量LD_LIBRARY_PATH,在~/.bashrc中添加如下语句: 将依赖库依赖加入环境变量LD_LIBRARY_PATH,在~/.bashrc中添加如下语句:
...@@ -85,7 +91,7 @@ export LD_LIBRARY_PATH=<path_to_crnn_migraphx>/depend/lib64/:$LD_LIBRARY_PATH ...@@ -85,7 +91,7 @@ export LD_LIBRARY_PATH=<path_to_crnn_migraphx>/depend/lib64/:$LD_LIBRARY_PATH
source ~/.bashrc source ~/.bashrc
``` ```
### 运行示例 #### 运行示例
成功编译CRNN工程后,执行如下命令运行该示例: 成功编译CRNN工程后,执行如下命令运行该示例:
...@@ -103,27 +109,48 @@ cd build/ ...@@ -103,27 +109,48 @@ cd build/
./CRNN 0 ./CRNN 0
``` ```
静态推理示例输入样本图像为: 2. 动态shape推理
```
# 执行动态推理示例程序
./CRNN 1
```
## result
### Python版本
![text0](./Resource/Images/CrnnDynamicPic/text0.jpg) 输入样本图像得到文本识别的结果
文本识别结果为: <img src="./Resource/Images/text.jpg" style="zoom:100%;" align=middle>
``` ```
a-----v--a-i-l-a-bb-l-e--- => available a-----v--a-i-l-a-bb-l-e--- => available
``` ```
2. 动态shape推理 ### C++版本
``` 静态推理:
# 开启环境变量
export MIGRAPHX_DYNAMIC_SHAPE=1
# 执行动态推理示例程序 输入样本图像得到文本识别的结果
./CRNN 1
<img src="./Resource/Images/CrnnDynamicPic/text0.jpg" style="zoom:100%;" align=middle>
```
a-----v--a-i-l-a-bb-l-e--- => available
``` ```
文本识别结果: 动态推理:
可以连续对多张样本图像进行文本识别
<img src="./Resource/Images/CrnnDynamicPic/text0.jpg" style="zoom:100%;" align=middle>
<img src="./Resource/Images/CrnnDynamicPic/text1.jpg" style="zoom:80%;" align=middle>
<img src="./Resource/Images/CrnnDynamicPic/text2.jpg" style="zoom:60%;" align=middle>
<img src="./Resource/Images/CrnnDynamicPic/text3.jpg" style="zoom:80%;" align=middle>
``` ```
available available
...@@ -132,10 +159,20 @@ waiting ...@@ -132,10 +159,20 @@ waiting
recognition recognition
``` ```
## 应用场景
### 算法类别
`ocr`
### 热点应用行业
`工业制造``金融``交通``教育``医疗`
## 源码仓库及问题反馈 ## 源码仓库及问题反馈
https://developer.hpccube.com/codes/modelzoo/crnn_migraphx https://developer.hpccube.com/codes/modelzoo/crnn_migraphx
## 参考 ## 参考
https://github.com/meijieru/crnn.pytorch https://github.com/meijieru/crnn.pytorch
# 模型唯一标识
modelCode = 219
#模型名称 #模型名称
modelName=CRNN_MIGraphX modelName=crnn_migraphx
#模型描述 #模型描述
modelDescription=CRNN模型是图像文本识别领域的经典算法,主要用于端到端地对不定长的文本序列进行识别。 modelDescription=CRNN模型是图像文本识别领域的经典算法,主要用于端到端地对不定长的文本序列进行识别。
#应用场景 #应用场景
appScenario=推理,0CR appScenario=推理,0CR,文本识别
#框架类型 #框架类型
frameType=MIGraphX frameType=migraphx
\ No newline at end of file \ No newline at end of file
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