readme.md 11.6 KB
Newer Older
文幕地方's avatar
文幕地方 已提交
1 2 3 4 5 6 7 8 9 10 11
- [服务器端C++预测](#服务器端c预测)
  - [1. 准备环境](#1-准备环境)
    - [1.0 运行准备](#10-运行准备)
    - [1.1 编译opencv库](#11-编译opencv库)
    - [1.2 下载或者编译Paddle预测库](#12-下载或者编译paddle预测库)
      - [1.2.1 直接下载安装](#121-直接下载安装)
      - [1.2.2 预测库源码编译](#122-预测库源码编译)
  - [2 开始运行](#2-开始运行)
    - [2.1 将模型导出为inference model](#21-将模型导出为inference-model)
    - [2.2 编译PaddleOCR C++预测demo](#22-编译paddleocr-c预测demo)
    - [2.3 运行demo](#23-运行demo)
12 13 14 15 16 17
        - [1. 检测+分类+识别:](#1-检测分类识别)
        - [2. 检测+识别:](#2-检测识别)
        - [3. 检测:](#3-检测)
        - [4. 分类+识别:](#4-分类识别)
        - [5. 识别:](#5-识别)
        - [6. 分类:](#6-分类)
文幕地方's avatar
文幕地方 已提交
18 19 20 21 22 23 24 25
  - [3. FAQ](#3-faq)

# 服务器端C++预测

本章节介绍PaddleOCR 模型的的C++部署方法,与之对应的python预测部署方式参考[文档](../../doc/doc_ch/inference.md)
C++在性能计算上优于python,因此,在大多数CPU、GPU部署场景,多采用C++的部署方式,本节将介绍如何在Linux\Windows (CPU\GPU)环境下配置C++环境并完成
PaddleOCR模型部署。

26 27

<a name="1"></a>
littletomatodonkey's avatar
littletomatodonkey 已提交
28 29 30

## 1. 准备环境

31 32 33 34
<a name="10"></a>

### 1.0 运行准备

littletomatodonkey's avatar
littletomatodonkey 已提交
35
- Linux环境,推荐使用docker。
文幕地方's avatar
文幕地方 已提交
36
- Windows环境。
37 38

* 该文档主要介绍基于Linux环境的PaddleOCR C++预测流程,如果需要在Windows下基于预测库进行C++预测,具体编译方法请参考[Windows下编译教程](./docs/windows_vs2019_build.md)
littletomatodonkey's avatar
littletomatodonkey 已提交
39

40 41
<a name="11"></a>

littletomatodonkey's avatar
littletomatodonkey 已提交
42 43 44 45
### 1.1 编译opencv库

* 首先需要从opencv官网上下载在Linux环境下源码编译的包,以opencv3.4.7为例,下载命令如下。

littletomatodonkey's avatar
littletomatodonkey 已提交
46
```bash
W
WenmuZhou 已提交
47
cd deploy/cpp_infer
littletomatodonkey's avatar
littletomatodonkey 已提交
48 49
wget https://paddleocr.bj.bcebos.com/libs/opencv/opencv-3.4.7.tar.gz
tar -xf opencv-3.4.7.tar.gz
littletomatodonkey's avatar
littletomatodonkey 已提交
50 51 52 53 54 55 56
```

最终可以在当前目录下看到`opencv-3.4.7/`的文件夹。

* 编译opencv,设置opencv源码路径(`root_path`)以及安装路径(`install_path`)。进入opencv源码路径下,按照下面的方式进行编译。

```shell
littletomatodonkey's avatar
littletomatodonkey 已提交
57
root_path="your_opencv_root_path"
littletomatodonkey's avatar
littletomatodonkey 已提交
58
install_path=${root_path}/opencv3
littletomatodonkey's avatar
littletomatodonkey 已提交
59
build_dir=${root_path}/build
littletomatodonkey's avatar
littletomatodonkey 已提交
60

littletomatodonkey's avatar
littletomatodonkey 已提交
61 62 63
rm -rf ${build_dir}
mkdir ${build_dir}
cd ${build_dir}
littletomatodonkey's avatar
littletomatodonkey 已提交
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

cmake .. \
    -DCMAKE_INSTALL_PREFIX=${install_path} \
    -DCMAKE_BUILD_TYPE=Release \
    -DBUILD_SHARED_LIBS=OFF \
    -DWITH_IPP=OFF \
    -DBUILD_IPP_IW=OFF \
    -DWITH_LAPACK=OFF \
    -DWITH_EIGEN=OFF \
    -DCMAKE_INSTALL_LIBDIR=lib64 \
    -DWITH_ZLIB=ON \
    -DBUILD_ZLIB=ON \
    -DWITH_JPEG=ON \
    -DBUILD_JPEG=ON \
    -DWITH_PNG=ON \
    -DBUILD_PNG=ON \
    -DWITH_TIFF=ON \
    -DBUILD_TIFF=ON

make -j
make install
```

littletomatodonkey's avatar
littletomatodonkey 已提交
87 88 89 90 91
也可以直接修改`tools/build_opencv.sh`的内容,然后直接运行下面的命令进行编译。

```shell
sh tools/build_opencv.sh
```
littletomatodonkey's avatar
littletomatodonkey 已提交
92 93 94

其中`root_path`为下载的opencv源码路径,`install_path`为opencv的安装路径,`make install`完成之后,会在该文件夹下生成opencv头文件和库文件,用于后面的OCR代码编译。

littletomatodonkey's avatar
littletomatodonkey 已提交
95 96 97 98 99 100 101 102 103 104 105
最终在安装路径下的文件结构如下所示。

```
opencv3/
|-- bin
|-- include
|-- lib
|-- lib64
|-- share
```

106 107
<a name="12"></a>

littletomatodonkey's avatar
littletomatodonkey 已提交
108 109 110 111
### 1.2 下载或者编译Paddle预测库

* 有2种方式获取Paddle预测库,下面进行详细介绍。

L
LDOUBLEV 已提交
112

littletomatodonkey's avatar
littletomatodonkey 已提交
113 114
#### 1.2.1 直接下载安装

文幕地方's avatar
文幕地方 已提交
115
* [Paddle预测库官网](https://paddleinference.paddlepaddle.org.cn/user_guides/download_lib.html#linux) 上提供了不同cuda版本的Linux预测库,可以在官网查看并选择合适的预测库版本(*建议选择paddle版本>=2.0.1版本的预测库* )。
littletomatodonkey's avatar
littletomatodonkey 已提交
116 117 118 119 120 121 122 123 124 125

* 下载之后使用下面的方法解压。

```
tar -xf paddle_inference.tgz
```

最终会在当前的文件夹中生成`paddle_inference/`的子文件夹。

#### 1.2.2 预测库源码编译
littletomatodonkey's avatar
littletomatodonkey 已提交
126
* 如果希望获取最新预测库特性,可以从Paddle github上克隆最新代码,源码编译预测库。
L
LDOUBLEV 已提交
127
* 可以参考[Paddle预测库安装编译说明](https://www.paddlepaddle.org.cn/documentation/docs/zh/2.0/guides/05_inference_deployment/inference/build_and_install_lib_cn.html#congyuanmabianyi) 的说明,从github上获取Paddle代码,然后进行编译,生成最新的预测库。使用git获取代码方法如下。
littletomatodonkey's avatar
littletomatodonkey 已提交
128 129 130

```shell
git clone https://github.com/PaddlePaddle/Paddle.git
L
LDOUBLEV 已提交
131
git checkout develop
littletomatodonkey's avatar
littletomatodonkey 已提交
132 133 134 135 136 137 138 139 140 141 142 143
```

* 进入Paddle目录后,编译方法如下。

```shell
rm -rf build
mkdir build
cd build

cmake  .. \
    -DWITH_CONTRIB=OFF \
    -DWITH_MKL=ON \
littletomatodonkey's avatar
littletomatodonkey 已提交
144
    -DWITH_MKLDNN=ON  \
littletomatodonkey's avatar
littletomatodonkey 已提交
145 146 147 148 149
    -DWITH_TESTING=OFF \
    -DCMAKE_BUILD_TYPE=Release \
    -DWITH_INFERENCE_API_TEST=OFF \
    -DON_INFER=ON \
    -DWITH_PYTHON=ON
littletomatodonkey's avatar
littletomatodonkey 已提交
150
make -j
littletomatodonkey's avatar
littletomatodonkey 已提交
151 152 153
make inference_lib_dist
```

L
LDOUBLEV 已提交
154
更多编译参数选项介绍可以参考[文档说明](https://www.paddlepaddle.org.cn/documentation/docs/zh/2.0/guides/05_inference_deployment/inference/build_and_install_lib_cn.html#congyuanmabianyi)
littletomatodonkey's avatar
littletomatodonkey 已提交
155 156


L
LDOUBLEV 已提交
157
* 编译完成之后,可以在`build/paddle_inference_install_dir/`文件下看到生成了以下文件及文件夹。
littletomatodonkey's avatar
littletomatodonkey 已提交
158 159

```
L
LDOUBLEV 已提交
160
build/paddle_inference_install_dir/
littletomatodonkey's avatar
littletomatodonkey 已提交
161 162 163 164 165 166
|-- CMakeCache.txt
|-- paddle
|-- third_party
|-- version.txt
```

L
LDOUBLEV 已提交
167
其中`paddle`就是C++预测所需的Paddle库,`version.txt`中包含当前预测库的版本信息。
littletomatodonkey's avatar
littletomatodonkey 已提交
168

169
<a name="2"></a>
littletomatodonkey's avatar
littletomatodonkey 已提交
170

littletomatodonkey's avatar
littletomatodonkey 已提交
171 172
## 2 开始运行

173 174
<a name="21"></a>

littletomatodonkey's avatar
littletomatodonkey 已提交
175 176 177 178 179 180 181
### 2.1 将模型导出为inference model

* 可以参考[模型预测章节](../../doc/doc_ch/inference.md),导出inference model,用于模型预测。模型导出之后,假设放在`inference`目录下,则目录结构如下。

```
inference/
|-- det_db
M
MissPenguin 已提交
182 183
|   |--inference.pdiparams
|   |--inference.pdmodel
littletomatodonkey's avatar
littletomatodonkey 已提交
184
|-- rec_rcnn
M
MissPenguin 已提交
185 186
|   |--inference.pdiparams
|   |--inference.pdmodel
187 188 189
|-- cls
|   |--inference.pdiparams
|   |--inference.pdmodel
littletomatodonkey's avatar
littletomatodonkey 已提交
190 191
```

192
<a name="22"></a>
littletomatodonkey's avatar
littletomatodonkey 已提交
193 194 195 196 197

### 2.2 编译PaddleOCR C++预测demo

* 编译命令如下,其中Paddle C++预测库、opencv等其他依赖库的地址需要换成自己机器上的实际地址。

M
MissPenguin 已提交
198
```shell
M
MissPenguin 已提交
199
sh tools/build.sh
littletomatodonkey's avatar
littletomatodonkey 已提交
200 201
```

M
MissPenguin 已提交
202
* 具体的,需要修改`tools/build.sh`中环境路径,相关内容如下:
littletomatodonkey's avatar
littletomatodonkey 已提交
203 204

```shell
littletomatodonkey's avatar
littletomatodonkey 已提交
205 206 207 208
OPENCV_DIR=your_opencv_dir
LIB_DIR=your_paddle_inference_dir
CUDA_LIB_DIR=your_cuda_lib_dir
CUDNN_LIB_DIR=/your_cudnn_lib_dir
littletomatodonkey's avatar
littletomatodonkey 已提交
209 210
```

M
MissPenguin 已提交
211
其中,`OPENCV_DIR`为opencv编译安装的地址;`LIB_DIR`为下载(`paddle_inference`文件夹)或者编译生成的Paddle预测库地址(`build/paddle_inference_install_dir`文件夹);`CUDA_LIB_DIR`为cuda库文件地址,在docker中为`/usr/local/cuda/lib64``CUDNN_LIB_DIR`为cudnn库文件地址,在docker中为`/usr/lib/x86_64-linux-gnu/`**注意:以上路径都写绝对路径,不要写相对路径。**
littletomatodonkey's avatar
littletomatodonkey 已提交
212 213


M
MissPenguin 已提交
214
* 编译完成之后,会在`build`文件夹下生成一个名为`ppocr`的可执行文件。
littletomatodonkey's avatar
littletomatodonkey 已提交
215

216
<a name="23"></a>
littletomatodonkey's avatar
littletomatodonkey 已提交
217

218
### 2.3 运行demo
M
MissPenguin 已提交
219 220 221

运行方式:  
```shell
222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
./build/ppocr [--param1] [--param2] [...]
```
具体命令如下:

##### 1. 检测+分类+识别:
```shell
./build/ppocr --det_model_dir=inference/det_db \
    --rec_model_dir=inference/rec_rcnn \
    --cls_model_dir=inference/cls \
    --image_dir=../../doc/imgs/12.jpg \
    --use_angle_cls=true \
    --det=true \
    --rec=true \
    --cls=true \
```

##### 2. 检测+识别:
```shell
./build/ppocr --det_model_dir=inference/det_db \
    --rec_model_dir=inference/rec_rcnn \
    --image_dir=../../doc/imgs/12.jpg \
    --use_angle_cls=false \
    --det=true \
    --rec=true \
    --cls=false \
```

##### 3. 检测:
```shell
./build/ppocr --det_model_dir=inference/det_db \
    --image_dir=../../doc/imgs/12.jpg \
    --det=true \
    --rec=false
255
```
M
MissPenguin 已提交
256

257
##### 4. 分类+识别:
littletomatodonkey's avatar
littletomatodonkey 已提交
258
```shell
259 260 261 262 263 264 265
./build/ppocr --rec_model_dir=inference/rec_rcnn \
    --cls_model_dir=inference/cls \
    --image_dir=../../doc/imgs_words/ch/word_1.jpg \
    --use_angle_cls=true \
    --det=false \
    --rec=true \
    --cls=true \
Z
zhoujun 已提交
266
```
267 268

##### 5. 识别:
M
MissPenguin 已提交
269
```shell
270 271 272 273 274 275
./build/ppocr --rec_model_dir=inference/rec_rcnn \
    --image_dir=../../doc/imgs_words/ch/word_1.jpg \
    --use_angle_cls=false \
    --det=false \
    --rec=true \
    --cls=false \
Z
zhoujun 已提交
276
```
277 278

##### 6. 分类:
M
MissPenguin 已提交
279
```shell
280 281 282
./build/ppocr --cls_model_dir=inference/cls \
    --cls_model_dir=inference/cls \
    --image_dir=../../doc/imgs_words/ch/word_1.jpg \
M
MissPenguin 已提交
283
    --use_angle_cls=true \
284 285 286
    --det=false \
    --rec=false \
    --cls=true \
M
MissPenguin 已提交
287 288
```

littletomatodonkey's avatar
littletomatodonkey 已提交
289
更多支持的可调节参数解释如下:
M
MissPenguin 已提交
290

M
MissPenguin 已提交
291 292
- 通用参数

M
MissPenguin 已提交
293
|参数名称|类型|默认参数|意义|
littletomatodonkey's avatar
littletomatodonkey 已提交
294
| :---: | :---: | :---: | :---: |
M
MissPenguin 已提交
295 296 297 298
|use_gpu|bool|false|是否使用GPU|
|gpu_id|int|0|GPU id,使用GPU时有效|
|gpu_mem|int|4000|申请的GPU内存|
|cpu_math_library_num_threads|int|10|CPU预测时的线程数,在机器核数充足的情况下,该值越大,预测速度越快|
文幕地方's avatar
文幕地方 已提交
299
|enable_mkldnn|bool|true|是否使用mkldnn库|
文幕地方's avatar
文幕地方 已提交
300
|output|str|./output|可视化结果保存的路径|
M
MissPenguin 已提交
301

302 303 304 305 306 307 308 309 310
- 前向相关

|参数名称|类型|默认参数|意义|
| :---: | :---: | :---: | :---: |
|det|bool|true|前向是否执行文字检测|
|rec|bool|true|前向是否执行文字识别|
|cls|bool|false|前向是否执行文字方向分类|


M
MissPenguin 已提交
311 312 313
- 检测模型相关

|参数名称|类型|默认参数|意义|
littletomatodonkey's avatar
littletomatodonkey 已提交
314
| :---: | :---: | :---: | :---: |
M
MissPenguin 已提交
315 316 317 318 319
|det_model_dir|string|-|检测模型inference model地址|
|max_side_len|int|960|输入图像长宽大于960时,等比例缩放图像,使得图像最长边为960|
|det_db_thresh|float|0.3|用于过滤DB预测的二值化图像,设置为0.-0.3对结果影响不明显|
|det_db_box_thresh|float|0.5|DB后处理过滤box的阈值,如果检测存在漏框情况,可酌情减小|
|det_db_unclip_ratio|float|1.6|表示文本框的紧致程度,越小则文本框更靠近文本|
文幕地方's avatar
fix bug  
文幕地方 已提交
320
|det_db_score_mode|string|slow|slow:使用多边形框计算bbox score,fast:使用矩形框计算。矩形框计算速度更快,多边形框对弯曲文本区域计算更准确。|
文幕地方's avatar
文幕地方 已提交
321
|visualize|bool|true|是否对结果进行可视化,为1时,预测结果会保存在`output`字段指定的文件夹下和输入图像同名的图像上。|
M
MissPenguin 已提交
322 323 324 325

- 方向分类器相关

|参数名称|类型|默认参数|意义|
littletomatodonkey's avatar
littletomatodonkey 已提交
326
| :---: | :---: | :---: | :---: |
M
MissPenguin 已提交
327 328 329
|use_angle_cls|bool|false|是否使用方向分类器|
|cls_model_dir|string|-|方向分类器inference model地址|
|cls_thresh|float|0.9|方向分类器的得分阈值|
330
|cls_batch_num|int|1|方向分类器batchsize|
M
MissPenguin 已提交
331 332 333 334

- 识别模型相关

|参数名称|类型|默认参数|意义|
littletomatodonkey's avatar
littletomatodonkey 已提交
335
| :---: | :---: | :---: | :---: |
M
MissPenguin 已提交
336
|rec_model_dir|string|-|识别模型inference model地址|
文幕地方's avatar
文幕地方 已提交
337
|rec_char_dict_path|string|../../ppocr/utils/ppocr_keys_v1.txt|字典文件|
338
|rec_batch_num|int|6|识别模型batchsize|
M
MissPenguin 已提交
339 340


文幕地方's avatar
文幕地方 已提交
341
* PaddleOCR也支持多语言的预测,更多支持的语言和模型可以参考[识别文档](../../doc/doc_ch/recognition.md)中的多语言字典与模型部分,如果希望进行多语言预测,只需将修改`rec_char_dict_path`(字典文件路径)以及`rec_model_dir`(inference模型路径)字段即可。
Z
zhoujun 已提交
342

littletomatodonkey's avatar
littletomatodonkey 已提交
343 344
最终屏幕上会输出检测结果如下。

345 346 347 348 349 350 351 352 353
```bash
predict img: ../../doc/imgs/12.jpg
../../doc/imgs/12.jpg
0       det boxes: [[79,553],[399,541],[400,573],[80,585]] rec text: 打浦路252935号 rec score: 0.933757
1       det boxes: [[31,509],[510,488],[511,529],[33,549]] rec text: 绿洲仕格维花园公寓 rec score: 0.951745
2       det boxes: [[181,456],[395,448],[396,480],[182,488]] rec text: 打浦路15号 rec score: 0.91956
3       det boxes: [[43,413],[480,391],[481,428],[45,450]] rec text: 上海斯格威铂尔多大酒店 rec score: 0.915914
The detection visualized image saved in ./output//12.jpg
```
littletomatodonkey's avatar
littletomatodonkey 已提交
354

文幕地方's avatar
文幕地方 已提交
355
## 3. FAQ
littletomatodonkey's avatar
littletomatodonkey 已提交
356

文幕地方's avatar
文幕地方 已提交
357
 1.  遇到报错 `unable to access 'https://github.com/LDOUBLEV/AutoLog.git/': gnutls_handshake() failed: The TLS connection was non-properly terminated.`, 将 `deploy/cpp_infer/external-cmake/auto-log.cmake` 中的github地址改为 https://gitee.com/Double_V/AutoLog 地址即可。