Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleClas
提交
50900443
P
PaddleClas
项目概览
PaddlePaddle
/
PaddleClas
大约 2 年 前同步成功
通知
118
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看板
提交
50900443
编写于
5月 12, 2022
作者:
Z
zhiboniu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
remove strongbaseline_attr, etc...
上级
26d5b7d1
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
28 addition
and
115 deletion
+28
-115
ppcls/arch/backbone/__init__.py
ppcls/arch/backbone/__init__.py
+0
-1
ppcls/arch/backbone/legendary_models/resnet.py
ppcls/arch/backbone/legendary_models/resnet.py
+15
-3
ppcls/arch/backbone/model_zoo/strongbaseline_attr.py
ppcls/arch/backbone/model_zoo/strongbaseline_attr.py
+0
-99
ppcls/configs/Attr/StrongBaselineAttr.yaml
ppcls/configs/Attr/StrongBaselineAttr.yaml
+5
-5
ppcls/data/preprocess/__init__.py
ppcls/data/preprocess/__init__.py
+1
-0
ppcls/data/preprocess/ops/operators.py
ppcls/data/preprocess/ops/operators.py
+1
-1
ppcls/engine/evaluation/classification.py
ppcls/engine/evaluation/classification.py
+5
-5
ppcls/metric/metrics.py
ppcls/metric/metrics.py
+1
-1
未找到文件。
ppcls/arch/backbone/__init__.py
浏览文件 @
50900443
...
@@ -70,7 +70,6 @@ from ppcls.arch.backbone.model_zoo.van import VAN_tiny
...
@@ -70,7 +70,6 @@ from ppcls.arch.backbone.model_zoo.van import VAN_tiny
from
ppcls.arch.backbone.variant_models.resnet_variant
import
ResNet50_last_stage_stride1
from
ppcls.arch.backbone.variant_models.resnet_variant
import
ResNet50_last_stage_stride1
from
ppcls.arch.backbone.variant_models.vgg_variant
import
VGG19Sigmoid
from
ppcls.arch.backbone.variant_models.vgg_variant
import
VGG19Sigmoid
from
ppcls.arch.backbone.variant_models.pp_lcnet_variant
import
PPLCNet_x2_5_Tanh
from
ppcls.arch.backbone.variant_models.pp_lcnet_variant
import
PPLCNet_x2_5_Tanh
from
ppcls.arch.backbone.model_zoo.strongbaseline_attr
import
StrongBaselineAttr
# help whl get all the models' api (class type) and components' api (func type)
# help whl get all the models' api (class type) and components' api (func type)
...
...
ppcls/arch/backbone/legendary_models/resnet.py
浏览文件 @
50900443
...
@@ -114,10 +114,10 @@ class ConvBNLayer(TheseusLayer):
...
@@ -114,10 +114,10 @@ class ConvBNLayer(TheseusLayer):
filter_size
,
filter_size
,
stride
=
1
,
stride
=
1
,
groups
=
1
,
groups
=
1
,
norm_decay
=
0.0005
,
is_vd_mode
=
False
,
is_vd_mode
=
False
,
act
=
None
,
act
=
None
,
lr_mult
=
1.0
,
lr_mult
=
1.0
,
norm_decay
=
0.
,
data_format
=
"NCHW"
):
data_format
=
"NCHW"
):
super
().
__init__
()
super
().
__init__
()
self
.
is_vd_mode
=
is_vd_mode
self
.
is_vd_mode
=
is_vd_mode
...
@@ -135,7 +135,7 @@ class ConvBNLayer(TheseusLayer):
...
@@ -135,7 +135,7 @@ class ConvBNLayer(TheseusLayer):
bias_attr
=
False
,
bias_attr
=
False
,
data_format
=
data_format
)
data_format
=
data_format
)
param
_attr
=
ParamAttr
(
weight
_attr
=
ParamAttr
(
learning_rate
=
lr_mult
,
learning_rate
=
lr_mult
,
regularizer
=
L2Decay
(
norm_decay
),
regularizer
=
L2Decay
(
norm_decay
),
trainable
=
True
)
trainable
=
True
)
...
@@ -145,7 +145,7 @@ class ConvBNLayer(TheseusLayer):
...
@@ -145,7 +145,7 @@ class ConvBNLayer(TheseusLayer):
trainable
=
True
)
trainable
=
True
)
self
.
bn
=
BatchNorm2D
(
self
.
bn
=
BatchNorm2D
(
num_filters
,
weight_attr
=
param
_attr
,
bias_attr
=
bias_attr
)
num_filters
,
weight_attr
=
weight
_attr
,
bias_attr
=
bias_attr
)
self
.
relu
=
nn
.
ReLU
()
self
.
relu
=
nn
.
ReLU
()
def
forward
(
self
,
x
):
def
forward
(
self
,
x
):
...
@@ -166,6 +166,7 @@ class BottleneckBlock(TheseusLayer):
...
@@ -166,6 +166,7 @@ class BottleneckBlock(TheseusLayer):
shortcut
=
True
,
shortcut
=
True
,
if_first
=
False
,
if_first
=
False
,
lr_mult
=
1.0
,
lr_mult
=
1.0
,
norm_decay
=
0.
,
data_format
=
"NCHW"
):
data_format
=
"NCHW"
):
super
().
__init__
()
super
().
__init__
()
...
@@ -175,6 +176,7 @@ class BottleneckBlock(TheseusLayer):
...
@@ -175,6 +176,7 @@ class BottleneckBlock(TheseusLayer):
filter_size
=
1
,
filter_size
=
1
,
act
=
"relu"
,
act
=
"relu"
,
lr_mult
=
lr_mult
,
lr_mult
=
lr_mult
,
norm_decay
=
norm_decay
,
data_format
=
data_format
)
data_format
=
data_format
)
self
.
conv1
=
ConvBNLayer
(
self
.
conv1
=
ConvBNLayer
(
num_channels
=
num_filters
,
num_channels
=
num_filters
,
...
@@ -183,6 +185,7 @@ class BottleneckBlock(TheseusLayer):
...
@@ -183,6 +185,7 @@ class BottleneckBlock(TheseusLayer):
stride
=
stride
,
stride
=
stride
,
act
=
"relu"
,
act
=
"relu"
,
lr_mult
=
lr_mult
,
lr_mult
=
lr_mult
,
norm_decay
=
norm_decay
,
data_format
=
data_format
)
data_format
=
data_format
)
self
.
conv2
=
ConvBNLayer
(
self
.
conv2
=
ConvBNLayer
(
num_channels
=
num_filters
,
num_channels
=
num_filters
,
...
@@ -190,6 +193,7 @@ class BottleneckBlock(TheseusLayer):
...
@@ -190,6 +193,7 @@ class BottleneckBlock(TheseusLayer):
filter_size
=
1
,
filter_size
=
1
,
act
=
None
,
act
=
None
,
lr_mult
=
lr_mult
,
lr_mult
=
lr_mult
,
norm_decay
=
norm_decay
,
data_format
=
data_format
)
data_format
=
data_format
)
if
not
shortcut
:
if
not
shortcut
:
...
@@ -200,6 +204,7 @@ class BottleneckBlock(TheseusLayer):
...
@@ -200,6 +204,7 @@ class BottleneckBlock(TheseusLayer):
stride
=
stride
if
if_first
else
1
,
stride
=
stride
if
if_first
else
1
,
is_vd_mode
=
False
if
if_first
else
True
,
is_vd_mode
=
False
if
if_first
else
True
,
lr_mult
=
lr_mult
,
lr_mult
=
lr_mult
,
norm_decay
=
norm_decay
,
data_format
=
data_format
)
data_format
=
data_format
)
self
.
relu
=
nn
.
ReLU
()
self
.
relu
=
nn
.
ReLU
()
...
@@ -228,6 +233,7 @@ class BasicBlock(TheseusLayer):
...
@@ -228,6 +233,7 @@ class BasicBlock(TheseusLayer):
shortcut
=
True
,
shortcut
=
True
,
if_first
=
False
,
if_first
=
False
,
lr_mult
=
1.0
,
lr_mult
=
1.0
,
norm_decay
=
0.
,
data_format
=
"NCHW"
):
data_format
=
"NCHW"
):
super
().
__init__
()
super
().
__init__
()
...
@@ -239,6 +245,7 @@ class BasicBlock(TheseusLayer):
...
@@ -239,6 +245,7 @@ class BasicBlock(TheseusLayer):
stride
=
stride
,
stride
=
stride
,
act
=
"relu"
,
act
=
"relu"
,
lr_mult
=
lr_mult
,
lr_mult
=
lr_mult
,
norm_decay
=
norm_decay
,
data_format
=
data_format
)
data_format
=
data_format
)
self
.
conv1
=
ConvBNLayer
(
self
.
conv1
=
ConvBNLayer
(
num_channels
=
num_filters
,
num_channels
=
num_filters
,
...
@@ -246,6 +253,7 @@ class BasicBlock(TheseusLayer):
...
@@ -246,6 +253,7 @@ class BasicBlock(TheseusLayer):
filter_size
=
3
,
filter_size
=
3
,
act
=
None
,
act
=
None
,
lr_mult
=
lr_mult
,
lr_mult
=
lr_mult
,
norm_decay
=
norm_decay
,
data_format
=
data_format
)
data_format
=
data_format
)
if
not
shortcut
:
if
not
shortcut
:
self
.
short
=
ConvBNLayer
(
self
.
short
=
ConvBNLayer
(
...
@@ -255,6 +263,7 @@ class BasicBlock(TheseusLayer):
...
@@ -255,6 +263,7 @@ class BasicBlock(TheseusLayer):
stride
=
stride
if
if_first
else
1
,
stride
=
stride
if
if_first
else
1
,
is_vd_mode
=
False
if
if_first
else
True
,
is_vd_mode
=
False
if
if_first
else
True
,
lr_mult
=
lr_mult
,
lr_mult
=
lr_mult
,
norm_decay
=
norm_decay
,
data_format
=
data_format
)
data_format
=
data_format
)
self
.
shortcut
=
shortcut
self
.
shortcut
=
shortcut
self
.
relu
=
nn
.
ReLU
()
self
.
relu
=
nn
.
ReLU
()
...
@@ -291,6 +300,7 @@ class ResNet(TheseusLayer):
...
@@ -291,6 +300,7 @@ class ResNet(TheseusLayer):
stem_act
=
"relu"
,
stem_act
=
"relu"
,
class_num
=
1000
,
class_num
=
1000
,
lr_mult_list
=
[
1.0
,
1.0
,
1.0
,
1.0
,
1.0
],
lr_mult_list
=
[
1.0
,
1.0
,
1.0
,
1.0
,
1.0
],
norm_decay
=
0.
,
data_format
=
"NCHW"
,
data_format
=
"NCHW"
,
input_image_channel
=
3
,
input_image_channel
=
3
,
return_patterns
=
None
,
return_patterns
=
None
,
...
@@ -330,6 +340,7 @@ class ResNet(TheseusLayer):
...
@@ -330,6 +340,7 @@ class ResNet(TheseusLayer):
stride
=
s
,
stride
=
s
,
act
=
stem_act
,
act
=
stem_act
,
lr_mult
=
self
.
lr_mult_list
[
0
],
lr_mult
=
self
.
lr_mult_list
[
0
],
norm_decay
=
norm_decay
,
data_format
=
data_format
)
data_format
=
data_format
)
for
in_c
,
out_c
,
k
,
s
in
self
.
stem_cfg
[
version
]
for
in_c
,
out_c
,
k
,
s
in
self
.
stem_cfg
[
version
]
])
])
...
@@ -348,6 +359,7 @@ class ResNet(TheseusLayer):
...
@@ -348,6 +359,7 @@ class ResNet(TheseusLayer):
shortcut
=
shortcut
,
shortcut
=
shortcut
,
if_first
=
block_idx
==
i
==
0
if
version
==
"vd"
else
True
,
if_first
=
block_idx
==
i
==
0
if
version
==
"vd"
else
True
,
lr_mult
=
self
.
lr_mult_list
[
block_idx
+
1
],
lr_mult
=
self
.
lr_mult_list
[
block_idx
+
1
],
norm_decay
=
norm_decay
,
data_format
=
data_format
))
data_format
=
data_format
))
shortcut
=
True
shortcut
=
True
self
.
blocks
=
nn
.
Sequential
(
*
block_list
)
self
.
blocks
=
nn
.
Sequential
(
*
block_list
)
...
...
ppcls/arch/backbone/model_zoo/strongbaseline_attr.py
已删除
100644 → 0
浏览文件 @
26d5b7d1
# copyright (c) 2022 PaddlePaddle Authors. All Rights Reserve.
#
# 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
__future__
import
absolute_import
from
__future__
import
division
from
__future__
import
print_function
import
numpy
as
np
import
paddle
from
paddle
import
ParamAttr
import
paddle.nn
as
nn
import
paddle.nn.functional
as
F
from
paddle.nn
import
Conv2D
,
BatchNorm
,
Linear
,
Dropout
from
paddle.nn
import
AdaptiveAvgPool2D
,
MaxPool2D
,
AvgPool2D
from
paddle.nn.initializer
import
Uniform
import
math
from
ppcls.utils.save_load
import
load_dygraph_pretrain
,
load_dygraph_pretrain_from_url
,
get_weights_path_from_url
from
..legendary_models.resnet
import
ResNet50
MODEL_URLS
=
{
"StrongBaselineAttr"
:
"strongbaseline_attr_clas"
,
}
__all__
=
list
(
MODEL_URLS
.
keys
())
class
StrongBaselinePAR
(
nn
.
Layer
):
def
__init__
(
self
,
**
config
,
):
"""
A strong baseline for Pedestrian Attribute Recognition, see https://arxiv.org/abs/2107.03576
Args:
backbone (object): backbone instance
classifier (object): classifier instance
loss (object): loss instance
"""
super
(
StrongBaselinePAR
,
self
).
__init__
()
backbone_config
=
config
[
"Backbone"
]
backbone_name
=
backbone_config
.
pop
(
"name"
)
self
.
backbone
=
eval
(
backbone_name
)(
**
backbone_config
)
def
forward
(
self
,
x
):
fc_feat
=
self
.
backbone
(
x
)
output
=
F
.
sigmoid
(
fc_feat
)
return
fc_feat
def
_load_pretrained
(
pretrained
,
model
,
model_url
,
use_ssld
):
if
pretrained
is
False
:
pass
elif
pretrained
is
True
:
load_dygraph_pretrain_from_url
(
model
,
model_url
,
use_ssld
=
use_ssld
)
elif
isinstance
(
pretrained
,
str
):
load_dygraph_pretrain
(
model
,
pretrained
)
else
:
raise
RuntimeError
(
"pretrained type is not available. Please use `string` or `boolean` type."
)
def
load_pretrained
(
model
,
local_weight_path
):
# local_weight_path = get_weights_path_from_url(model_url).replace(
# ".pdparams", "")
param_state_dict
=
paddle
.
load
(
local_weight_path
+
".pdparams"
)
model_dict
=
model
.
state_dict
()
model_dict_keys
=
list
(
model_dict
.
keys
())
param_state_dict_keys
=
list
(
param_state_dict
.
keys
())
# assert(len(model_dict_keys) == len(param_state_dict_keys)), "{} == {}".format(len(model_dict_keys), len(param_state_dict_keys))
for
idx
in
range
(
len
(
model_dict
.
keys
())):
model_key
=
model_dict_keys
[
idx
]
param_key
=
param_state_dict_keys
[
idx
]
if
model_dict
[
model_key
].
shape
==
param_state_dict
[
param_key
].
shape
:
model_dict
[
model_key
]
=
param_state_dict
[
param_key
]
else
:
print
(
"miss match idx: {} weights: {} vs {}; {} vs {}"
.
format
(
idx
,
model_key
,
param_key
,
model_dict
[
model_key
].
shape
,
param_state_dict
[
param_key
].
shape
))
model
.
set_dict
(
model_dict
)
def
StrongBaselineAttr
(
pretrained
=
True
,
use_ssld
=
False
,
**
kwargs
):
model
=
StrongBaselinePAR
(
**
kwargs
)
_load_pretrained
(
MODEL_URLS
[
"StrongBaselineAttr"
],
model
,
None
,
None
)
# load_pretrained(model, MODEL_URLS["StrongBaselineAttr"])
return
model
ppcls/configs/Attr/StrongBaselineAttr.yaml
浏览文件 @
50900443
...
@@ -17,10 +17,10 @@ Global:
...
@@ -17,10 +17,10 @@ Global:
# model architecture
# model architecture
Arch
:
Arch
:
name
:
"
StrongBaselineAttr
"
name
:
"
ResNet50
"
Backbone
:
pretrained
:
True
name
:
"
ResNet50"
class_num
:
26
class_num
:
26
norm_decay
:
0.0005
# loss function config for traing/eval process
# loss function config for traing/eval process
Loss
:
Loss
:
...
@@ -60,7 +60,7 @@ DataLoader:
...
@@ -60,7 +60,7 @@ DataLoader:
channel_first
:
False
channel_first
:
False
-
ResizeImage
:
-
ResizeImage
:
size
:
[
192
,
256
]
size
:
[
192
,
256
]
-
Pad
:
-
Pad
v2
:
size
:
[
212
,
276
]
size
:
[
212
,
276
]
pad_mode
:
1
pad_mode
:
1
fill_value
:
0
fill_value
:
0
...
...
ppcls/data/preprocess/__init__.py
浏览文件 @
50900443
...
@@ -34,6 +34,7 @@ from ppcls.data.preprocess.ops.operators import Pad
...
@@ -34,6 +34,7 @@ from ppcls.data.preprocess.ops.operators import Pad
from
ppcls.data.preprocess.ops.operators
import
ToTensor
from
ppcls.data.preprocess.ops.operators
import
ToTensor
from
ppcls.data.preprocess.ops.operators
import
Normalize
from
ppcls.data.preprocess.ops.operators
import
Normalize
from
ppcls.data.preprocess.ops.operators
import
RandomCropImage
from
ppcls.data.preprocess.ops.operators
import
RandomCropImage
from
ppcls.data.preprocess.ops.operators
import
Padv2
from
ppcls.data.preprocess.batch_ops.batch_operators
import
MixupOperator
,
CutmixOperator
,
OpSampler
,
FmixOperator
from
ppcls.data.preprocess.batch_ops.batch_operators
import
MixupOperator
,
CutmixOperator
,
OpSampler
,
FmixOperator
...
...
ppcls/data/preprocess/ops/operators.py
浏览文件 @
50900443
...
@@ -190,7 +190,7 @@ class CropImage(object):
...
@@ -190,7 +190,7 @@ class CropImage(object):
return
img
[
h_start
:
h_end
,
w_start
:
w_end
,
:]
return
img
[
h_start
:
h_end
,
w_start
:
w_end
,
:]
class
Pad
(
object
):
class
Pad
v2
(
object
):
def
__init__
(
self
,
def
__init__
(
self
,
size
=
None
,
size
=
None
,
size_divisor
=
32
,
size_divisor
=
32
,
...
...
ppcls/engine/evaluation/classification.py
浏览文件 @
50900443
...
@@ -32,8 +32,8 @@ def classification_eval(engine, epoch_id=0):
...
@@ -32,8 +32,8 @@ def classification_eval(engine, epoch_id=0):
}
}
print_batch_step
=
engine
.
config
[
"Global"
][
"print_batch_step"
]
print_batch_step
=
engine
.
config
[
"Global"
][
"print_batch_step"
]
if
engine
.
eval_metric_func
is
not
None
and
engine
.
config
[
"Arch"
]
[
if
engine
.
eval_metric_func
is
not
None
and
"ATTRMetric"
in
engine
.
config
[
"
name"
]
==
"StrongBaselineAttr"
:
"
Metric"
][
"Eval"
][
0
]
:
output_info
[
"attr"
]
=
AttrMeter
(
threshold
=
0.5
)
output_info
[
"attr"
]
=
AttrMeter
(
threshold
=
0.5
)
metric_key
=
None
metric_key
=
None
...
@@ -128,7 +128,7 @@ def classification_eval(engine, epoch_id=0):
...
@@ -128,7 +128,7 @@ def classification_eval(engine, epoch_id=0):
# calc metric
# calc metric
if
engine
.
eval_metric_func
is
not
None
:
if
engine
.
eval_metric_func
is
not
None
:
if
engine
.
config
[
"Arch"
][
"name"
]
==
"StrongBaselineAttr"
:
if
"ATTRMetric"
in
engine
.
config
[
"Metric"
][
"Eval"
][
0
]
:
metric_dict
=
engine
.
eval_metric_func
(
preds
,
labels
)
metric_dict
=
engine
.
eval_metric_func
(
preds
,
labels
)
metric_key
=
"attr"
metric_key
=
"attr"
output_info
[
"attr"
].
update
(
metric_dict
)
output_info
[
"attr"
].
update
(
metric_dict
)
...
@@ -153,7 +153,7 @@ def classification_eval(engine, epoch_id=0):
...
@@ -153,7 +153,7 @@ def classification_eval(engine, epoch_id=0):
ips_msg
=
"ips: {:.5f} images/sec"
.
format
(
ips_msg
=
"ips: {:.5f} images/sec"
.
format
(
batch_size
/
time_info
[
"batch_cost"
].
avg
)
batch_size
/
time_info
[
"batch_cost"
].
avg
)
if
engine
.
config
[
"Arch"
][
"name"
]
==
"StrongBaselineAttr"
:
if
"ATTRMetric"
in
engine
.
config
[
"Metric"
][
"Eval"
][
0
]
:
metric_msg
=
""
metric_msg
=
""
else
:
else
:
metric_msg
=
", "
.
join
([
metric_msg
=
", "
.
join
([
...
@@ -168,7 +168,7 @@ def classification_eval(engine, epoch_id=0):
...
@@ -168,7 +168,7 @@ def classification_eval(engine, epoch_id=0):
if
engine
.
use_dali
:
if
engine
.
use_dali
:
engine
.
eval_dataloader
.
reset
()
engine
.
eval_dataloader
.
reset
()
if
engine
.
config
[
"Arch"
][
"name"
]
==
"StrongBaselineAttr"
:
if
"ATTRMetric"
in
engine
.
config
[
"Metric"
][
"Eval"
][
0
]
:
metric_msg
=
", "
.
join
([
metric_msg
=
", "
.
join
([
"evalres: ma: {:.5f} label_f1: {:.5f} label_pos_recall: {:.5f} label_neg_recall: {:.5f} instance_f1: {:.5f} instance_acc: {:.5f} instance_prec: {:.5f} instance_recall: {:.5f}"
.
"evalres: ma: {:.5f} label_f1: {:.5f} label_pos_recall: {:.5f} label_neg_recall: {:.5f} instance_f1: {:.5f} instance_acc: {:.5f} instance_prec: {:.5f} instance_recall: {:.5f}"
.
format
(
*
output_info
[
"attr"
].
res
())
format
(
*
output_info
[
"attr"
].
res
())
...
...
ppcls/metric/metrics.py
浏览文件 @
50900443
...
@@ -362,7 +362,7 @@ class ATTRMetric(nn.Layer):
...
@@ -362,7 +362,7 @@ class ATTRMetric(nn.Layer):
super
().
__init__
()
super
().
__init__
()
self
.
threshold
=
threshold
self
.
threshold
=
threshold
def
__call__
(
self
,
output
,
target
):
def
forward
(
self
,
output
,
target
):
metric_dict
=
get_attr_metrics
(
target
[
0
].
numpy
(),
metric_dict
=
get_attr_metrics
(
target
[
0
].
numpy
(),
output
.
numpy
(),
self
.
threshold
)
output
.
numpy
(),
self
.
threshold
)
return
metric_dict
return
metric_dict
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录