Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleSeg
提交
8d56d6d7
P
PaddleSeg
项目概览
PaddlePaddle
/
PaddleSeg
通知
285
Star
8
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
53
列表
看板
标记
里程碑
合并请求
3
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleSeg
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
53
Issue
53
列表
看板
标记
里程碑
合并请求
3
合并请求
3
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
8d56d6d7
编写于
3月 31, 2020
作者:
S
sjtubinlong
浏览文件
操作
浏览文件
下载
差异文件
fix coding style
上级
eecb2092
77a87b8c
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
66 addition
and
49 deletion
+66
-49
contrib/RealTimeHumanSeg/python/infer.py
contrib/RealTimeHumanSeg/python/infer.py
+66
-49
未找到文件。
contrib/RealTimeHumanSeg/python/infer.py
浏览文件 @
8d56d6d7
...
...
@@ -22,7 +22,7 @@ import cv2
import
paddle.fluid
as
fluid
def
LoadM
odel
(
model_dir
,
use_gpu
=
False
):
def
load_m
odel
(
model_dir
,
use_gpu
=
False
):
"""
Load model files and init paddle predictor
"""
...
...
@@ -41,78 +41,94 @@ def LoadModel(model_dir, use_gpu=False):
class
HumanSeg
:
"""
Human Segmentation Class
"""
def
__init__
(
self
,
model_dir
,
mean
,
scale
,
eval_size
,
use_gpu
=
False
):
self
.
mean
=
np
.
array
(
mean
).
reshape
((
3
,
1
,
1
))
self
.
scale
=
np
.
array
(
scale
).
reshape
((
3
,
1
,
1
))
self
.
eval_size
=
eval_size
self
.
predictor
=
LoadM
odel
(
model_dir
,
use_gpu
)
def
P
reprocess
(
self
,
image
):
im
=
cv2
.
resize
(
image
,
self
.
eval_size
,
fx
=
0
,
fy
=
0
,
interpolation
=
cv2
.
INTER_LINEAR
)
self
.
predictor
=
load_m
odel
(
model_dir
,
use_gpu
)
def
p
reprocess
(
self
,
image
):
"""
preprocess image: hwc_rgb to chw_bgr
"""
img_mat
=
cv2
.
resize
(
image
,
self
.
eval_size
,
fx
=
0
,
fy
=
0
,
interpolation
=
cv2
.
INTER_CUBIC
)
# HWC -> CHW
im
=
im
.
swapaxes
(
1
,
2
)
im
=
im
.
swapaxes
(
0
,
1
)
im
g_mat
=
img_mat
.
swapaxes
(
1
,
2
)
im
g_mat
=
img_mat
.
swapaxes
(
0
,
1
)
# Convert to float
im
=
im
[:,
:,
:].
astype
(
'float32'
)
# im = (im - mean) * scale
im
=
im
-
self
.
mean
im
=
im
*
self
.
scale
im
=
im
[
np
.
newaxis
,
:,
:,
:]
return
im
def
Postprocess
(
self
,
image
,
output_data
):
img_mat
=
img_mat
[:,
:,
:].
astype
(
'float32'
)
# img_mat = (img_mat - mean) * scale
img_mat
=
img_mat
-
self
.
mean
img_mat
=
img_mat
*
self
.
scale
img_mat
=
img_mat
[
np
.
newaxis
,
:,
:,
:]
return
img_mat
def
postprocess
(
self
,
image
,
output_data
):
"""
postprocess result: merge background with segmentation result
"""
mask
=
output_data
[
0
,
1
,
:,
:]
mask
=
cv2
.
resize
(
mask
,
(
image
.
shape
[
1
],
image
.
shape
[
0
]))
scoremap
=
np
.
repeat
(
mask
[:,
:,
np
.
newaxis
],
3
,
axis
=
2
)
bg
=
np
.
ones_like
(
scoremap
)
*
255
merge_im
=
(
scoremap
*
image
+
(
1
-
scoremap
)
*
bg
).
astype
(
np
.
uint8
)
bg
_im
=
np
.
ones_like
(
scoremap
)
*
255
merge_im
=
(
scoremap
*
image
+
(
1
-
scoremap
)
*
bg
_im
).
astype
(
np
.
uint8
)
return
merge_im
def
Predict
(
self
,
image
):
def
run_predict
(
self
,
image
):
"""
run predict: return segmentation image mat
"""
ori_im
=
image
.
copy
()
im
=
self
.
Preprocess
(
image
)
im_tensor
=
fluid
.
core
.
PaddleTensor
(
im
.
copy
().
astype
(
'float32'
))
im
_mat
=
self
.
preprocess
(
ori_im
)
im_tensor
=
fluid
.
core
.
PaddleTensor
(
im
_mat
.
copy
().
astype
(
'float32'
))
output_data
=
self
.
predictor
.
run
([
im_tensor
])[
0
]
output_data
=
output_data
.
as_ndarray
()
return
self
.
P
ostprocess
(
image
,
output_data
)
return
self
.
p
ostprocess
(
image
,
output_data
)
# Do Predicting on a image
def
PredictImage
(
seg
,
image_path
):
im
=
cv2
.
imread
(
input_path
)
im
=
seg
.
Predict
(
im
)
cv2
.
imwrite
(
'result.jpeg'
,
im
)
# Do Predicting on a video
def
PredictVideo
(
seg
,
video_path
):
def
predict_image
(
seg
,
image_path
):
"""
Do Predicting on a image
"""
img_mat
=
cv2
.
imread
(
image_path
)
img_mat
=
seg
.
run_predict
(
img_mat
)
cv2
.
imwrite
(
'result.jpeg'
,
img_mat
)
def
predict_video
(
seg
,
video_path
):
"""
Do Predicting on a video
"""
cap
=
cv2
.
VideoCapture
(
video_path
)
if
cap
.
isOpened
()
==
False
:
if
not
cap
.
isOpened
()
:
print
(
"Error opening video stream or file"
)
return
w
=
cap
.
get
(
cv2
.
CAP_PROP_FRAME_WIDTH
)
h
=
cap
.
get
(
cv2
.
CAP_PROP_FRAME_HEIGHT
)
w
idth
=
int
(
cap
.
get
(
cv2
.
CAP_PROP_FRAME_WIDTH
)
)
h
eight
=
int
(
cap
.
get
(
cv2
.
CAP_PROP_FRAME_HEIGHT
)
)
fps
=
cap
.
get
(
cv2
.
CAP_PROP_FPS
)
# Result Video Writer
out
=
cv2
.
VideoWriter
(
'result.avi'
,
cv2
.
VideoWriter_fourcc
(
'M'
,
'J'
,
'P'
,
'G'
),
fps
,
(
int
(
w
),
int
(
h
)))
cv2
.
VideoWriter_fourcc
(
'M'
,
'J'
,
'P'
,
'G'
),
fps
,
(
width
,
height
))
# Start capturing from video
while
cap
.
isOpened
():
ret
,
frame
=
cap
.
read
()
if
ret
==
True
:
im
=
seg
.
P
redict
(
frame
)
out
.
write
(
im
)
if
ret
:
im
g_mat
=
seg
.
run_p
redict
(
frame
)
out
.
write
(
im
g_mat
)
else
:
break
cap
.
release
()
out
.
release
()
# Do Predicting on a camera video stream
def
PredictCamera
(
seg
):
def
predict_camera
(
seg
):
"""
Do Predicting on a camera video stream
"""
cap
=
cv2
.
VideoCapture
(
0
)
if
not
cap
.
isOpened
():
print
(
"Error opening video stream or file"
)
...
...
@@ -121,8 +137,8 @@ def PredictCamera(seg):
while
cap
.
isOpened
():
ret
,
frame
=
cap
.
read
()
if
ret
:
im
=
seg
.
P
redict
(
frame
)
cv2
.
imshow
(
'Frame'
,
im
)
im
g_mat
=
seg
.
run_p
redict
(
frame
)
cv2
.
imshow
(
'Frame'
,
im
g_mat
)
if
cv2
.
waitKey
(
1
)
&
0xFF
==
ord
(
'q'
):
break
else
:
...
...
@@ -137,16 +153,17 @@ def main(argv):
print
(
'Usage: python infer.py /path/to/model/ /path/to/video'
)
return
model_dir
=
argv
[
1
]
input_path
=
argv
[
2
]
use_gpu
=
int
(
argv
[
3
])
if
len
(
argv
)
>=
4
else
0
model_dir
=
sys
.
argv
[
1
]
input_path
=
sys
.
argv
[
2
]
use_gpu
=
int
(
sys
.
argv
[
3
])
if
len
(
sys
.
argv
)
>=
4
else
0
# Init model
mean
=
[
104.008
,
116.669
,
122.675
]
scale
=
[
1.0
,
1.0
,
1.0
]
eval_size
=
(
192
,
192
)
seg
=
HumanSeg
(
model_dir
,
mean
,
scale
,
eval_size
,
use_gpu
)
# Run Predicting on a video and result will be saved as result.avi
PredictCamera
(
seg
)
# predict_camera(seg)
predict_video
(
seg
,
input_path
)
if
__name__
==
"__main__"
:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录