Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleOCR
提交
d07a223d
P
PaddleOCR
项目概览
PaddlePaddle
/
PaddleOCR
大约 1 年 前同步成功
通知
1528
Star
32962
Fork
6643
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
108
列表
看板
标记
里程碑
合并请求
7
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleOCR
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
108
Issue
108
列表
看板
标记
里程碑
合并请求
7
合并请求
7
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
d07a223d
编写于
7月 20, 2020
作者:
W
wangjiawei04
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add pdserving ocr
上级
7e1420f2
变更
8
显示空白变更内容
内联
并排
Showing
8 changed file
with
578 addition
and
2 deletion
+578
-2
deploy/pdserving/det_local_server.py
deploy/pdserving/det_local_server.py
+71
-0
deploy/pdserving/det_web_server.py
deploy/pdserving/det_web_server.py
+72
-0
deploy/pdserving/ocr_local_server.py
deploy/pdserving/ocr_local_server.py
+103
-0
deploy/pdserving/ocr_web_client.py
deploy/pdserving/ocr_web_client.py
+37
-0
deploy/pdserving/ocr_web_server.py
deploy/pdserving/ocr_web_server.py
+99
-0
deploy/pdserving/readme.md
deploy/pdserving/readme.md
+53
-2
deploy/pdserving/rec_local_server.py
deploy/pdserving/rec_local_server.py
+72
-0
deploy/pdserving/rec_web_server.py
deploy/pdserving/rec_web_server.py
+71
-0
未找到文件。
deploy/pdserving/det_local_server.py
0 → 100644
浏览文件 @
d07a223d
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from
paddle_serving_client
import
Client
import
cv2
import
sys
import
numpy
as
np
import
os
from
paddle_serving_client
import
Client
from
paddle_serving_app.reader
import
Sequential
,
ResizeByFactor
from
paddle_serving_app.reader
import
Div
,
Normalize
,
Transpose
from
paddle_serving_app.reader
import
DBPostProcess
,
FilterBoxes
from
paddle_serving_server_gpu.web_service
import
WebService
import
time
import
re
import
base64
class
OCRService
(
WebService
):
def
init_det
(
self
):
self
.
det_preprocess
=
Sequential
([
ResizeByFactor
(
32
,
960
),
Div
(
255
),
Normalize
([
0.485
,
0.456
,
0.406
],
[
0.229
,
0.224
,
0.225
]),
Transpose
(
(
2
,
0
,
1
))
])
self
.
filter_func
=
FilterBoxes
(
10
,
10
)
self
.
post_func
=
DBPostProcess
({
"thresh"
:
0.3
,
"box_thresh"
:
0.5
,
"max_candidates"
:
1000
,
"unclip_ratio"
:
1.5
,
"min_size"
:
3
})
def
preprocess
(
self
,
feed
=
[],
fetch
=
[]):
data
=
base64
.
b64decode
(
feed
[
0
][
"image"
].
encode
(
'utf8'
))
data
=
np
.
fromstring
(
data
,
np
.
uint8
)
im
=
cv2
.
imdecode
(
data
,
cv2
.
IMREAD_COLOR
)
self
.
ori_h
,
self
.
ori_w
,
_
=
im
.
shape
det_img
=
self
.
det_preprocess
(
im
)
_
,
self
.
new_h
,
self
.
new_w
=
det_img
.
shape
return
{
"image"
:
det_img
[
np
.
newaxis
,
:].
copy
()},
[
"concat_1.tmp_0"
]
def
postprocess
(
self
,
feed
=
{},
fetch
=
[],
fetch_map
=
None
):
det_out
=
fetch_map
[
"concat_1.tmp_0"
]
ratio_list
=
[
float
(
self
.
new_h
)
/
self
.
ori_h
,
float
(
self
.
new_w
)
/
self
.
ori_w
]
dt_boxes_list
=
self
.
post_func
(
det_out
,
[
ratio_list
])
dt_boxes
=
self
.
filter_func
(
dt_boxes_list
[
0
],
[
self
.
ori_h
,
self
.
ori_w
])
return
{
"dt_boxes"
:
dt_boxes
.
tolist
()}
ocr_service
=
OCRService
(
name
=
"ocr"
)
ocr_service
.
load_model_config
(
"ocr_det_model"
)
ocr_service
.
set_gpus
(
"0"
)
ocr_service
.
prepare_server
(
workdir
=
"workdir"
,
port
=
9292
,
device
=
"gpu"
,
gpuid
=
0
)
ocr_service
.
init_det
()
ocr_service
.
run_debugger_service
()
ocr_service
.
run_web_service
()
deploy/pdserving/det_web_server.py
0 → 100644
浏览文件 @
d07a223d
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from
paddle_serving_client
import
Client
import
cv2
import
sys
import
numpy
as
np
import
os
from
paddle_serving_client
import
Client
from
paddle_serving_app.reader
import
Sequential
,
ResizeByFactor
from
paddle_serving_app.reader
import
Div
,
Normalize
,
Transpose
from
paddle_serving_app.reader
import
DBPostProcess
,
FilterBoxes
from
paddle_serving_server_gpu.web_service
import
WebService
import
time
import
re
import
base64
class
OCRService
(
WebService
):
def
init_det
(
self
):
self
.
det_preprocess
=
Sequential
([
ResizeByFactor
(
32
,
960
),
Div
(
255
),
Normalize
([
0.485
,
0.456
,
0.406
],
[
0.229
,
0.224
,
0.225
]),
Transpose
(
(
2
,
0
,
1
))
])
self
.
filter_func
=
FilterBoxes
(
10
,
10
)
self
.
post_func
=
DBPostProcess
({
"thresh"
:
0.3
,
"box_thresh"
:
0.5
,
"max_candidates"
:
1000
,
"unclip_ratio"
:
1.5
,
"min_size"
:
3
})
def
preprocess
(
self
,
feed
=
[],
fetch
=
[]):
data
=
base64
.
b64decode
(
feed
[
0
][
"image"
].
encode
(
'utf8'
))
data
=
np
.
fromstring
(
data
,
np
.
uint8
)
im
=
cv2
.
imdecode
(
data
,
cv2
.
IMREAD_COLOR
)
self
.
ori_h
,
self
.
ori_w
,
_
=
im
.
shape
det_img
=
self
.
det_preprocess
(
im
)
_
,
self
.
new_h
,
self
.
new_w
=
det_img
.
shape
print
(
det_img
)
return
{
"image"
:
det_img
},
[
"concat_1.tmp_0"
]
def
postprocess
(
self
,
feed
=
{},
fetch
=
[],
fetch_map
=
None
):
det_out
=
fetch_map
[
"concat_1.tmp_0"
]
ratio_list
=
[
float
(
self
.
new_h
)
/
self
.
ori_h
,
float
(
self
.
new_w
)
/
self
.
ori_w
]
dt_boxes_list
=
self
.
post_func
(
det_out
,
[
ratio_list
])
dt_boxes
=
self
.
filter_func
(
dt_boxes_list
[
0
],
[
self
.
ori_h
,
self
.
ori_w
])
return
{
"dt_boxes"
:
dt_boxes
.
tolist
()}
ocr_service
=
OCRService
(
name
=
"ocr"
)
ocr_service
.
load_model_config
(
"ocr_det_model"
)
ocr_service
.
set_gpus
(
"0"
)
ocr_service
.
prepare_server
(
workdir
=
"workdir"
,
port
=
9292
,
device
=
"gpu"
,
gpuid
=
0
)
ocr_service
.
init_det
()
ocr_service
.
run_rpc_service
()
ocr_service
.
run_web_service
()
deploy/pdserving/ocr_local_server.py
0 → 100644
浏览文件 @
d07a223d
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from
paddle_serving_client
import
Client
from
paddle_serving_app.reader
import
OCRReader
import
cv2
import
sys
import
numpy
as
np
import
os
from
paddle_serving_client
import
Client
from
paddle_serving_app.reader
import
Sequential
,
URL2Image
,
ResizeByFactor
from
paddle_serving_app.reader
import
Div
,
Normalize
,
Transpose
from
paddle_serving_app.reader
import
DBPostProcess
,
FilterBoxes
,
GetRotateCropImage
,
SortedBoxes
from
paddle_serving_server_gpu.web_service
import
WebService
from
paddle_serving_app.local_predict
import
Debugger
import
time
import
re
import
base64
class
OCRService
(
WebService
):
def
init_det_debugger
(
self
,
det_model_config
):
self
.
det_preprocess
=
Sequential
([
ResizeByFactor
(
32
,
960
),
Div
(
255
),
Normalize
([
0.485
,
0.456
,
0.406
],
[
0.229
,
0.224
,
0.225
]),
Transpose
(
(
2
,
0
,
1
))
])
self
.
det_client
=
Debugger
()
self
.
det_client
.
load_model_config
(
det_model_config
,
gpu
=
True
,
profile
=
False
)
self
.
ocr_reader
=
OCRReader
()
def
preprocess
(
self
,
feed
=
[],
fetch
=
[]):
data
=
base64
.
b64decode
(
feed
[
0
][
"image"
].
encode
(
'utf8'
))
data
=
np
.
fromstring
(
data
,
np
.
uint8
)
im
=
cv2
.
imdecode
(
data
,
cv2
.
IMREAD_COLOR
)
ori_h
,
ori_w
,
_
=
im
.
shape
det_img
=
self
.
det_preprocess
(
im
)
_
,
new_h
,
new_w
=
det_img
.
shape
det_img
=
det_img
[
np
.
newaxis
,
:]
det_img
=
det_img
.
copy
()
det_out
=
self
.
det_client
.
predict
(
feed
=
{
"image"
:
det_img
},
fetch
=
[
"concat_1.tmp_0"
])
filter_func
=
FilterBoxes
(
10
,
10
)
post_func
=
DBPostProcess
({
"thresh"
:
0.3
,
"box_thresh"
:
0.5
,
"max_candidates"
:
1000
,
"unclip_ratio"
:
1.5
,
"min_size"
:
3
})
sorted_boxes
=
SortedBoxes
()
ratio_list
=
[
float
(
new_h
)
/
ori_h
,
float
(
new_w
)
/
ori_w
]
dt_boxes_list
=
post_func
(
det_out
[
"concat_1.tmp_0"
],
[
ratio_list
])
dt_boxes
=
filter_func
(
dt_boxes_list
[
0
],
[
ori_h
,
ori_w
])
dt_boxes
=
sorted_boxes
(
dt_boxes
)
get_rotate_crop_image
=
GetRotateCropImage
()
img_list
=
[]
max_wh_ratio
=
0
for
i
,
dtbox
in
enumerate
(
dt_boxes
):
boximg
=
get_rotate_crop_image
(
im
,
dt_boxes
[
i
])
img_list
.
append
(
boximg
)
h
,
w
=
boximg
.
shape
[
0
:
2
]
wh_ratio
=
w
*
1.0
/
h
max_wh_ratio
=
max
(
max_wh_ratio
,
wh_ratio
)
if
len
(
img_list
)
==
0
:
return
[],
[]
_
,
w
,
h
=
self
.
ocr_reader
.
resize_norm_img
(
img_list
[
0
],
max_wh_ratio
).
shape
imgs
=
np
.
zeros
((
len
(
img_list
),
3
,
w
,
h
)).
astype
(
'float32'
)
for
id
,
img
in
enumerate
(
img_list
):
norm_img
=
self
.
ocr_reader
.
resize_norm_img
(
img
,
max_wh_ratio
)
imgs
[
id
]
=
norm_img
feed
=
{
"image"
:
imgs
.
copy
()}
fetch
=
[
"ctc_greedy_decoder_0.tmp_0"
,
"softmax_0.tmp_0"
]
return
feed
,
fetch
def
postprocess
(
self
,
feed
=
{},
fetch
=
[],
fetch_map
=
None
):
rec_res
=
self
.
ocr_reader
.
postprocess
(
fetch_map
,
with_score
=
True
)
res_lst
=
[]
for
res
in
rec_res
:
res_lst
.
append
(
res
[
0
])
res
=
{
"res"
:
res_lst
}
return
res
ocr_service
=
OCRService
(
name
=
"ocr"
)
ocr_service
.
load_model_config
(
"ocr_rec_model"
)
ocr_service
.
prepare_server
(
workdir
=
"workdir"
,
port
=
9292
)
ocr_service
.
init_det_debugger
(
det_model_config
=
"ocr_det_model"
)
ocr_service
.
run_debugger_service
(
gpu
=
True
)
ocr_service
.
run_web_service
()
deploy/pdserving/ocr_web_client.py
0 → 100644
浏览文件 @
d07a223d
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# -*- coding: utf-8 -*-
import
requests
import
json
import
cv2
import
base64
import
os
,
sys
import
time
def
cv2_to_base64
(
image
):
#data = cv2.imencode('.jpg', image)[1]
return
base64
.
b64encode
(
image
).
decode
(
'utf8'
)
#data.tostring()).decode('utf8')
headers
=
{
"Content-type"
:
"application/json"
}
url
=
"http://127.0.0.1:9292/ocr/prediction"
test_img_dir
=
"../../doc/imgs/"
for
img_file
in
os
.
listdir
(
test_img_dir
):
with
open
(
os
.
path
.
join
(
test_img_dir
,
img_file
),
'rb'
)
as
file
:
image_data1
=
file
.
read
()
image
=
cv2_to_base64
(
image_data1
)
data
=
{
"feed"
:
[{
"image"
:
image
}],
"fetch"
:
[
"res"
]}
r
=
requests
.
post
(
url
=
url
,
headers
=
headers
,
data
=
json
.
dumps
(
data
))
print
(
r
.
json
())
deploy/pdserving/ocr_web_server.py
0 → 100644
浏览文件 @
d07a223d
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from
paddle_serving_client
import
Client
from
paddle_serving_app.reader
import
OCRReader
import
cv2
import
sys
import
numpy
as
np
import
os
from
paddle_serving_client
import
Client
from
paddle_serving_app.reader
import
Sequential
,
URL2Image
,
ResizeByFactor
from
paddle_serving_app.reader
import
Div
,
Normalize
,
Transpose
from
paddle_serving_app.reader
import
DBPostProcess
,
FilterBoxes
,
GetRotateCropImage
,
SortedBoxes
from
paddle_serving_server_gpu.web_service
import
WebService
import
time
import
re
import
base64
class
OCRService
(
WebService
):
def
init_det_client
(
self
,
det_port
,
det_client_config
):
self
.
det_preprocess
=
Sequential
([
ResizeByFactor
(
32
,
960
),
Div
(
255
),
Normalize
([
0.485
,
0.456
,
0.406
],
[
0.229
,
0.224
,
0.225
]),
Transpose
(
(
2
,
0
,
1
))
])
self
.
det_client
=
Client
()
self
.
det_client
.
load_client_config
(
det_client_config
)
self
.
det_client
.
connect
([
"127.0.0.1:{}"
.
format
(
det_port
)])
self
.
ocr_reader
=
OCRReader
()
def
preprocess
(
self
,
feed
=
[],
fetch
=
[]):
data
=
base64
.
b64decode
(
feed
[
0
][
"image"
].
encode
(
'utf8'
))
data
=
np
.
fromstring
(
data
,
np
.
uint8
)
im
=
cv2
.
imdecode
(
data
,
cv2
.
IMREAD_COLOR
)
ori_h
,
ori_w
,
_
=
im
.
shape
det_img
=
self
.
det_preprocess
(
im
)
det_out
=
self
.
det_client
.
predict
(
feed
=
{
"image"
:
det_img
},
fetch
=
[
"concat_1.tmp_0"
])
_
,
new_h
,
new_w
=
det_img
.
shape
filter_func
=
FilterBoxes
(
10
,
10
)
post_func
=
DBPostProcess
({
"thresh"
:
0.3
,
"box_thresh"
:
0.5
,
"max_candidates"
:
1000
,
"unclip_ratio"
:
1.5
,
"min_size"
:
3
})
sorted_boxes
=
SortedBoxes
()
ratio_list
=
[
float
(
new_h
)
/
ori_h
,
float
(
new_w
)
/
ori_w
]
dt_boxes_list
=
post_func
(
det_out
[
"concat_1.tmp_0"
],
[
ratio_list
])
dt_boxes
=
filter_func
(
dt_boxes_list
[
0
],
[
ori_h
,
ori_w
])
dt_boxes
=
sorted_boxes
(
dt_boxes
)
get_rotate_crop_image
=
GetRotateCropImage
()
feed_list
=
[]
img_list
=
[]
max_wh_ratio
=
0
for
i
,
dtbox
in
enumerate
(
dt_boxes
):
boximg
=
get_rotate_crop_image
(
im
,
dt_boxes
[
i
])
img_list
.
append
(
boximg
)
h
,
w
=
boximg
.
shape
[
0
:
2
]
wh_ratio
=
w
*
1.0
/
h
max_wh_ratio
=
max
(
max_wh_ratio
,
wh_ratio
)
for
img
in
img_list
:
norm_img
=
self
.
ocr_reader
.
resize_norm_img
(
img
,
max_wh_ratio
)
feed
=
{
"image"
:
norm_img
}
feed_list
.
append
(
feed
)
fetch
=
[
"ctc_greedy_decoder_0.tmp_0"
,
"softmax_0.tmp_0"
]
return
feed_list
,
fetch
def
postprocess
(
self
,
feed
=
{},
fetch
=
[],
fetch_map
=
None
):
rec_res
=
self
.
ocr_reader
.
postprocess
(
fetch_map
,
with_score
=
True
)
res_lst
=
[]
for
res
in
rec_res
:
res_lst
.
append
(
res
[
0
])
res
=
{
"res"
:
res_lst
}
return
res
ocr_service
=
OCRService
(
name
=
"ocr"
)
ocr_service
.
load_model_config
(
"ocr_rec_model"
)
ocr_service
.
set_gpus
(
"0"
)
ocr_service
.
prepare_server
(
workdir
=
"workdir"
,
port
=
9292
,
device
=
"gpu"
,
gpuid
=
0
)
ocr_service
.
init_det_client
(
det_port
=
9293
,
det_client_config
=
"ocr_det_client/serving_client_conf.prototxt"
)
ocr_service
.
run_rpc_service
()
ocr_service
.
run_web_service
()
deploy/pdserving/readme.md
浏览文件 @
d07a223d
...
@@ -5,24 +5,75 @@
...
@@ -5,24 +5,75 @@
## 快速启动服务
## 快速启动服务
### 1. 准备环境
### 1. 准备环境
我们先安装Paddle Serving相关组件
我们推荐用户使用GPU来做Paddle Serving的OCR服务部署
**CUDA版本:9.0以上**
**CUDNN版本:7.0以上**
**操作系统版本:CentOS 6以上**
```
python -m pip install paddle_serving_server_gpu paddle_serving_client paddle_serving_app
```
### 2. 模型转换
### 2. 模型转换
可以使用
`paddle_serving_app`
提供的模型,执行下列命令
```
python -m paddle_serving_app.package --get_model ocr_rec
tar -xzvf ocr_rec.tar.gz
python -m paddle_serving_app.package --get_model ocr_det
tar -xzvf ocr_det.tar.gz
```
执行上述命令会下载
`db_crnn_mobile`
的模型,如果想要下载规模更大的
`db_crnn_server`
模型,可以在下载预测模型并解压之后。参考
[
如何从Paddle保存的预测模型转为Paddle Serving格式可部署的模型
](
https://github.com/PaddlePaddle/Serving/blob/develop/doc/INFERENCE_TO_SERVING_CN.md
)
。
### 3. 启动服务
### 3. 启动服务
启动服务可以根据实际需求选择启动
`标准版`
或者
`快速版`
,两种方式的对比如下表:
启动服务可以根据实际需求选择启动
`标准版`
或者
`快速版`
,两种方式的对比如下表:
|版本|特点|适用场景|
|版本|特点|适用场景|
|-|-|-|
|-|-|-|
|标准版|
|
|
|标准版|
稳定性高,分布式部署|适用于吞吐量大,需要跨机房部署的情况
|
|快速版|
|
|
|快速版|
部署方便,预测速度快|适用于对预测速度要求高,迭代速度快的场景
|
#### 方式1. 启动标准版服务
#### 方式1. 启动标准版服务
```
python -m paddle_serving_server_gpu.serve --model ocr_det_model --port 9293 --gpu_id 0
python ocr_web_server.py
```
#### 方式2. 启动快速版服务
#### 方式2. 启动快速版服务
```
python ocr_local_server.py
```
## 发送预测请求
## 发送预测请求
```
python ocr_web_client.py
```
## 返回结果格式说明
## 返回结果格式说明
返回结果是json格式
```
{u'result': {u'res': [u'\u571f\u5730\u6574\u6cbb\u4e0e\u571f\u58e4\u4fee\u590d\u7814\u7a76\u4e2d\u5fc3', u'\u534e\u5357\u519c\u4e1a\u5927\u5b661\u7d20\u56fe']}}
```
我们也可以打印结果json串中
`res`
字段的每一句话
```
土地整治与土壤修复研究中心
华南农业大学1素图
```
## 自定义修改服务逻辑
## 自定义修改服务逻辑
在
`ocr_web_server.py`
或是
`ocr_debugger_server.py`
当中的
`preprocess`
函数里面做了检测服务和识别服务的前处理,·
`postprocess`
函数里面做了识别的后处理服务,可以在相应的函数中做修改。调用了
`paddle_serving_app`
库提供的常见CV模型的前处理/后处理库。
如果想要单独启动Paddle Serving的检测服务和识别服务,参见下列表格, 执行对应的脚本即可。
| 模型 | 标准版 | 快速版 |
| ---- | ----------------- | ------------------- |
| 检测 | det_web_server.py | det_local_server.py |
| 识别 | rec_web_server.py | rec_local_server.py |
更多信息参见
[
Paddle Serving
](
https://github.com/PaddlePaddle/Serving
)
deploy/pdserving/rec_local_server.py
0 → 100644
浏览文件 @
d07a223d
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from
paddle_serving_client
import
Client
from
paddle_serving_app.reader
import
OCRReader
import
cv2
import
sys
import
numpy
as
np
import
os
from
paddle_serving_client
import
Client
from
paddle_serving_app.reader
import
Sequential
,
URL2Image
,
ResizeByFactor
from
paddle_serving_app.reader
import
Div
,
Normalize
,
Transpose
from
paddle_serving_app.reader
import
DBPostProcess
,
FilterBoxes
,
GetRotateCropImage
,
SortedBoxes
from
paddle_serving_server_gpu.web_service
import
WebService
import
time
import
re
import
base64
class
OCRService
(
WebService
):
def
init_rec
(
self
):
self
.
ocr_reader
=
OCRReader
()
def
preprocess
(
self
,
feed
=
[],
fetch
=
[]):
img_list
=
[]
for
feed_data
in
feed
:
data
=
base64
.
b64decode
(
feed_data
[
"image"
].
encode
(
'utf8'
))
data
=
np
.
fromstring
(
data
,
np
.
uint8
)
im
=
cv2
.
imdecode
(
data
,
cv2
.
IMREAD_COLOR
)
img_list
.
append
(
im
)
max_wh_ratio
=
0
for
i
,
boximg
in
enumerate
(
img_list
):
h
,
w
=
boximg
.
shape
[
0
:
2
]
wh_ratio
=
w
*
1.0
/
h
max_wh_ratio
=
max
(
max_wh_ratio
,
wh_ratio
)
_
,
w
,
h
=
self
.
ocr_reader
.
resize_norm_img
(
img_list
[
0
],
max_wh_ratio
).
shape
imgs
=
np
.
zeros
((
len
(
img_list
),
3
,
w
,
h
)).
astype
(
'float32'
)
for
i
,
img
in
enumerate
(
img_list
):
norm_img
=
self
.
ocr_reader
.
resize_norm_img
(
img
,
max_wh_ratio
)
imgs
[
i
]
=
norm_img
feed
=
{
"image"
:
imgs
.
copy
()}
fetch
=
[
"ctc_greedy_decoder_0.tmp_0"
,
"softmax_0.tmp_0"
]
return
feed
,
fetch
def
postprocess
(
self
,
feed
=
{},
fetch
=
[],
fetch_map
=
None
):
rec_res
=
self
.
ocr_reader
.
postprocess
(
fetch_map
,
with_score
=
True
)
res_lst
=
[]
for
res
in
rec_res
:
res_lst
.
append
(
res
[
0
])
res
=
{
"res"
:
res_lst
}
return
res
ocr_service
=
OCRService
(
name
=
"ocr"
)
ocr_service
.
load_model_config
(
"ocr_rec_model"
)
ocr_service
.
set_gpus
(
"0"
)
ocr_service
.
init_rec
()
ocr_service
.
prepare_server
(
workdir
=
"workdir"
,
port
=
9292
,
device
=
"gpu"
,
gpuid
=
0
)
ocr_service
.
run_debugger_service
()
ocr_service
.
run_web_service
()
deploy/pdserving/rec_web_server.py
0 → 100644
浏览文件 @
d07a223d
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from
paddle_serving_client
import
Client
from
paddle_serving_app.reader
import
OCRReader
import
cv2
import
sys
import
numpy
as
np
import
os
from
paddle_serving_client
import
Client
from
paddle_serving_app.reader
import
Sequential
,
URL2Image
,
ResizeByFactor
from
paddle_serving_app.reader
import
Div
,
Normalize
,
Transpose
from
paddle_serving_app.reader
import
DBPostProcess
,
FilterBoxes
,
GetRotateCropImage
,
SortedBoxes
from
paddle_serving_server_gpu.web_service
import
WebService
import
time
import
re
import
base64
class
OCRService
(
WebService
):
def
init_rec
(
self
):
self
.
ocr_reader
=
OCRReader
()
def
preprocess
(
self
,
feed
=
[],
fetch
=
[]):
# TODO: to handle batch rec images
img_list
=
[]
for
feed_data
in
feed
:
data
=
base64
.
b64decode
(
feed_data
[
"image"
].
encode
(
'utf8'
))
data
=
np
.
fromstring
(
data
,
np
.
uint8
)
im
=
cv2
.
imdecode
(
data
,
cv2
.
IMREAD_COLOR
)
img_list
.
append
(
im
)
feed_list
=
[]
max_wh_ratio
=
0
for
i
,
boximg
in
enumerate
(
img_list
):
h
,
w
=
boximg
.
shape
[
0
:
2
]
wh_ratio
=
w
*
1.0
/
h
max_wh_ratio
=
max
(
max_wh_ratio
,
wh_ratio
)
for
img
in
img_list
:
norm_img
=
self
.
ocr_reader
.
resize_norm_img
(
img
,
max_wh_ratio
)
feed
=
{
"image"
:
norm_img
}
feed_list
.
append
(
feed
)
fetch
=
[
"ctc_greedy_decoder_0.tmp_0"
,
"softmax_0.tmp_0"
]
return
feed_list
,
fetch
def
postprocess
(
self
,
feed
=
{},
fetch
=
[],
fetch_map
=
None
):
rec_res
=
self
.
ocr_reader
.
postprocess
(
fetch_map
,
with_score
=
True
)
res_lst
=
[]
for
res
in
rec_res
:
res_lst
.
append
(
res
[
0
])
res
=
{
"res"
:
res_lst
}
return
res
ocr_service
=
OCRService
(
name
=
"ocr"
)
ocr_service
.
load_model_config
(
"ocr_rec_model"
)
ocr_service
.
set_gpus
(
"0"
)
ocr_service
.
init_rec
()
ocr_service
.
prepare_server
(
workdir
=
"workdir"
,
port
=
9292
,
device
=
"gpu"
,
gpuid
=
0
)
ocr_service
.
run_rpc_service
()
ocr_service
.
run_web_service
()
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录