algorithm_inference.md 29.3 KB
Newer Older
L
LDOUBLEV 已提交
1

D
dyning 已提交
2
# 基于Python预测引擎推理
L
LDOUBLEV 已提交
3

W
WenmuZhou 已提交
4
inference 模型(`paddle.jit.save`保存的模型)
L
LDOUBLEV 已提交
5 6 7
一般是模型训练,把模型结构和模型参数保存在文件中的固化模型,多用于预测部署场景。
训练过程中保存的模型是checkpoints模型,保存的只有模型的参数,多用于恢复训练等。
与checkpoints模型相比,inference 模型会额外保存模型的结构信息,在预测部署、加速推理上性能优越,灵活方便,适合于实际系统集成。
L
LDOUBLEV 已提交
8

L
LDOUBLEV 已提交
9
接下来首先介绍如何将训练的模型转换成inference模型,然后将依次介绍文本检测、文本角度分类器、文本识别以及三者串联在CPU、GPU上的预测方法。
L
LDOUBLEV 已提交
10

11 12 13

- [一、训练模型转inference模型](#训练模型转inference模型)
    - [检测模型转inference模型](#检测模型转inference模型)
L
licx 已提交
14
    - [识别模型转inference模型](#识别模型转inference模型)  
J
Jethong 已提交
15
    - [方向分类模型转inference模型](#方向分类模型转inference模型)
W
WenmuZhou 已提交
16

M
MissPenguin 已提交
17

18 19 20 21
- [二、文本检测模型推理](#文本检测模型推理)
    - [1. 超轻量中文检测模型推理](#超轻量中文检测模型推理)
    - [2. DB文本检测模型推理](#DB文本检测模型推理)
    - [3. EAST文本检测模型推理](#EAST文本检测模型推理)
L
licx 已提交
22
    - [4. SAST文本检测模型推理](#SAST文本检测模型推理)  
W
WenmuZhou 已提交
23

M
MissPenguin 已提交
24

25 26 27
- [三、文本识别模型推理](#文本识别模型推理)
    - [1. 超轻量中文识别模型推理](#超轻量中文识别模型推理)
    - [2. 基于CTC损失的识别模型推理](#基于CTC损失的识别模型推理)
T
tink2123 已提交
28 29 30
    - [3. 基于SRN损失的识别模型推理](#基于SRN损失的识别模型推理)
    - [4. 自定义文本识别字典的推理](#自定义文本识别字典的推理)
    - [5. 多语言模型的推理](#多语言模型的推理)
W
WenmuZhou 已提交
31

M
MissPenguin 已提交
32

J
Jethong 已提交
33
- [四、方向分类模型推理](#方向识别模型推理)
W
WenmuZhou 已提交
34 35
    - [1. 方向分类模型推理](#方向分类模型推理)

M
MissPenguin 已提交
36

J
Jethong 已提交
37
- [五、文本检测、方向分类和文字识别串联推理](#文本检测、方向分类和文字识别串联推理)
38 39
    - [1. 超轻量中文OCR模型推理](#超轻量中文OCR模型推理)
    - [2. 其他模型推理](#其他模型推理)
W
WenmuZhou 已提交
40

M
MissPenguin 已提交
41

littletomatodonkey's avatar
littletomatodonkey 已提交
42
- [六、参数解释](#参数解释)
littletomatodonkey's avatar
littletomatodonkey 已提交
43

M
MissPenguin 已提交
44

littletomatodonkey's avatar
littletomatodonkey 已提交
45 46
- [七、FAQ](#FAQ)

W
WenmuZhou 已提交
47

48
<a name="训练模型转inference模型"></a>
D
dyning 已提交
49
## 一、训练模型转inference模型
50
<a name="检测模型转inference模型"></a>
L
LDOUBLEV 已提交
51 52 53 54
### 检测模型转inference模型

下载超轻量级中文检测模型:
```
W
WenmuZhou 已提交
55
wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_train.tar && tar xf ./ch_lite/ch_ppocr_mobile_v2.0_det_train.tar -C ./ch_lite/
L
LDOUBLEV 已提交
56 57 58
```
上述模型是以MobileNetV3为backbone训练的DB算法,将训练好的模型转换成inference模型只需要运行如下命令:
```
W
WenmuZhou 已提交
59 60 61 62
# -c 后面设置训练算法的yml配置文件
# -o 配置可选参数
# Global.pretrained_model 参数设置待转换的训练模型地址,不用添加文件后缀 .pdmodel,.pdopt或.pdparams。
# Global.save_inference_dir参数设置转换的模型将保存的地址。
D
dyning 已提交
63

64
python3 tools/export_model.py -c configs/det/ch_ppocr_v2.0/ch_det_mv3_db_v2.0.yml -o Global.pretrained_model=./ch_lite/ch_ppocr_mobile_v2.0_det_train/best_accuracy Global.save_inference_dir=./inference/det_db/
L
LDOUBLEV 已提交
65
```
W
WenmuZhou 已提交
66
转inference模型时,使用的配置文件和训练时使用的配置文件相同。另外,还需要设置配置文件中的`Global.pretrained_model`参数,其指向训练中保存的模型参数文件。
W
WenmuZhou 已提交
67
转换成功后,在模型保存目录下有三个文件:
L
LDOUBLEV 已提交
68
```
L
LDOUBLEV 已提交
69
inference/det_db/
70 71 72
    ├── inference.pdiparams         # 检测inference模型的参数文件
    ├── inference.pdiparams.info    # 检测inference模型的参数信息,可忽略
    └── inference.pdmodel           # 检测inference模型的program文件
L
LDOUBLEV 已提交
73 74
```

75
<a name="识别模型转inference模型"></a>
L
LDOUBLEV 已提交
76 77 78 79
### 识别模型转inference模型

下载超轻量中文识别模型:
```
W
WenmuZhou 已提交
80
wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_train.tar && tar xf ./ch_lite/ch_ppocr_mobile_v2.0_rec_train.tar -C ./ch_lite/
L
LDOUBLEV 已提交
81 82 83 84
```

识别模型转inference模型与检测的方式相同,如下:
```
W
WenmuZhou 已提交
85 86 87 88 89
# -c 后面设置训练算法的yml配置文件
# -o 配置可选参数
# Global.pretrained_model 参数设置待转换的训练模型地址,不用添加文件后缀 .pdmodel,.pdopt或.pdparams。
# Global.save_inference_dir参数设置转换的模型将保存的地址。

90
python3 tools/export_model.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml -o Global.pretrained_model=./ch_lite/ch_ppocr_mobile_v2.0_rec_train/best_accuracy  Global.save_inference_dir=./inference/rec_crnn/
L
LDOUBLEV 已提交
91
```
L
LDOUBLEV 已提交
92

93
**注意:**如果您是在自己的数据集上训练的模型,并且调整了中文字符的字典文件,请注意修改配置文件中的`character_dict_path`是否是所需要的字典文件。
L
LDOUBLEV 已提交
94

W
WenmuZhou 已提交
95
转换成功后,在目录下有三个文件:
L
LDOUBLEV 已提交
96
```
L
LDOUBLEV 已提交
97
/inference/rec_crnn/
98 99 100
    ├── inference.pdiparams         # 识别inference模型的参数文件
    ├── inference.pdiparams.info    # 识别inference模型的参数信息,可忽略
    └── inference.pdmodel           # 识别inference模型的program文件
L
LDOUBLEV 已提交
101
```
L
LDOUBLEV 已提交
102

W
WenmuZhou 已提交
103 104 105 106 107
<a name="方向分类模型转inference模型"></a>
### 方向分类模型转inference模型

下载方向分类模型:
```
W
WenmuZhou 已提交
108
wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_train.tar && tar xf ./ch_lite/ch_ppocr_mobile_v2.0_cls_train.tar -C ./ch_lite/
W
WenmuZhou 已提交
109 110 111 112
```

方向分类模型转inference模型与检测的方式相同,如下:
```
W
WenmuZhou 已提交
113 114 115 116
# -c 后面设置训练算法的yml配置文件
# -o 配置可选参数
# Global.pretrained_model 参数设置待转换的训练模型地址,不用添加文件后缀 .pdmodel,.pdopt或.pdparams。
# Global.save_inference_dir参数设置转换的模型将保存的地址。
W
WenmuZhou 已提交
117

118
python3 tools/export_model.py -c configs/cls/cls_mv3.yml -o Global.pretrained_model=./ch_lite/ch_ppocr_mobile_v2.0_cls_train/best_accuracy  Global.save_inference_dir=./inference/cls/
W
WenmuZhou 已提交
119 120
```

W
WenmuZhou 已提交
121
转换成功后,在目录下有三个文件:
W
WenmuZhou 已提交
122 123
```
/inference/cls/
124
    ├── inference.pdiparams         # 分类inference模型的参数文件
J
Jethong 已提交
125 126 127
    ├── inference.pdiparams.info    # 分类inference模型的参数信息,可忽略
    └── inference.pdmodel           # 分类inference模型的program文件
```
W
WenmuZhou 已提交
128

129
<a name="文本检测模型推理"></a>
D
dyning 已提交
130
## 二、文本检测模型推理
L
LDOUBLEV 已提交
131

132
文本检测模型推理,默认使用DB模型的配置参数。当不使用DB模型时,在推理时,需要通过传入相应的参数进行算法适配,细节参考下文。
D
dyning 已提交
133

134 135
<a name="超轻量中文检测模型推理"></a>
### 1. 超轻量中文检测模型推理
D
dyning 已提交
136 137

超轻量中文检测模型推理,可以执行如下命令:
L
LDOUBLEV 已提交
138 139

```
L
LDOUBLEV 已提交
140 141 142
# 下载超轻量中文检测模型:
wget  https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar
tar xf ch_ppocr_mobile_v2.0_det_infer.tar
L
LDOUBLEV 已提交
143
python3 tools/infer/predict_det.py --image_dir="./doc/imgs/00018069.jpg" --det_model_dir="./ch_ppocr_mobile_v2.0_det_infer/"
L
LDOUBLEV 已提交
144 145
```

146
可视化文本检测结果默认保存到`./inference_results`文件夹里面,结果文件的名称前缀为'det_res'。结果示例如下:
D
dyning 已提交
147

L
LDOUBLEV 已提交
148
![](../imgs_results/det_res_00018069.jpg)
L
LDOUBLEV 已提交
149

L
LDOUBLEV 已提交
150
通过参数`limit_type``det_limit_side_len`来对图片的尺寸进行限制,
M
MissPenguin 已提交
151
`limit_type`可选参数为[`max`, `min`],
L
LDOUBLEV 已提交
152
`det_limit_size_len` 为正整数,一般设置为32 的倍数,比如960。
L
LDOUBLEV 已提交
153

L
LDOUBLEV 已提交
154 155 156 157 158
参数默认设置为`limit_type='max', det_limit_side_len=960`。表示网络输入图像的最长边不能超过960,
如果超过这个值,会对图像做等宽比的resize操作,确保最长边为`det_limit_side_len`
设置为`limit_type='min', det_limit_side_len=960` 则表示限制图像的最短边为960。

如果输入图片的分辨率比较大,而且想使用更大的分辨率预测,可以设置det_limit_side_len 为想要的值,比如1216:
L
LDOUBLEV 已提交
159
```
W
WenmuZhou 已提交
160
python3 tools/infer/predict_det.py --image_dir="./doc/imgs/1.jpg" --det_model_dir="./inference/det_db/" --det_limit_type=max --det_limit_side_len=1216
D
dyning 已提交
161 162
```

D
dyning 已提交
163
如果想使用CPU进行预测,执行命令如下
D
dyning 已提交
164
```
W
WenmuZhou 已提交
165
python3 tools/infer/predict_det.py --image_dir="./doc/imgs/1.jpg" --det_model_dir="./inference/det_db/"  --use_gpu=False
D
dyning 已提交
166 167
```

168 169
<a name="DB文本检测模型推理"></a>
### 2. DB文本检测模型推理
D
dyning 已提交
170

W
WenmuZhou 已提交
171
首先将DB文本检测训练过程中保存的模型,转换成inference model。以基于Resnet50_vd骨干网络,在ICDAR2015英文数据集训练的模型为例( [模型下载地址](https://paddleocr.bj.bcebos.com/dygraph_v2.0/en/det_r50_vd_db_v2.0_train.tar) ),可以使用如下命令进行转换:
D
dyning 已提交
172

L
LDOUBLEV 已提交
173
```
174
python3 tools/export_model.py -c configs/det/det_r50_vd_db.yml -o Global.pretrained_model=./det_r50_vd_db_v2.0_train/best_accuracy  Global.save_inference_dir=./inference/det_db
D
dyning 已提交
175 176 177 178 179 180 181 182
```

DB文本检测模型推理,可以执行如下命令:

```
python3 tools/infer/predict_det.py --image_dir="./doc/imgs_en/img_10.jpg" --det_model_dir="./inference/det_db/"
```

183
可视化文本检测结果默认保存到`./inference_results`文件夹里面,结果文件的名称前缀为'det_res'。结果示例如下:
D
dyning 已提交
184

185
![](../imgs_results/det_res_img_10_db.jpg)
D
dyning 已提交
186

187
**注意**:由于ICDAR2015数据集只有1000张训练图像,且主要针对英文场景,所以上述模型对中文文本图像检测效果会比较差。
D
dyning 已提交
188

189 190
<a name="EAST文本检测模型推理"></a>
### 3. EAST文本检测模型推理
D
dyning 已提交
191

M
MissPenguin 已提交
192
首先将EAST文本检测训练过程中保存的模型,转换成inference model。以基于Resnet50_vd骨干网络,在ICDAR2015英文数据集训练的模型为例( [模型下载地址](https://paddleocr.bj.bcebos.com/dygraph_v2.0/en/det_r50_vd_east_v2.0_train.tar) ),可以使用如下命令进行转换:
D
dyning 已提交
193 194

```
195
python3 tools/export_model.py -c configs/det/det_r50_vd_east.yml -o Global.pretrained_model=./det_r50_vd_east_v2.0_train/best_accuracy  Global.save_inference_dir=./inference/det_east
D
dyning 已提交
196 197
```

L
licx 已提交
198
**EAST文本检测模型推理,需要设置参数`--det_algorithm="EAST"`**,可以执行如下命令:
D
dyning 已提交
199 200

```
L
LDOUBLEV 已提交
201
python3 tools/infer/predict_det.py --det_algorithm="EAST" --image_dir="./doc/imgs_en/img_10.jpg" --det_model_dir="./inference/det_east/"
D
dyning 已提交
202
```
203
可视化文本检测结果默认保存到`./inference_results`文件夹里面,结果文件的名称前缀为'det_res'。结果示例如下:
D
dyning 已提交
204

M
MissPenguin 已提交
205
![](../imgs_results/det_res_img_10_east.jpg)
D
dyning 已提交
206

207 208 209 210 211 212
**注意**:本代码库中,EAST后处理Locality-Aware NMS有python和c++两种版本,c++版速度明显快于python版。由于c++版本nms编译版本问题,只有python3.5环境下会调用c++版nms,其他情况将调用python版nms。


<a name="SAST文本检测模型推理"></a>
### 4. SAST文本检测模型推理
#### (1). 四边形文本检测模型(ICDAR2015)  
M
MissPenguin 已提交
213
首先将SAST文本检测训练过程中保存的模型,转换成inference model。以基于Resnet50_vd骨干网络,在ICDAR2015英文数据集训练的模型为例([模型下载地址](https://paddleocr.bj.bcebos.com/dygraph_v2.0/en/det_r50_vd_sast_icdar15_v2.0_train.tar)),可以使用如下命令进行转换:
214
```
215
python3 tools/export_model.py -c configs/det/det_r50_vd_sast_icdar15.yml -o Global.pretrained_model=./det_r50_vd_sast_icdar15_v2.0_train/best_accuracy  Global.save_inference_dir=./inference/det_sast_ic15
W
WenmuZhou 已提交
216

217
```
L
licx 已提交
218
**SAST文本检测模型推理,需要设置参数`--det_algorithm="SAST"`**,可以执行如下命令:
219 220 221 222 223
```
python3 tools/infer/predict_det.py --det_algorithm="SAST" --image_dir="./doc/imgs_en/img_10.jpg" --det_model_dir="./inference/det_sast_ic15/"
```
可视化文本检测结果默认保存到`./inference_results`文件夹里面,结果文件的名称前缀为'det_res'。结果示例如下:

M
MissPenguin 已提交
224
![](../imgs_results/det_res_img_10_sast.jpg)
225 226

#### (2). 弯曲文本检测模型(Total-Text)  
M
MissPenguin 已提交
227
首先将SAST文本检测训练过程中保存的模型,转换成inference model。以基于Resnet50_vd骨干网络,在Total-Text英文数据集训练的模型为例([模型下载地址](https://paddleocr.bj.bcebos.com/dygraph_v2.0/en/det_r50_vd_sast_totaltext_v2.0_train.tar)),可以使用如下命令进行转换:
L
LDOUBLEV 已提交
228

229
```
230
python3 tools/export_model.py -c configs/det/det_r50_vd_sast_totaltext.yml -o Global.pretrained_model=./det_r50_vd_sast_totaltext_v2.0_train/best_accuracy  Global.save_inference_dir=./inference/det_sast_tt
W
WenmuZhou 已提交
231

232 233
```

W
opt doc  
WenmuZhou 已提交
234
SAST文本检测模型推理,需要设置参数`--det_algorithm="SAST"`,同时,还需要增加参数`--det_sast_polygon=True`,可以执行如下命令:
235 236 237 238
```
python3 tools/infer/predict_det.py --det_algorithm="SAST" --image_dir="./doc/imgs_en/img623.jpg" --det_model_dir="./inference/det_sast_tt/" --det_sast_polygon=True
```
可视化文本检测结果默认保存到`./inference_results`文件夹里面,结果文件的名称前缀为'det_res'。结果示例如下:
L
LDOUBLEV 已提交
239

M
MissPenguin 已提交
240
![](../imgs_results/det_res_img623_sast.jpg)
241 242 243 244 245

**注意**:本代码库中,SAST后处理Locality-Aware NMS有python和c++两种版本,c++版速度明显快于python版。由于c++版本nms编译版本问题,只有python3.5环境下会调用c++版nms,其他情况将调用python版nms。


<a name="文本识别模型推理"></a>
D
dyning 已提交
246
## 三、文本识别模型推理
L
LDOUBLEV 已提交
247

D
dyning 已提交
248
下面将介绍超轻量中文识别模型推理、基于CTC损失的识别模型推理和基于Attention损失的识别模型推理。对于中文文本识别,建议优先选择基于CTC损失的识别模型,实践中也发现基于Attention损失的效果不如基于CTC损失的识别模型。此外,如果训练时修改了文本的字典,请参考下面的自定义文本识别字典的推理。
D
dyning 已提交
249 250


251 252
<a name="超轻量中文识别模型推理"></a>
### 1. 超轻量中文识别模型推理
D
dyning 已提交
253 254 255 256

超轻量中文识别模型推理,可以执行如下命令:

```
W
WenmuZhou 已提交
257 258 259 260
# 下载超轻量中文识别模型:
wget  https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar
tar xf ch_ppocr_mobile_v2.0_rec_infer.tar
python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words/ch/word_4.jpg" --rec_model_dir="ch_ppocr_mobile_v2.0_rec_infer"
D
dyning 已提交
261 262
```

263
![](../imgs_words/ch/word_4.jpg)
D
dyning 已提交
264 265 266

执行命令后,上面图像的预测结果(识别的文本和得分)会打印到屏幕上,示例如下:

W
WenmuZhou 已提交
267 268 269
```bash
Predicts of ./doc/imgs_words/ch/word_4.jpg:('实力活力', 0.98458153)
```
D
dyning 已提交
270

271 272
<a name="基于CTC损失的识别模型推理"></a>
### 2. 基于CTC损失的识别模型推理
D
dyning 已提交
273

W
WenmuZhou 已提交
274
我们以 CRNN 为例,介绍基于CTC损失的识别模型推理。 Rosetta 使用方式类似,不用设置识别算法参数rec_algorithm。
D
dyning 已提交
275

W
WenmuZhou 已提交
276
首先将 CRNN 文本识别训练过程中保存的模型,转换成inference model。以基于Resnet34_vd骨干网络,使用MJSynth和SynthText两个英文文本识别合成数据集训练
W
WenmuZhou 已提交
277
的模型为例( [模型下载地址](https://paddleocr.bj.bcebos.com/dygraph_v2.0/en/rec_r34_vd_none_bilstm_ctc_v2.0_train.tar) ),可以使用如下命令进行转换:
D
dyning 已提交
278 279

```
280
python3 tools/export_model.py -c configs/rec/rec_r34_vd_none_bilstm_ctc.yml -o Global.pretrained_model=./rec_r34_vd_none_bilstm_ctc_v2.0_train/best_accuracy  Global.save_inference_dir=./inference/rec_crnn
D
dyning 已提交
281 282
```

W
WenmuZhou 已提交
283
CRNN 文本识别模型推理,可以执行如下命令:
L
LDOUBLEV 已提交
284 285

```
T
tink2123 已提交
286
python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words_en/word_336.png" --rec_model_dir="./inference/rec_crnn/" --rec_image_shape="3, 32, 100" --rec_char_dict_path="./ppocr/utils/ic15_dict.txt"
L
LDOUBLEV 已提交
287
```
T
tink2123 已提交
288

289
![](../imgs_words_en/word_336.png)
D
dyning 已提交
290 291 292

执行命令后,上面图像的识别结果如下:

W
WenmuZhou 已提交
293 294 295
```bash
Predicts of ./doc/imgs_words_en/word_336.png:('super', 0.9999073)
```
D
dyning 已提交
296 297

**注意**:由于上述模型是参考[DTRB](https://arxiv.org/abs/1904.01906)文本识别训练和评估流程,与超轻量级中文识别模型训练有两方面不同:
L
LDOUBLEV 已提交
298

299
- 训练时采用的图像分辨率不同,训练上述模型采用的图像分辨率是[3,32,100],而中文模型训练时,为了保证长文本的识别效果,训练时采用的图像分辨率是[3, 32, 320]。预测推理程序默认的形状参数是训练中文采用的图像分辨率,即[3, 32, 320]。因此,这里推理上述英文模型时,需要通过参数rec_image_shape设置识别图像的形状。
L
LDOUBLEV 已提交
300

T
tink2123 已提交
301
- 字符列表,DTRB论文中实验只是针对26个小写英文本母和10个数字进行实验,总共36个字符。所有大小字符都转成了小写字符,不在上面列表的字符都忽略,认为是空格。因此这里没有输入字符字典,而是通过如下命令生成字典.因此在推理时需要设置参数rec_char_dict_path,指定为英文字典"./ppocr/utils/ic15_dict.txt"。
L
LDOUBLEV 已提交
302 303

```
D
dyning 已提交
304 305
self.character_str = "0123456789abcdefghijklmnopqrstuvwxyz"
dict_character = list(self.character_str)
L
LDOUBLEV 已提交
306
```
T
tink2123 已提交
307 308 309 310
<a name="基于SRN损失的识别模型推理"></a>
### 3. 基于SRN损失的识别模型推理
基于SRN损失的识别模型,需要额外设置识别算法参数 --rec_algorithm="SRN"。
同时需要保证预测shape与训练时一致,如: --rec_image_shape="1, 64, 256"
W
WenmuZhou 已提交
311

T
tink2123 已提交
312 313 314 315
```
python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words_en/word_336.png" \
                                   --rec_model_dir="./inference/srn/" \
                                   --rec_image_shape="1, 64, 256" \
T
tink2123 已提交
316
                                   --rec_char_dict_path="./ppocr/utils/ic15_dict.txt" \
T
tink2123 已提交
317 318 319 320
                                   --rec_algorithm="SRN"
```

### 4. 自定义文本识别字典的推理
T
tink2123 已提交
321
如果训练时修改了文本的字典,在使用inference模型预测时,需要通过`--rec_char_dict_path`指定使用的字典路径
L
LDOUBLEV 已提交
322 323

```
T
tink2123 已提交
324
python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words_en/word_336.png" --rec_model_dir="./your inference model" --rec_image_shape="3, 32, 100"  --rec_char_dict_path="your text dict path"
L
LDOUBLEV 已提交
325 326
```

W
WenmuZhou 已提交
327
<a name="多语言模型的推理"></a>
T
tink2123 已提交
328
### 5. 多语言模型的推理
W
WenmuZhou 已提交
329
如果您需要预测的是其他语言模型,在使用inference模型预测时,需要通过`--rec_char_dict_path`指定使用的字典路径, 同时为了得到正确的可视化结果,
T
tink2123 已提交
330
需要通过 `--vis_font_path` 指定可视化的字体路径,`doc/fonts/` 路径下有默认提供的小语种字体,例如韩文识别:
W
WenmuZhou 已提交
331 332

```
T
tink2123 已提交
333
python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words/korean/1.jpg" --rec_model_dir="./your inference model"  --rec_char_dict_path="ppocr/utils/dict/korean_dict.txt" --vis_font_path="doc/fonts/korean.ttf"
W
WenmuZhou 已提交
334 335 336 337 338
```
![](../imgs_words/korean/1.jpg)

执行命令后,上图的预测结果为:
``` text
W
WenmuZhou 已提交
339
Predicts of ./doc/imgs_words/korean/1.jpg:('바탕으로', 0.9948904)
W
WenmuZhou 已提交
340 341 342
```

<a name="方向分类模型推理"></a>
J
Jethong 已提交
343
## 四、方向分类模型推理
W
WenmuZhou 已提交
344 345 346 347 348 349 350 351 352

下面将介绍方向分类模型推理。

<a name="方向分类模型推理"></a>
### 1. 方向分类模型推理

方向分类模型推理,可以执行如下命令:

```
W
WenmuZhou 已提交
353 354 355 356
# 下载超轻量中文方向分类器模型:
wget  https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar
tar xf ch_ppocr_mobile_v2.0_cls_infer.tar
python3 tools/infer/predict_cls.py --image_dir="./doc/imgs_words/ch/word_4.jpg" --cls_model_dir="ch_ppocr_mobile_v2.0_cls_infer"
W
WenmuZhou 已提交
357 358
```

W
WenmuZhou 已提交
359
![](../imgs_words/ch/word_1.jpg)
W
WenmuZhou 已提交
360 361 362

执行命令后,上面图像的预测结果(分类的方向和得分)会打印到屏幕上,示例如下:

W
WenmuZhou 已提交
363
```
W
WenmuZhou 已提交
364
Predicts of ./doc/imgs_words/ch/word_4.jpg:['0', 0.9999982]
W
WenmuZhou 已提交
365
```
W
WenmuZhou 已提交
366 367

<a name="文本检测、方向分类和文字识别串联推理"></a>
J
Jethong 已提交
368
## 五、文本检测、方向分类和文字识别串联推理
369 370
<a name="超轻量中文OCR模型推理"></a>
### 1. 超轻量中文OCR模型推理
D
dyning 已提交
371

littletomatodonkey's avatar
littletomatodonkey 已提交
372
在执行预测时,需要通过参数`image_dir`指定单张图像或者图像集合的路径、参数`det_model_dir`,`cls_model_dir``rec_model_dir`分别指定检测,方向分类和识别的inference模型路径。参数`use_angle_cls`用于控制是否启用方向分类模型。`use_mp`表示是否使用多进程。`total_process_num`表示在使用多进程时的进程数。可视化识别结果默认保存到 ./inference_results 文件夹里面。
D
dyning 已提交
373

littletomatodonkey's avatar
littletomatodonkey 已提交
374
```shell
W
WenmuZhou 已提交
375
# 使用方向分类器
W
WenmuZhou 已提交
376
python3 tools/infer/predict_system.py --image_dir="./doc/imgs/00018069.jpg" --det_model_dir="./inference/det_db/" --cls_model_dir="./inference/cls/" --rec_model_dir="./inference/rec_crnn/" --use_angle_cls=true
W
WenmuZhou 已提交
377 378

# 不使用方向分类器
W
WenmuZhou 已提交
379
python3 tools/infer/predict_system.py --image_dir="./doc/imgs/00018069.jpg" --det_model_dir="./inference/det_db/" --rec_model_dir="./inference/rec_crnn/" --use_angle_cls=false
W
WenmuZhou 已提交
380

littletomatodonkey's avatar
littletomatodonkey 已提交
381 382 383
# 使用多进程
python3 tools/infer/predict_system.py --image_dir="./doc/imgs/00018069.jpg" --det_model_dir="./inference/det_db/" --rec_model_dir="./inference/rec_crnn/" --use_angle_cls=false --use_mp=True --total_process_num=6
```
W
WenmuZhou 已提交
384 385 386



D
dyning 已提交
387 388
执行命令后,识别结果图像如下:

W
WenmuZhou 已提交
389
![](../imgs_results/system_res_00018069.jpg)
D
dyning 已提交
390

391 392
<a name="其他模型推理"></a>
### 2. 其他模型推理
D
dyning 已提交
393

394 395
如果想尝试使用其他检测算法或者识别算法,请参考上述文本检测模型推理和文本识别模型推理,更新相应配置和模型。

L
licx 已提交
396
**注意:由于检测框矫正逻辑的局限性,暂不支持使用SAST弯曲文本检测模型(即,使用参数`--det_sast_polygon=True`时)进行模型串联。**
397 398

下面给出基于EAST文本检测和STAR-Net文本识别执行命令:
L
LDOUBLEV 已提交
399 400

```
T
tink2123 已提交
401
python3 tools/infer/predict_system.py --image_dir="./doc/imgs_en/img_10.jpg" --det_model_dir="./inference/det_east/" --det_algorithm="EAST" --rec_model_dir="./inference/starnet/" --rec_image_shape="3, 32, 100" --rec_char_dict_path="./ppocr/utils/ic15_dict.txt"
L
LDOUBLEV 已提交
402
```
D
dyning 已提交
403 404 405

执行命令后,识别结果图像如下:

W
WenmuZhou 已提交
406
![](../imgs_results/img_10_east_starnet.jpg)
littletomatodonkey's avatar
littletomatodonkey 已提交
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514



<a name="参数解释"></a>
# 六、参数解释

更多关于预测过程的参数解释如下所示。

* 全局信息

| 参数名称 | 类型 | 默认值 | 含义 |
| :--: | :--: | :--: | :--: |
|  image_dir | str | 无,必须显式指定 | 图像或者文件夹路径 |
|  vis_font_path | str | "./doc/fonts/simfang.ttf" | 用于可视化的字体路径 |
|  drop_score | float | 0.5 | 识别得分小于该值的结果会被丢弃,不会作为返回结果 |
|  use_pdserving | bool | False | 是否使用Paddle Serving进行预测 |
|  warmup | bool | False | 是否开启warmup,在统计预测耗时的时候,可以使用这种方法 |
|  draw_img_save_dir | str | "./inference_results" | 系统串联预测OCR结果的保存文件夹 |
|  save_crop_res | bool | False  | 是否保存OCR的识别文本图像 |
|  crop_res_save_dir | str | "./output" | 保存OCR识别出来的文本图像路径 |
|  use_mp | bool | False | 是否开启多进程预测  |
|  total_process_num | int | 6 | 开启的进城数,`use_mp``True`时生效  |
|  process_id | int | 0 | 当前进程的id号,无需自己修改  |
|  benchmark | bool | False | 是否开启benchmark,对预测速度、显存占用等进行统计  |
|  save_log_path | str | "./log_output/" | 开启`benchmark`时,日志结果的保存文件夹 |
|  show_log | bool | True | 是否显示预测中的日志信息  |
|  use_onnx | bool | False | 是否开启onnx预测 |


* 预测引擎相关

| 参数名称 | 类型 | 默认值 | 含义 |
| :--: | :--: | :--: | :--: |
|  use_gpu | bool | True | 是否使用GPU进行预测 |
|  ir_optim | bool | True | 是否对计算图进行分析与优化,开启后可以加速预测过程 |
|  use_tensorrt | bool | False | 是否开启tensorrt |
|  min_subgraph_size | int | 15 | tensorrt中最小子图size,当子图的size大于该值时,才会尝试对该子图使用trt engine计算 |
|  precision | str | fp32 | 预测的精度,支持`fp32`, `fp16`, `int8` 3种输入 |
|  enable_mkldnn | bool | True | 是否开启mkldnn |
|  cpu_threads | int | 10 | 开启mkldnn时,cpu预测的线程数 |

* 文本检测模型相关

| 参数名称 | 类型 | 默认值 | 含义 |
| :--: | :--: | :--: | :--: |
|  det_algorithm | str | "DB" | 文本检测算法名称,目前支持`DB`, `EAST`, `SAST`, `PSE`  |
|  det_model_dir | str | xx | 检测inference模型路径 |
|  det_limit_side_len | int | 960 | 检测的图像边长限制 |
|  det_limit_type | str | "max" | 检测的变成限制类型,目前支持`min`, `max``min`表示保证图像最短边不小于`det_limit_side_len``max`表示保证图像最长边不大于`det_limit_side_len` |

其中,DB算法相关参数如下

| 参数名称 | 类型 | 默认值 | 含义 |
| :--: | :--: | :--: | :--: |
|  det_db_thresh | float | 0.3 | DB输出的概率图中,得分大于该阈值的像素点才会被认为是文字像素点 |
|  det_db_box_thresh | float | 0.6 | 检测结果边框内,所有像素点的平均得分大于该阈值时,该结果会被认为是文字区域 |
|  det_db_unclip_ratio | float | 1.5 | `Vatti clipping`算法的扩张系数,使用该方法对文字区域进行扩张 |
|  max_batch_size | int | 10 | 预测的batch size |
|  use_dilation | bool | False | 是否对分割结果进行膨胀以获取更优检测效果 |
|  det_db_score_mode | str | "fast" | DB的检测结果得分计算方法,支持`fast``slow``fast`是根据polygon的外接矩形边框内的所有像素计算平均得分,`slow`是根据原始polygon内的所有像素计算平均得分,计算速度相对较慢一些,但是更加准确一些。 |

EAST算法相关参数如下

| 参数名称 | 类型 | 默认值 | 含义 |
| :--: | :--: | :--: | :--: |
|  det_east_score_thresh | float | 0.8 | EAST后处理中score map的阈值 |
|  det_east_cover_thresh | float | 0.1 | EAST后处理中文本框的平均得分阈值 |
|  det_east_nms_thresh | float | 0.2 | EAST后处理中nms的阈值 |

SAST算法相关参数如下

| 参数名称 | 类型 | 默认值 | 含义 |
| :--: | :--: | :--: | :--: |
|  det_sast_score_thresh | float | 0.5 | SAST后处理中的得分阈值 |
|  det_sast_nms_thresh | float | 0.5 | SAST后处理中nms的阈值 |
|  det_sast_polygon | bool | False | 是否多边形检测,弯曲文本场景(如Total-Text)设置为True |

PSE算法相关参数如下

| 参数名称 | 类型 | 默认值 | 含义 |
| :--: | :--: | :--: | :--: |
|  det_pse_thresh | float | 0.0 | 对输出图做二值化的阈值 |
|  det_pse_box_thresh | float | 0.85 | 对box进行过滤的阈值,低于此阈值的丢弃 |
|  det_pse_min_area | float | 16 | box的最小面积,低于此阈值的丢弃 |
|  det_pse_box_type | str | "box" | 返回框的类型,box:四点坐标,poly: 弯曲文本的所有点坐标 |
|  det_pse_scale | int | 1 | 输入图像相对于进后处理的图的比例,如`640*640`的图像,网络输出为`160*160`,scale为2的情况下,进后处理的图片shape为`320*320`。这个值调大可以加快后处理速度,但是会带来精度的下降 |

* 文本识别模型相关

| 参数名称 | 类型 | 默认值 | 含义 |
| :--: | :--: | :--: | :--: |
|  rec_algorithm | str | "CRNN" | 文本识别算法名称,目前支持`CRNN`, `SRN`, `RARE`, `NETR`, `SAR` |
|  rec_model_dir | str | 无,如果使用识别模型,该项是必填项 | 识别inference模型路径 |
|  rec_image_shape | list | [3, 32, 320] | 识别时的图像尺寸, |
|  rec_batch_num | int | 6 | 识别的batch size |
|  max_text_length | int | 25 | 识别结果最大长度,在`SRN`中有效 |
|  rec_char_dict_path | str | "./ppocr/utils/ppocr_keys_v1.txt" | 识别的字符字典文件 |
|  use_space_char | bool | True | 是否包含空格,如果为`True`,则会在最后字符字典中补充`空格`字符 |


* 端到端文本检测与识别模型相关

| 参数名称 | 类型 | 默认值 | 含义 |
| :--: | :--: | :--: | :--: |
|  e2e_algorithm | str | "PGNet" | 端到端算法名称,目前支持`PGNet` |
|  e2e_model_dir | str | 无,如果使用端到端模型,该项是必填项 | 端到端模型inference模型路径 |
|  e2e_limit_side_len | int | 768 | 端到端的输入图像边长限制 |
|  e2e_limit_type | str | "max" | 端到端的边长限制类型,目前支持`min`, `max``min`表示保证图像最短边不小于`e2e_limit_side_len``max`表示保证图像最长边不大于`e2e_limit_side_len` |
littletomatodonkey's avatar
littletomatodonkey 已提交
515
|  e2e_pgnet_score_thresh | float | 0.5 | 端到端得分阈值,小于该阈值的结果会被丢弃 |
littletomatodonkey's avatar
littletomatodonkey 已提交
516 517 518 519 520 521 522 523 524 525 526 527 528 529 530
|  e2e_char_dict_path | str | "./ppocr/utils/ic15_dict.txt" | 识别的字典文件路径 |
|  e2e_pgnet_valid_set | str | "totaltext" | 验证集名称,目前支持`totaltext`, `partvgg`,不同数据集对应的后处理方式不同,与训练过程保持一致即可 |
|  e2e_pgnet_mode | str | "fast" | PGNet的检测结果得分计算方法,支持`fast``slow``fast`是根据polygon的外接矩形边框内的所有像素计算平均得分,`slow`是根据原始polygon内的所有像素计算平均得分,计算速度相对较慢一些,但是更加准确一些。 |


* 方向分类器模型相关

| 参数名称 | 类型 | 默认值 | 含义 |
| :--: | :--: | :--: | :--: |
|  use_angle_cls | bool | False | 是否使用方向分类器 |
|  cls_model_dir | str | 无,如果需要使用,则必须显式指定路径 | 方向分类器inference模型路径 |
|  cls_image_shape | list | [3, 48, 192] | 预测尺度 |
|  label_list | list | ['0', '180'] | class id对应的角度值 |
|  cls_batch_num | int | 6 | 方向分类器预测的batch size |
|  cls_thresh | float | 0.9 | 预测阈值,模型预测结果为180度,且得分大于该阈值时,认为最终预测结果为180度,需要翻转 |
littletomatodonkey's avatar
littletomatodonkey 已提交
531 532 533 534 535



# 七、FAQ

littletomatodonkey's avatar
fix doc  
littletomatodonkey 已提交
536
* 如果是使用paddle2.0之前版本的代码导出的`inference模型`,则其文件名为`model``params`,分别对应paddle2.0或者之后版本导出的`inference.pdmodel``inference.pdiparams`;不过目前PaddleOCR的release分支已经不支持paddle2.0之前版本导出的inference 模型,如果希望使用,需要使用develop分支(静态图分支)的代码与文档。