### 前言
百度 OCR 团队开源了一个非常高效的识字算法:https://github.com/PaddlePaddle/PaddleOCR
识字高效,部署轻量,可以说是非常优秀了。
本文记录了我以 PaddleHub Serving 方式在服务器上(无GPU)部署 PaddleOCR 服务的流程,以供自查及各位参考。
### 一、环境准备
1、python3.7,开放端口 8866(PaddleOCR中默认是这个,但建议自己改个其他的)
2、安装 paddlepaddle 和 paddlehub:
```python
pip install paddlepaddle==2.1.0
pip install paddlehub==2.1.0 --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
```
### 二、模型准备
下载文本检测和识别模型:
```python
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
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
```
### 三、启动服务
下载 PaddleOCR 源码上传到服务器并解压(git clone 比较快的话可以直接clone):https://github.com/PaddlePaddle/PaddleOCR
切到 PaddleOCR 内的目录:
```python
cd ./PaddleOCR-release-2.3/deploy/hubserving/ocr_system/
```
修改 params.py 文件中的第16、34、45行代码,指定文本检测和识别模型的目录(就是第二步下载的那个),关闭文本方向分类功能,这次用不着:
```python
16 cfg.det_model_dir = "/root/PaddleOCR/ch_ppocr_mobile_v2.0_det_infer/"
34 cfg.rec_model_dir = "/root/PaddleOCR/ch_ppocr_mobile_v2.0_rec_infer/"
45 cfg.use_angle_cls = False
```
切回项目根目录(我的是正好在root下面):
```python
cd /root/PaddleOCR-release-2.3/
```
安装并启动服务:
```python
hub install deploy/hubserving/ocr_system/
nohup hub serving start -m ocr_system -p 8866 >log.txt 2>&1 &
```
这时文本检测及识别服务就会在后台运行,关闭 ssh 窗口后它仍然会继续运行,日志将输出到 log.txt 中。
**启动失败的话看报错日志,缺什么包就安装什么包**。
如果要关闭这个服务,执行:
```python
hub serving stop -m ocr_system
```
### 四、远程调用
打开 postman 模拟个请求:
URL:
```python
http://ip或者域名:端口/predict/ocr_system
```
body中放个 JSON 数据:
```python
{"images":["image的base64形式"]}
```
如果是通过网站将图片转换成 base64 的请注意去掉前缀:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMIAAAAwCAYAAABDu6UjAAAgA....
比如上面这部分数据(不全),就不需要 "data:image/png;base64," 这个数据头了。
返回的结果:
```python
{
"msg": "",
"results": [
[
{
"confidence": 0.9663664698600769,
"text": "画中奇遇",
"text_region": [
[
6,
5
],
[
189,
0
],
[
192,
41
],
[
9,
46
]
]
}
]
],
"status": "000"
}
```
### 五、自定义
通过修改 PaddleOCR-release-2.3/deploy/hubserving/ocr_system/module.py 文件可以完成一些自定义功能,比如:
```python
rec_res_final.append({
'text': text,
'confidence': float(score),
'text_region': dt_boxes[dno].astype(np.int).tolist()
})
```
这行就是返回数据的组成,自己觉得不需要这些数据的话可以注释掉一些。
其他的修改,比如添加点返回信息什么的请根据代码自行修改,重新安装并启动服务即可。
祝各位玩的愉快!
### 特别鸣谢
感谢百度 OCR 团队开源这项优秀的算法!

PaddleHub Serving模式在服务器部署PaddleOCR