Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Serving
提交
2b8393e7
S
Serving
项目概览
PaddlePaddle
/
Serving
大约 1 年 前同步成功
通知
186
Star
833
Fork
253
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
105
列表
看板
标记
里程碑
合并请求
10
Wiki
2
Wiki
分析
仓库
DevOps
项目成员
Pages
S
Serving
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
105
Issue
105
列表
看板
标记
里程碑
合并请求
10
合并请求
10
Pages
分析
分析
仓库分析
DevOps
Wiki
2
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
2b8393e7
编写于
4月 14, 2022
作者:
T
TeslaZhao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update docs & OCR examples
上级
900bf530
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
88 addition
and
33 deletion
+88
-33
README.md
README.md
+8
-3
README_CN.md
README_CN.md
+12
-5
doc/Save_CN.md
doc/Save_CN.md
+6
-0
examples/Pipeline/PaddleOCR/ocr/pipeline_http_client.py
examples/Pipeline/PaddleOCR/ocr/pipeline_http_client.py
+19
-2
examples/Pipeline/PaddleOCR/ocr/pipeline_rpc_client.py
examples/Pipeline/PaddleOCR/ocr/pipeline_rpc_client.py
+19
-3
examples/Pipeline/PaddleOCR/ocr/web_service.py
examples/Pipeline/PaddleOCR/ocr/web_service.py
+24
-20
未找到文件。
README.md
浏览文件 @
2b8393e7
...
...
@@ -40,13 +40,20 @@ The goal of Paddle Serving is to provide high-performance, flexible and easy-to-
-
Support service monitoring, provide prometheus-based performance statistics and port access
<h2
align=
"center"
>
Tutorial
</h2>
<h2
align=
"center"
>
Tutorial
and Papers
</h2>
-
AIStudio tutorial(Chinese) :
[
Paddle Serving服务化部署框架
](
https://www.paddlepaddle.org.cn/tutorials/projectdetail/2538249
)
-
AIStudio OCR practice(Chinese) :
[
基于PaddleServing的OCR服务化部署实战
](
https://aistudio.baidu.com/aistudio/projectdetail/3630726
)
-
Video tutorial(Chinese) :
[
深度学习服务化部署-以互联网应用为例
](
https://aistudio.baidu.com/aistudio/course/introduce/19084
)
-
Edge AI solution(Chinese) :
[
基于Paddle Serving&百度智能边缘BIE的边缘AI解决方案
](
https://mp.weixin.qq.com/s/j0EVlQXaZ7qmoz9Fv96Yrw
)
-
Paper :
[
JiZhi: A Fast and Cost-Effective Model-As-A-Service System for
Web-Scale Online Inference at Baidu
](
https://arxiv.org/pdf/2106.01674.pdf
)
-
Paper :
[
ERNIE 3.0 TITAN: EXPLORING LARGER-SCALE KNOWLEDGE
ENHANCED PRE-TRAINING FOR LANGUAGE UNDERSTANDING
AND GENERATION
](
https://arxiv.org/pdf/2112.12731.pdf
)
<p
align=
"center"
>
<img
src=
"doc/images/demo.gif"
width=
"700"
>
</p>
...
...
@@ -90,8 +97,6 @@ The first step is to call the model save interface to generate a model parameter
-
[
Analyze and optimize performance
](
doc/Python_Pipeline/Performance_Tuning_EN.md
)
-
[
TensorRT dynamic Shape
](
doc/TensorRT_Dynamic_Shape_EN.md
)
-
[
Benchmark(Chinese)
](
doc/Python_Pipeline/Benchmark_CN.md
)
-
Our Paper:
[
JiZhi: A Fast and Cost-Effective Model-As-A-Service System for
Web-Scale Online Inference at Baidu
](
https://arxiv.org/pdf/2106.01674.pdf
)
-
Client SDK
-
[
Python SDK(Chinese)
](
doc/C++_Serving/Introduction_CN.md#42-多语言多协议Client
)
-
[
JAVA SDK
](
doc/Java_SDK_EN.md
)
...
...
README_CN.md
浏览文件 @
2b8393e7
...
...
@@ -39,11 +39,18 @@ Paddle Serving依托深度学习框架PaddlePaddle旨在帮助深度学习开发
-
支持服务监控,提供基于普罗米修斯的性能数据统计及端口访问
<h2
align=
"center"
>
教程
</h2>
-
AIStudio教程-
[
Paddle Serving服务化部署框架
](
https://www.paddlepaddle.org.cn/tutorials/projectdetail/2538249
)
-
视频教程-
[
深度学习服务化部署-以互联网应用为例
](
https://aistudio.baidu.com/aistudio/course/introduce/19084
)
-
边缘AI解决方案-
[
基于Paddle Serving&百度智能边缘BIE的边缘AI解决方案
](
https://mp.weixin.qq.com/s/j0EVlQXaZ7qmoz9Fv96Yrw
)
<h2
align=
"center"
>
教程与论文
</h2>
-
AIStudio 使用教程 :
[
Paddle Serving服务化部署框架
](
https://www.paddlepaddle.org.cn/tutorials/projectdetail/2538249
)
-
AIStudio OCR实战 :
[
基于PaddleServing的OCR服务化部署实战
](
https://aistudio.baidu.com/aistudio/projectdetail/3630726
)
-
视频教程 :
[
深度学习服务化部署-以互联网应用为例
](
https://aistudio.baidu.com/aistudio/course/introduce/19084
)
-
边缘AI 解决方案 :
[
基于Paddle Serving&百度智能边缘BIE的边缘AI解决方案
](
https://mp.weixin.qq.com/s/j0EVlQXaZ7qmoz9Fv96Yrw
)
-
论文 :
[
JiZhi: A Fast and Cost-Effective Model-As-A-Service System for
Web-Scale Online Inference at Baidu
](
https://arxiv.org/pdf/2106.01674.pdf
)
-
论文 :
[
ERNIE 3.0 TITAN: EXPLORING LARGER-SCALE KNOWLEDGE
ENHANCED PRE-TRAINING FOR LANGUAGE UNDERSTANDING
AND GENERATION
](
https://arxiv.org/pdf/2112.12731.pdf
)
<p
align=
"center"
>
<img
src=
"doc/images/demo.gif"
width=
"700"
>
...
...
doc/Save_CN.md
浏览文件 @
2b8393e7
...
...
@@ -2,6 +2,12 @@
(简体中文|
[
English
](
./Save_EN.md
)
)
## 保存用于 Serving 部署模型的意义
## 从已保存的模型文件中导出
如果已使用Paddle 的
`save_inference_model`
接口保存出预测要使用的模型,你可以使用Paddle Serving提供的名为
`paddle_serving_client.convert`
的内置模块进行转换。
```
python
...
...
examples/Pipeline/PaddleOCR/ocr/pipeline_http_client.py
浏览文件 @
2b8393e7
...
...
@@ -29,9 +29,26 @@ test_img_dir = "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
()
# print file name
print
(
'{}{}{}'
.
format
(
'*'
*
10
,
img_file
,
'*'
*
10
))
image
=
cv2_to_base64
(
image_data1
)
for
i
in
range
(
4
):
data
=
{
"key"
:
[
"image"
],
"value"
:
[
image
]}
r
=
requests
.
post
(
url
=
url
,
data
=
json
.
dumps
(
data
))
print
(
r
.
json
())
result
=
r
.
json
()
print
(
"erro_no:{}, err_msg:{}"
.
format
(
result
[
"err_no"
],
result
[
"err_msg"
]))
# check success
if
result
[
"err_no"
]
==
0
:
ocr_result
=
result
[
"value"
][
0
]
try
:
for
item
in
eval
(
ocr_result
):
# return transcription and points
print
(
"{}, {}"
.
format
(
item
[
0
],
item
[
1
]))
except
Exception
as
e
:
print
(
"No results"
)
continue
else
:
print
(
"For details about error message, see PipelineServingLogs/pipeline.log.wf"
)
examples/Pipeline/PaddleOCR/ocr/pipeline_rpc_client.py
浏览文件 @
2b8393e7
...
...
@@ -34,8 +34,24 @@ test_img_dir = "imgs/"
for
img_file
in
os
.
listdir
(
test_img_dir
):
with
open
(
os
.
path
.
join
(
test_img_dir
,
img_file
),
'rb'
)
as
file
:
image_data
=
file
.
read
()
# print file name
print
(
'{}{}{}'
.
format
(
'*'
*
10
,
img_file
,
'*'
*
10
))
image
=
cv2_to_base64
(
image_data
)
for
i
in
range
(
1
):
ret
=
client
.
predict
(
feed_dict
=
{
"image"
:
image
},
fetch
=
[
"res"
])
print
(
ret
)
result
=
client
.
predict
(
feed_dict
=
{
"image"
:
image
},
fetch
=
[
"res"
])
print
(
"erro_no:{}, err_msg:{}"
.
format
(
result
.
err_no
,
result
.
err_msg
))
# check success
if
result
.
err_no
==
0
:
ocr_result
=
result
.
value
[
0
]
try
:
for
item
in
eval
(
ocr_result
):
# return transcription and points
print
(
"{}, {}"
.
format
(
item
[
0
],
item
[
1
]))
except
Exception
as
e
:
print
(
"No results"
)
continue
else
:
print
(
"For details about error message, see PipelineServingLogs/pipeline.log.wf"
)
examples/Pipeline/PaddleOCR/ocr/web_service.py
浏览文件 @
2b8393e7
...
...
@@ -14,6 +14,7 @@
from
paddle_serving_server.web_service
import
WebService
,
Op
import
logging
import
numpy
as
np
import
copy
import
cv2
import
base64
from
paddle_serving_app.reader
import
OCRReader
...
...
@@ -34,17 +35,18 @@ class DetOp(Op):
self
.
filter_func
=
FilterBoxes
(
10
,
10
)
self
.
post_func
=
DBPostProcess
({
"thresh"
:
0.3
,
"box_thresh"
:
0.
5
,
"box_thresh"
:
0.
6
,
"max_candidates"
:
1000
,
"unclip_ratio"
:
1.5
,
"min_size"
:
3
})
"""
when opening tensorrt(configure in config.yml) and each time the input shape
for inferring is different, using this method for configuring tensorrt
dynamic shape to infer in each op model
"""
def
set_dynamic_shape_info
(
self
):
min_input_shape
=
{
"x"
:
[
1
,
3
,
50
,
50
],
...
...
@@ -74,7 +76,7 @@ class DetOp(Op):
"min_input_shape"
:
min_input_shape
,
"max_input_shape"
:
max_input_shape
,
"opt_input_shape"
:
opt_input_shape
,
}
}
def
preprocess
(
self
,
input_dicts
,
data_id
,
log_id
):
(
_
,
input_dict
),
=
input_dicts
.
items
()
...
...
@@ -107,25 +109,20 @@ class RecOp(Op):
self
.
ocr_reader
=
OCRReader
()
self
.
get_rotate_crop_image
=
GetRotateCropImage
()
self
.
sorted_boxes
=
SortedBoxes
()
"""
when opening tensorrt(configure in config.yml) and each time the input shape
for inferring is different, using this method for configuring tensorrt
dynamic shape to infer in each op model
"""
def
set_dynamic_shape_info
(
self
):
min_input_shape
=
{
"x"
:
[
1
,
3
,
32
,
10
],
"lstm_1.tmp_0"
:
[
1
,
1
,
128
]
}
min_input_shape
=
{
"x"
:
[
1
,
3
,
32
,
10
],
"lstm_1.tmp_0"
:
[
1
,
1
,
128
]}
max_input_shape
=
{
"x"
:
[
50
,
3
,
32
,
1000
],
"lstm_1.tmp_0"
:
[
500
,
50
,
128
]
}
opt_input_shape
=
{
"x"
:
[
6
,
3
,
32
,
100
],
"lstm_1.tmp_0"
:
[
25
,
5
,
128
]
}
opt_input_shape
=
{
"x"
:
[
6
,
3
,
32
,
100
],
"lstm_1.tmp_0"
:
[
25
,
5
,
128
]}
self
.
dynamic_shape_info
=
{
"min_input_shape"
:
min_input_shape
,
"max_input_shape"
:
max_input_shape
,
...
...
@@ -137,8 +134,10 @@ class RecOp(Op):
raw_im
=
input_dict
[
"image"
]
data
=
np
.
frombuffer
(
raw_im
,
np
.
uint8
)
im
=
cv2
.
imdecode
(
data
,
cv2
.
IMREAD_COLOR
)
dt_boxes
=
input_dict
[
"dt_boxes"
]
dt_boxes
=
self
.
sorted_boxes
(
dt_boxes
)
self
.
dt_list
=
input_dict
[
"dt_boxes"
]
self
.
dt_list
=
self
.
sorted_boxes
(
self
.
dt_list
)
# deepcopy to save origin dt_boxes
dt_boxes
=
copy
.
deepcopy
(
self
.
dt_list
)
feed_list
=
[]
img_list
=
[]
max_wh_ratio
=
0
...
...
@@ -205,26 +204,31 @@ class RecOp(Op):
imgs
[
id
]
=
norm_img
feed
=
{
"x"
:
imgs
.
copy
()}
feed_list
.
append
(
feed
)
#_LOGGER.info("feed_list : {}".format(feed_list))
return
feed_list
,
False
,
None
,
""
def
postprocess
(
self
,
input_dicts
,
fetch_data
,
data_id
,
log_id
):
res_list
=
[]
rec_list
=
[]
dt_num
=
len
(
self
.
dt_list
)
if
isinstance
(
fetch_data
,
dict
):
if
len
(
fetch_data
)
>
0
:
rec_batch_res
=
self
.
ocr_reader
.
postprocess_ocrv2
(
fetch_data
,
with_score
=
True
)
for
res
in
rec_batch_res
:
re
s_list
.
append
(
res
[
0
]
)
re
c_list
.
append
(
res
)
elif
isinstance
(
fetch_data
,
list
):
for
one_batch
in
fetch_data
:
one_batch_res
=
self
.
ocr_reader
.
postprocess_ocrv2
(
one_batch
,
with_score
=
True
)
for
res
in
one_batch_res
:
res_list
.
append
(
res
[
0
])
res
=
{
"res"
:
str
(
res_list
)}
rec_list
.
append
(
res
)
result_list
=
[]
for
i
in
range
(
dt_num
):
text
=
rec_list
[
i
]
dt_box
=
self
.
dt_list
[
i
]
result_list
.
append
([
text
,
dt_box
.
tolist
()])
res
=
{
"result"
:
str
(
result_list
)}
return
res
,
None
,
""
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录