readme_en.md 14.9 KB
Newer Older
W
WenmuZhou 已提交
1 2
# Tutorial of PaddleOCR Mobile deployment

W
WenmuZhou 已提交
3
This tutorial will introduce how to use [Paddle Lite](https://github.com/PaddlePaddle/Paddle-Lite) to deploy paddleOCR ultra-lightweight Chinese and English detection models on mobile phones.
W
WenmuZhou 已提交
4

W
WenmuZhou 已提交
5
paddle-lite is a lightweight inference engine for PaddlePaddle. It provides efficient inference capabilities for mobile phones and IoTs, and extensively integrates cross-platform hardware to provide lightweight deployment solutions for end-side deployment issues.
W
WenmuZhou 已提交
6 7 8

## 1. Preparation

W
WenmuZhou 已提交
9 10
### 运行准备

W
WenmuZhou 已提交
11 12 13
- Computer (for Compiling Paddle Lite)
- Mobile phone (arm7 or arm8)

W
WenmuZhou 已提交
14 15 16 17 18
### 1.1 Prepare the cross-compilation environment
The cross-compilation environment is used to compile C++ demos of Paddle Lite and PaddleOCR.
Supports multiple development environments.

For the compilation process of different development environments, please refer to the corresponding documents.
W
WenmuZhou 已提交
19 20 21 22 23

1. [Docker](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html#docker)
2. [Linux](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html#linux)
3. [MAC OS](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html#mac-os)

W
WenmuZhou 已提交
24
### 1.2 Prepare Paddle-Lite library
W
WenmuZhou 已提交
25

W
WenmuZhou 已提交
26 27 28 29 30 31 32
There are two ways to obtain the Paddle-Lite library:
- 1. Download directly, the download link of the Paddle-Lite library is as follows:

      | Platform | Paddle-Lite library download link |
      |---|---|
      |Android|[arm7](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.8/inference_lite_lib.android.armv7.gcc.c++_shared.with_extra.with_cv.tar.gz) / [arm8](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.8/inference_lite_lib.android.armv8.gcc.c++_shared.with_extra.with_cv.tar.gz)|
      |IOS|[arm7](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.8/inference_lite_lib.ios.armv7.with_cv.with_extra.with_log.tiny_publish.tar.gz) / [arm8](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.8/inference_lite_lib.ios.armv8.with_cv.with_extra.with_log.tiny_publish.tar.gz)|
W
WenmuZhou 已提交
33

W
WenmuZhou 已提交
34
      Note: 1. The above Paddle-Lite library is compiled from the Paddle-Lite 2.8 branch. For more information about Paddle-Lite 2.8, please refer to [link](https://github.com/PaddlePaddle/Paddle-Lite/releases/tag/v2.8).
W
WenmuZhou 已提交
35

W
WenmuZhou 已提交
36
- 2. [Recommended] Compile Paddle-Lite to get the prediction library. The compilation method of Paddle-Lite is as follows:
W
WenmuZhou 已提交
37 38 39
```
git clone https://github.com/PaddlePaddle/Paddle-Lite.git
cd Paddle-Lite
W
WenmuZhou 已提交
40
# Switch to Paddle-Lite release/v2.8 stable branch
W
WenmuZhou 已提交
41 42 43 44
git checkout release/v2.8
./lite/tools/build_android.sh  --arch=armv8  --with_cv=ON --with_extra=ON
```

W
WenmuZhou 已提交
45 46 47 48 49 50
Note: When compiling Paddle-Lite to obtain the Paddle-Lite library, you need to turn on the two options `--with_cv=ON --with_extra=ON`, `--arch` means the `arm` version, here is designated as armv8,

More compilation commands refer to the introduction [link](https://paddle-lite.readthedocs.io/zh/latest/user_guides/Compile/Android.html#id2)

After directly downloading the Paddle-Lite library and decompressing it, you can get the `inference_lite_lib.android.armv8/` folder, and the Paddle-Lite library obtained by compiling Paddle-Lite is located
`Paddle-Lite/build.lite.android.armv8.gcc/inference_lite_lib.android.armv8/` folder.
W
WenmuZhou 已提交
51

W
WenmuZhou 已提交
52
The structure of the prediction library is as follows:
W
WenmuZhou 已提交
53 54 55 56 57 58 59 60 61 62 63
```
inference_lite_lib.android.armv8/
|-- cxx                                        C++ prebuild library
|   |-- include                                C++
|   |   |-- paddle_api.h
|   |   |-- paddle_image_preprocess.h
|   |   |-- paddle_lite_factory_helper.h
|   |   |-- paddle_place.h
|   |   |-- paddle_use_kernels.h
|   |   |-- paddle_use_ops.h
|   |   `-- paddle_use_passes.h
W
WenmuZhou 已提交
64
|   `-- lib                                           C++ library
W
WenmuZhou 已提交
65 66
|       |-- libpaddle_api_light_bundled.a             C++ static library
|       `-- libpaddle_light_api_shared.so             C++ dynamic library
W
WenmuZhou 已提交
67
|-- java                                     Java library
W
WenmuZhou 已提交
68 69 70 71 72
|   |-- jar
|   |   `-- PaddlePredictor.jar
|   |-- so
|   |   `-- libpaddle_lite_jni.so
|   `-- src
W
WenmuZhou 已提交
73 74 75
|-- demo                                     C++ and Java demo
|   |-- cxx                                  C++ demo
|   `-- java                                 Java demo
W
WenmuZhou 已提交
76 77
```

W
WenmuZhou 已提交
78
## 2 Run
W
WenmuZhou 已提交
79

W
WenmuZhou 已提交
80
### 2.1 Inference Model Optimization
W
WenmuZhou 已提交
81 82 83

Paddle Lite provides a variety of strategies to automatically optimize the original training model, including quantization, sub-graph fusion, hybrid scheduling, Kernel optimization and so on. In order to make the optimization process more convenient and easy to use, Paddle Lite provide opt tools to automatically complete the optimization steps and output a lightweight, optimal executable model.

W
WenmuZhou 已提交
84 85 86
If you have prepared the model file ending in .nb, you can skip this step.

The following table also provides a series of models that can be deployed on mobile phones to recognize Chinese. You can directly download the optimized model.
W
WenmuZhou 已提交
87

W
WenmuZhou 已提交
88 89 90
|Version|Introduction|Model size|Detection model|Text Direction model|Recognition model|Paddle-Lite branch|
|---|---|---|---|---|---|---|
|V2.0|extra-lightweight chinese OCR optimized model|7.8M|[download link](https://paddleocr.bj.bcebos.com/dygraph_v2.0/lite/ch_ppocr_mobile_v2.0_det_infer_nb.nb)|[download lin](https://paddleocr.bj.bcebos.com/dygraph_v2.0/lite/ch_ppocr_mobile_v2.0_cls_infer_nb.nb)|[download lin](https://paddleocr.bj.bcebos.com/dygraph_v2.0/lite/ch_ppocr_mobile_v2.0_rec_infer_nb.nb)|v2.8|
W
WenmuZhou 已提交
91

W
WenmuZhou 已提交
92
If you directly use the model in the above table for deployment, you can skip the following steps and directly read [Section 2.2](#2.2 Run optimized model on Phone).
W
WenmuZhou 已提交
93 94 95

If the model to be deployed is not in the above table, you need to follow the steps below to obtain the optimized model.

W
WenmuZhou 已提交
96
The `opt` tool can be obtained by compiling Paddle Lite.
W
WenmuZhou 已提交
97 98 99
```
git clone https://github.com/PaddlePaddle/Paddle-Lite.git
cd Paddle-Lite
W
WenmuZhou 已提交
100
git checkout release/v2.8
W
WenmuZhou 已提交
101 102 103
./lite/tools/build.sh build_optimize_tool
```

W
WenmuZhou 已提交
104
After the compilation is complete, the opt file is located under build.opt/lite/api/, You can view the operating options and usage of opt in the following ways:
W
WenmuZhou 已提交
105 106

```
W
WenmuZhou 已提交
107 108 109
cd build.opt/lite/api/
./opt
```
W
WenmuZhou 已提交
110

W
WenmuZhou 已提交
111 112 113 114 115 116 117 118 119
|Options|Description|
|---|---|
|--model_dir|The path of the PaddlePaddle model to be optimized (non-combined form)|
|--model_file|The network structure file path of the PaddlePaddle model (combined form) to be optimized|
|--param_file|The weight file path of the PaddlePaddle model (combined form) to be optimized|
|--optimize_out_type|Output model type, currently supports two types: protobuf and naive_buffer, among which naive_buffer is a more lightweight serialization/deserialization implementation. If you need to perform model prediction on the mobile side, please set this option to naive_buffer. The default is protobuf|
|--optimize_out|The output path of the optimized model|
|--valid_targets|The executable backend of the model, the default is arm. Currently it supports x86, arm, opencl, npu, xpu, multiple backends can be specified at the same time (separated by spaces), and Model Optimize Tool will automatically select the best method. If you need to support Huawei NPU (DaVinci architecture NPU equipped with Kirin 810/990 Soc), it should be set to npu, arm|
|--record_tailoring_info|When using the function of cutting library files according to the model, set this option to true to record the kernel and OP information contained in the optimized model. The default is false|
W
WenmuZhou 已提交
120

W
WenmuZhou 已提交
121
`--model_dir` is suitable for the non-combined mode of the model to be optimized, and the inference model of PaddleOCR is the combined mode, that is, the model structure and model parameters are stored in a single file.
W
WenmuZhou 已提交
122

W
WenmuZhou 已提交
123
The following takes the ultra-lightweight Chinese model of PaddleOCR as an example to introduce the use of the compiled opt file to complete the conversion of the inference model to the Paddle-Lite optimized model
W
WenmuZhou 已提交
124 125

```
W
WenmuZhou 已提交
126 127 128 129 130 131 132 133 134 135 136
# [Recommendation] Download the Chinese and English inference model of PaddleOCR V2.0
wget  https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_slim_infer.tar && tar xf  ch_ppocr_mobile_v2.0_det_slim_infer.tar
wget  https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_slim_infer.tar && tar xf  ch_ppocr_mobile_v2.0_rec_slim_infer.tar
wget  https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_slim_infer.tar && tar xf  ch_ppocr_mobile_v2.0_cls_slim_infer.tar
# Convert V2.0 detection model
./opt --model_file=./ch_ppocr_mobile_v2.0_det_slim_infer/inference.pdmodel  --param_file=./ch_ppocr_mobile_v2.0_det_slim_infer/inference.pdiparams  --optimize_out=./ch_ppocr_mobile_v2.0_det_slim_opt --valid_targets=arm  --optimize_out_type=naive_buffer
# 转换V2.0识别模型
# Convert V2.0 recognition model
./opt --model_file=./ch_ppocr_mobile_v2.0_rec_slim_infer/inference.pdmodel  --param_file=./ch_ppocr_mobile_v2.0_rec_slim_infer/inference.pdiparams  --optimize_out=./ch_ppocr_mobile_v2.0_rec_slim_opt --valid_targets=arm  --optimize_out_type=naive_buffer
# Convert V2.0 angle classifier model
./opt --model_file=./ch_ppocr_mobile_v2.0_cls_slim_infer/inference.pdmodel  --param_file=./ch_ppocr_mobile_v2.0_cls_slim_infer/inference.pdiparams  --optimize_out=./ch_ppocr_mobile_v2.0_cls_slim_opt --valid_targets=arm  --optimize_out_type=naive_buffer
W
WenmuZhou 已提交
137

W
WenmuZhou 已提交
138
```
W
WenmuZhou 已提交
139

W
WenmuZhou 已提交
140
After the conversion is successful, there will be more files ending with `.nb` in the current directory, which is the successfully converted model file.
W
WenmuZhou 已提交
141

W
WenmuZhou 已提交
142 143
<a name="2.2 Run optimized model on Phone"></a>
### 2.2 Run optimized model on Phone
W
WenmuZhou 已提交
144

W
WenmuZhou 已提交
145 146 147 148
Some preparatory work is required first.
 1. Prepare an Android phone with arm8. If the compiled prediction library and opt file are armv7, you need an arm7 phone and modify ARM_ABI = arm7 in the Makefile.
 2. Make sure the phone is connected to the computer, open the USB debugging option of the phone, and select the file transfer mode.
 3. Install the adb tool on the computer.
W
WenmuZhou 已提交
149

W
WenmuZhou 已提交
150
    3.1. Install ADB for MAC:
W
WenmuZhou 已提交
151 152 153
    ```
    brew cask install android-platform-tools
    ```
W
WenmuZhou 已提交
154
    3.2. Install ADB for Linux
W
WenmuZhou 已提交
155 156 157 158
    ```
    sudo apt update
    sudo apt install -y wget adb
    ```
W
WenmuZhou 已提交
159 160 161
    3.3. Install ADB for windows

    To install on win, you need to go to Google's Android platform to download the adb package for installation:[link](https://developer.android.com/studio)
W
WenmuZhou 已提交
162 163

    Verify whether adb is installed successfully
W
WenmuZhou 已提交
164 165
     ```
    adb devices
W
WenmuZhou 已提交
166
    ```
W
WenmuZhou 已提交
167 168 169 170
    If there is device output, it means the installation is successful。
    ```
       List of devices attached
       744be294    device
W
WenmuZhou 已提交
171 172
    ```

W
WenmuZhou 已提交
173 174
 4. Prepare optimized models, prediction library files, test images and dictionary files used.
 ```
W
WenmuZhou 已提交
175 176 177 178 179 180 181 182 183 184 185 186 187
 git clone https://github.com/PaddlePaddle/PaddleOCR.git
 cd PaddleOCR/deploy/lite/
 # run prepare.sh
 sh prepare.sh /{lite prediction library path}/inference_lite_lib.android.armv8

 #
 cd /{lite prediction library path}/inference_lite_lib.android.armv8/
 cd demo/cxx/ocr/
 # copy paddle-lite C++ .so file to debug/ directory
 cp ../../../cxx/lib/libpaddle_light_api_shared.so ./debug/

 cd inference_lite_lib.android.armv8/demo/cxx/ocr/
 cp ../../../cxx/lib/libpaddle_light_api_shared.so ./debug/
W
WenmuZhou 已提交
188
 ```
W
WenmuZhou 已提交
189

W
WenmuZhou 已提交
190
Prepare the test image, taking PaddleOCR/doc/imgs/11.jpg as an example, copy the image file to the demo/cxx/ocr/debug/ folder. Prepare the model files optimized by the lite opt tool, ch_det_mv3_db_opt.nb, ch_rec_mv3_crnn_opt.nb, and place them under the demo/cxx/ocr/debug/ folder.
W
WenmuZhou 已提交
191 192

The structure of the OCR demo is as follows after the above command is executed:
W
WenmuZhou 已提交
193

W
WenmuZhou 已提交
194 195 196
```
demo/cxx/ocr/
|-- debug/  
W
WenmuZhou 已提交
197 198 199
|   |--ch_ppocr_mobile_v2.0_det_slim_opt.nb           Detection model
|   |--ch_ppocr_mobile_v2.0_rec_slim_opt.nb           Recognition model
|   |--ch_ppocr_mobile_v2.0_cls_slim_opt.nb           Text direction classification model
W
WenmuZhou 已提交
200 201 202 203
|   |--11.jpg                           Image for OCR
|   |--ppocr_keys_v1.txt                Dictionary file
|   |--libpaddle_light_api_shared.so    C++ .so file
|   |--config.txt                       Config file
W
WenmuZhou 已提交
204 205 206 207
|-- config.txt                  Config file
|-- cls_process.cc              Pre-processing and post-processing files for the angle classifier
|-- cls_process.h
|-- crnn_process.cc             Pre-processing and post-processing files for the CRNN model
W
WenmuZhou 已提交
208
|-- crnn_process.h
W
WenmuZhou 已提交
209
|-- db_post_process.cc          Pre-processing and post-processing files for the DB model
W
WenmuZhou 已提交
210 211
|-- db_post_process.h
|-- Makefile  
W
WenmuZhou 已提交
212
|-- ocr_db_crnn.cc              C++ main code
W
WenmuZhou 已提交
213 214
```

W
WenmuZhou 已提交
215 216
#### 注意:
1. `ppocr_keys_v1.txt` is a Chinese dictionary file. If the nb model is used for English recognition or other language recognition, dictionary file should be replaced with a dictionary of the corresponding language. PaddleOCR provides a variety of dictionaries under ppocr/utils/, including:
W
WenmuZhou 已提交
217 218 219 220 221 222 223 224 225
```
dict/french_dict.txt     # french
dict/german_dict.txt     # german
ic15_dict.txt       # english
dict/japan_dict.txt      # japan
dict/korean_dict.txt     # korean
ppocr_keys_v1.txt   # chinese
```

W
WenmuZhou 已提交
226
2.  `config.txt` of the detector and classifier, as shown below:
W
WenmuZhou 已提交
227 228 229 230 231 232 233 234
```
max_side_len  960         #  Limit the maximum image height and width to 960
det_db_thresh  0.3        # Used to filter the binarized image of DB prediction, setting 0.-0.3 has no obvious effect on the result
det_db_box_thresh  0.5    # DDB post-processing filter box threshold, if there is a missing box detected, it can be reduced as appropriate
det_db_unclip_ratio  1.6  # Indicates the compactness of the text box, the smaller the value, the closer the text box to the text
use_direction_classify  0  # Whether to use the direction classifier, 0 means not to use, 1 means to use
```

W
WenmuZhou 已提交
235
 5. Run Model on phone
W
WenmuZhou 已提交
236

W
WenmuZhou 已提交
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
After the above steps are completed, you can use adb to push the file to the phone to run, the steps are as follows:

 ```
 # Execute the compilation and get the executable file ocr_db_crnn
 # The use of ocr_db_crnn is:
 # ./ocr_db_crnn Detection model file Orientation classifier model file Recognition model file Test image path Dictionary file path
 make -j
 # Move the compiled executable file to the debug folder
 mv ocr_db_crnn ./debug/
 # Push the debug folder to the phone
 adb push debug /data/local/tmp/
 adb shell
 cd /data/local/tmp/debug
 export LD_LIBRARY_PATH=${PWD}:$LD_LIBRARY_PATH
 ./ocr_db_crnn ch_ppocr_mobile_v2.0_det_slim_opt.nbb  ch_ppocr_mobile_v2.0_rec_slim_opt.nb  ch_ppocr_mobile_v2.0_cls_slim_opt.nb  ./11.jpg  ppocr_keys_v1.txt
 ```

If you modify the code, you need to recompile and push to the phone.
W
WenmuZhou 已提交
255 256 257 258 259 260 261

The outputs are as follows:

<div align="center">
    <img src="../imgs_results/lite_demo.png" width="600">
</div>

W
WenmuZhou 已提交
262

W
WenmuZhou 已提交
263 264 265
## FAQ

Q1: What if I want to change the model, do I need to run it again according to the process?
W
WenmuZhou 已提交
266

W
WenmuZhou 已提交
267 268 269
A1: If you have performed the above steps, you only need to replace the .nb model file to complete the model replacement.

Q2: How to test with another picture?
W
WenmuZhou 已提交
270 271

A2: Replace the .jpg test image under ./debug with the image you want to test, and run adb push to push new image to the phone.
W
WenmuZhou 已提交
272 273

Q3: How to package it into the mobile APP?
W
WenmuZhou 已提交
274 275

A3: This demo aims to provide the core algorithm part that can run OCR on mobile phones. Further, PaddleOCR/deploy/android_demo is an example of encapsulating this demo into a mobile app for reference.