Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleClas
提交
3ded7ccf
P
PaddleClas
项目概览
PaddlePaddle
/
PaddleClas
接近 2 年 前同步成功
通知
116
Star
4999
Fork
1114
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
19
列表
看板
标记
里程碑
合并请求
6
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleClas
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
19
Issue
19
列表
看板
标记
里程碑
合并请求
6
合并请求
6
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
3ded7ccf
编写于
6月 05, 2021
作者:
C
cuicheng01
提交者:
GitHub
6月 05, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #792 from weisy11/develop_reg
export model support rec model
上级
ae24d832
017b7b3a
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
39 addition
and
32 deletion
+39
-32
ppcls/arch/__init__.py
ppcls/arch/__init__.py
+3
-2
ppcls/arch/gears/arcmargin.py
ppcls/arch/gears/arcmargin.py
+2
-2
ppcls/engine/trainer.py
ppcls/engine/trainer.py
+23
-23
tools/export_model.py
tools/export_model.py
+11
-5
未找到文件。
ppcls/arch/__init__.py
浏览文件 @
3ded7ccf
...
...
@@ -53,11 +53,12 @@ class RecModel(nn.Layer):
else
:
self
.
head
=
None
def
forward
(
self
,
x
,
label
):
def
forward
(
self
,
x
,
label
=
None
):
x
=
self
.
backbone
(
x
)
if
self
.
neck
is
not
None
:
x
=
self
.
neck
(
x
)
y
=
x
if
self
.
head
is
not
None
:
y
=
self
.
head
(
x
,
label
)
else
:
y
=
None
return
{
"features"
:
x
,
"logits"
:
y
}
ppcls/arch/gears/arcmargin.py
浏览文件 @
3ded7ccf
...
...
@@ -39,7 +39,7 @@ class ArcMargin(nn.Layer):
weight_attr
=
weight_attr
,
bias_attr
=
False
)
def
forward
(
self
,
input
,
label
):
def
forward
(
self
,
input
,
label
=
None
):
input_norm
=
paddle
.
sqrt
(
paddle
.
sum
(
paddle
.
square
(
input
),
axis
=
1
,
keepdim
=
True
))
input
=
paddle
.
divide
(
input
,
input_norm
)
...
...
@@ -50,7 +50,7 @@ class ArcMargin(nn.Layer):
weight
=
paddle
.
divide
(
weight
,
weight_norm
)
cos
=
paddle
.
matmul
(
input
,
weight
)
if
not
self
.
training
:
if
not
self
.
training
or
label
is
None
:
return
cos
sin
=
paddle
.
sqrt
(
1.0
-
paddle
.
square
(
cos
)
+
1e-6
)
cos_m
=
math
.
cos
(
self
.
margin
)
...
...
ppcls/engine/trainer.py
浏览文件 @
3ded7ccf
...
...
@@ -329,22 +329,22 @@ class Trainer(object):
self
.
model
.
eval
()
cum_similarity_matrix
=
None
# step1. build gallery
gallery_feas
,
gallery_img_id
,
gallery_
camera
_id
=
self
.
_cal_feature
(
gallery_feas
,
gallery_img_id
,
gallery_
unique
_id
=
self
.
_cal_feature
(
name
=
'gallery'
)
query_feas
,
query_img_id
,
query_
camera
_id
=
self
.
_cal_feature
(
query_feas
,
query_img_id
,
query_
query
_id
=
self
.
_cal_feature
(
name
=
'query'
)
gallery_img_id
=
gallery_img_id
# if gallery_
camera
_id is not None:
# gallery_
camera_id = gallery_camera
_id
# if gallery_
unique
_id is not None:
# gallery_
unique_id = gallery_unique
_id
# step2. do evaluation
sim_block_size
=
self
.
config
[
"Global"
].
get
(
"sim_block_size"
,
64
)
sections
=
[
sim_block_size
]
*
(
len
(
query_feas
)
//
sim_block_size
)
if
len
(
query_feas
)
%
sim_block_size
:
sections
.
append
(
len
(
query_feas
)
%
sim_block_size
)
fea_blocks
=
paddle
.
split
(
query_feas
,
num_or_sections
=
sections
)
if
query_
camera
_id
is
not
None
:
camera
_id_blocks
=
paddle
.
split
(
query_
camera
_id
,
num_or_sections
=
sections
)
if
query_
query
_id
is
not
None
:
query
_id_blocks
=
paddle
.
split
(
query_
query
_id
,
num_or_sections
=
sections
)
image_id_blocks
=
paddle
.
split
(
query_img_id
,
num_or_sections
=
sections
)
metric_key
=
None
...
...
@@ -352,14 +352,14 @@ class Trainer(object):
for
block_idx
,
block_fea
in
enumerate
(
fea_blocks
):
similarity_matrix
=
paddle
.
matmul
(
block_fea
,
gallery_feas
,
transpose_y
=
True
)
if
query_
camera
_id
is
not
None
:
camera_id_block
=
camera
_id_blocks
[
block_idx
]
camera_id_mask
=
(
camera_id_block
!=
gallery_camera
_id
.
t
())
if
query_
query
_id
is
not
None
:
query_id_block
=
query
_id_blocks
[
block_idx
]
query_id_mask
=
(
query_id_block
!=
gallery_unique
_id
.
t
())
image_id_block
=
image_id_blocks
[
block_idx
]
image_id_mask
=
(
image_id_block
!=
gallery_img_id
.
t
())
keep_mask
=
paddle
.
logical_or
(
camera
_id_mask
,
image_id_mask
)
keep_mask
=
paddle
.
logical_or
(
query
_id_mask
,
image_id_mask
)
similarity_matrix
=
similarity_matrix
*
keep_mask
.
astype
(
"float32"
)
if
cum_similarity_matrix
is
None
:
...
...
@@ -388,7 +388,7 @@ class Trainer(object):
def
_cal_feature
(
self
,
name
=
'gallery'
):
all_feas
=
None
all_image_id
=
None
all_
camera
_id
=
None
all_
unique
_id
=
None
if
name
==
'gallery'
:
dataloader
=
self
.
gallery_dataloader
elif
name
==
'query'
:
...
...
@@ -396,13 +396,13 @@ class Trainer(object):
else
:
raise
RuntimeError
(
"Only support gallery or query dataset"
)
has_
cam
_id
=
False
has_
unique
_id
=
False
for
idx
,
batch
in
enumerate
(
dataloader
(
)):
# load is very time-consuming
batch
=
[
paddle
.
to_tensor
(
x
)
for
x
in
batch
]
batch
[
1
]
=
batch
[
1
].
reshape
([
-
1
,
1
])
if
len
(
batch
)
==
3
:
has_
cam
_id
=
True
has_
unique
_id
=
True
batch
[
2
]
=
batch
[
2
].
reshape
([
-
1
,
1
])
out
=
self
.
model
(
batch
[
0
],
batch
[
1
])
batch_feas
=
out
[
"features"
]
...
...
@@ -416,30 +416,30 @@ class Trainer(object):
if
all_feas
is
None
:
all_feas
=
batch_feas
if
has_
cam
_id
:
all_
camera
_id
=
batch
[
2
]
if
has_
unique
_id
:
all_
unique
_id
=
batch
[
2
]
all_image_id
=
batch
[
1
]
else
:
all_feas
=
paddle
.
concat
([
all_feas
,
batch_feas
])
all_image_id
=
paddle
.
concat
([
all_image_id
,
batch
[
1
]])
if
has_
cam
_id
:
all_
camera_id
=
paddle
.
concat
([
all_camera
_id
,
batch
[
2
]])
if
has_
unique
_id
:
all_
unique_id
=
paddle
.
concat
([
all_unique
_id
,
batch
[
2
]])
if
paddle
.
distributed
.
get_world_size
()
>
1
:
feat_list
=
[]
img_id_list
=
[]
cam
_id_list
=
[]
unique
_id_list
=
[]
paddle
.
distributed
.
all_gather
(
feat_list
,
all_feas
)
paddle
.
distributed
.
all_gather
(
img_id_list
,
all_image_id
)
all_feas
=
paddle
.
concat
(
feat_list
,
axis
=
0
)
all_image_id
=
paddle
.
concat
(
img_id_list
,
axis
=
0
)
if
has_
cam
_id
:
paddle
.
distributed
.
all_gather
(
cam_id_list
,
all_camera
_id
)
all_
camera_id
=
paddle
.
concat
(
cam
_id_list
,
axis
=
0
)
if
has_
unique
_id
:
paddle
.
distributed
.
all_gather
(
unique_id_list
,
all_unique
_id
)
all_
unique_id
=
paddle
.
concat
(
unique
_id_list
,
axis
=
0
)
logger
.
info
(
"Build {} done, all feat shape: {}, begin to eval.."
.
format
(
name
,
all_feas
.
shape
))
return
all_feas
,
all_image_id
,
all_
camera
_id
return
all_feas
,
all_image_id
,
all_
unique
_id
@
paddle
.
no_grad
()
def
infer
(
self
,
):
...
...
tools/export_model.py
浏览文件 @
3ded7ccf
...
...
@@ -29,7 +29,7 @@ from ppcls.arch import build_model
from
ppcls.utils.save_load
import
load_dygraph_pretrain
class
Clas
Model
(
nn
.
Layer
):
class
Export
Model
(
nn
.
Layer
):
"""
ClasModel: add softmax onto the model
"""
...
...
@@ -37,7 +37,11 @@ class ClasModel(nn.Layer):
def
__init__
(
self
,
config
):
super
().
__init__
()
self
.
base_model
=
build_model
(
config
)
self
.
softmax
=
nn
.
Softmax
(
axis
=-
1
)
self
.
infer_output_key
=
config
.
get
(
"infer_output_key"
)
if
config
.
get
(
"infer_add_softmax"
,
True
):
self
.
softmax
=
nn
.
Softmax
(
axis
=-
1
)
else
:
self
.
softmax
=
None
def
eval
(
self
):
self
.
training
=
False
...
...
@@ -47,7 +51,10 @@ class ClasModel(nn.Layer):
def
forward
(
self
,
x
):
x
=
self
.
base_model
(
x
)
x
=
self
.
softmax
(
x
)
if
self
.
infer_output_key
is
not
None
:
x
=
x
[
self
.
infer_output_key
]
if
self
.
softmax
is
not
None
:
x
=
self
.
softmax
(
x
)
return
x
...
...
@@ -57,8 +64,7 @@ if __name__ == "__main__":
# set device
assert
config
[
"Global"
][
"device"
]
in
[
"cpu"
,
"gpu"
,
"xpu"
]
device
=
paddle
.
set_device
(
config
[
"Global"
][
"device"
])
model
=
ClasModel
(
config
[
"Arch"
])
model
=
ExportModel
(
config
[
"Arch"
])
if
config
[
"Global"
][
"pretrained_model"
]
is
not
None
:
load_dygraph_pretrain
(
model
.
base_model
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录