Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleSeg
提交
f7e5320e
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看板
提交
f7e5320e
编写于
9月 23, 2020
作者:
C
chenguowei01
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'develop' of
https://github.com/PaddlePaddle/PaddleSeg
into dygraph
上级
70c0212a
53f1d1e4
变更
7
显示空白变更内容
内联
并排
Showing
7 changed file
with
218 addition
and
119 deletion
+218
-119
dygraph/configs/_base_/cityscapes.yml
dygraph/configs/_base_/cityscapes.yml
+0
-1
dygraph/configs/_base_/optic_disc_seg.yml
dygraph/configs/_base_/optic_disc_seg.yml
+0
-1
dygraph/paddleseg/models/ann.py
dygraph/paddleseg/models/ann.py
+66
-29
dygraph/paddleseg/models/deeplab.py
dygraph/paddleseg/models/deeplab.py
+7
-7
dygraph/paddleseg/models/fast_scnn.py
dygraph/paddleseg/models/fast_scnn.py
+22
-26
dygraph/paddleseg/models/gcnet.py
dygraph/paddleseg/models/gcnet.py
+60
-27
dygraph/paddleseg/models/pspnet.py
dygraph/paddleseg/models/pspnet.py
+63
-28
未找到文件。
dygraph/configs/_base_/cityscapes.yml
浏览文件 @
f7e5320e
batch_size
:
4
iters
:
100000
learning_rate
:
0.01
train_dataset
:
type
:
Cityscapes
...
...
dygraph/configs/_base_/optic_disc_seg.yml
浏览文件 @
f7e5320e
batch_size
:
4
iters
:
10000
learning_rate
:
0.01
train_dataset
:
type
:
OpticDiscSeg
...
...
dygraph/paddleseg/models/ann.py
浏览文件 @
f7e5320e
...
...
@@ -19,7 +19,7 @@ import paddle.nn.functional as F
from
paddle
import
nn
from
paddleseg.cvlibs
import
manager
from
paddleseg.models.common
import
layer_libs
from
paddleseg.models.common
.layer_libs
import
ConvBNReLU
,
ConvBN
,
AuxLayer
from
paddleseg.utils
import
utils
...
...
@@ -32,11 +32,62 @@ class ANN(nn.Layer):
Zhen, Zhu, et al. "Asymmetric Non-local Neural Networks for Semantic Segmentation."
(https://arxiv.org/pdf/1908.07678.pdf)
Args:
num_classes (int): the unique number of target classes.
backbone (Paddle.nn.Layer): backbone network, currently support Resnet50/101.
model_pretrained (str): the path of pretrained model. Default to None.
backbone_indices (tuple): two values in the tuple indicate the indices of output of backbone.
key_value_channels (int): the key and value channels of self-attention map in both AFNB and APNB modules.
Default to 256.
inter_channels (int): both input and output channels of APNB modules.
psp_size (tuple): the out size of pooled feature maps. Default to (1, 3, 6, 8).
enable_auxiliary_loss (bool): a bool values indicates whether adding auxiliary loss. Default to True.
pretrained (str): the path of pretrained model. Default to None.
"""
def
__init__
(
self
,
num_classes
,
backbone
,
backbone_indices
=
(
2
,
3
),
key_value_channels
=
256
,
inter_channels
=
512
,
psp_size
=
(
1
,
3
,
6
,
8
),
enable_auxiliary_loss
=
True
,
pretrained
=
None
,):
super
(
ANN
,
self
).
__init__
()
self
.
backbone
=
backbone
backbone_channels
=
[
backbone
.
feat_channels
[
i
]
for
i
in
backbone_indices
]
self
.
head
=
ANNHead
(
num_classes
,
backbone_indices
,
backbone_channels
,
key_value_channels
,
inter_channels
,
psp_size
,
enable_auxiliary_loss
)
utils
.
load_entire_model
(
self
,
pretrained
)
def
forward
(
self
,
input
):
feat_list
=
self
.
backbone
(
input
)
logit_list
=
self
.
head
(
feat_list
)
return
[
F
.
resize_bilinear
(
logit
,
input
.
shape
[
2
:])
for
logit
in
logit_list
]
class
ANNHead
(
nn
.
Layer
):
"""
The ANNHead implementation.
It mainly consists of AFNB and APNB modules.
Args:
num_classes (int): the unique number of target classes.
backbone (Paddle.nn.Layer): backbone network, currently support Resnet50/101.
model_pretrained (str): the path of pretrained model. Default to None.
backbone_indices (tuple): two values in the tuple indicate the indices of output of backbone.
the first index will be taken as low-level features; the second one will be
...
...
@@ -53,17 +104,13 @@ class ANN(nn.Layer):
def
__init__
(
self
,
num_classes
,
backbone
,
model_pretrained
=
None
,
backbone_indices
=
(
2
,
3
),
backbone_channels
=
(
1024
,
2048
),
key_value_channels
=
256
,
inter_channels
=
512
,
psp_size
=
(
1
,
3
,
6
,
8
),
enable_auxiliary_loss
=
True
):
super
(
ANN
,
self
).
__init__
()
self
.
backbone
=
backbone
super
(
ANNHead
,
self
).
__init__
()
low_in_channels
=
backbone_channels
[
0
]
high_in_channels
=
backbone_channels
[
1
]
...
...
@@ -79,7 +126,7 @@ class ANN(nn.Layer):
psp_size
=
psp_size
)
self
.
context
=
nn
.
Sequential
(
layer_libs
.
ConvBNReLU
(
ConvBNReLU
(
in_channels
=
high_in_channels
,
out_channels
=
inter_channels
,
kernel_size
=
3
,
...
...
@@ -95,7 +142,7 @@ class ANN(nn.Layer):
self
.
cls
=
nn
.
Conv2d
(
in_channels
=
inter_channels
,
out_channels
=
num_classes
,
kernel_size
=
1
)
self
.
auxlayer
=
layer_libs
.
AuxLayer
(
self
.
auxlayer
=
AuxLayer
(
in_channels
=
low_in_channels
,
inter_channels
=
low_in_channels
//
2
,
out_channels
=
num_classes
,
...
...
@@ -104,39 +151,29 @@ class ANN(nn.Layer):
self
.
backbone_indices
=
backbone_indices
self
.
enable_auxiliary_loss
=
enable_auxiliary_loss
self
.
init_weight
(
model_pretrained
)
self
.
init_weight
()
def
forward
(
self
,
input
,
label
=
None
):
def
forward
(
self
,
feat_list
):
logit_list
=
[]
_
,
feat_list
=
self
.
backbone
(
input
)
low_level_x
=
feat_list
[
self
.
backbone_indices
[
0
]]
high_level_x
=
feat_list
[
self
.
backbone_indices
[
1
]]
x
=
self
.
fusion
(
low_level_x
,
high_level_x
)
x
=
self
.
context
(
x
)
logit
=
self
.
cls
(
x
)
logit
=
F
.
resize_bilinear
(
logit
,
input
.
shape
[
2
:])
logit_list
.
append
(
logit
)
if
self
.
enable_auxiliary_loss
:
auxiliary_logit
=
self
.
auxlayer
(
low_level_x
)
auxiliary_logit
=
F
.
resize_bilinear
(
auxiliary_logit
,
input
.
shape
[
2
:])
logit_list
.
append
(
auxiliary_logit
)
return
logit_list
def
init_weight
(
self
,
pretrained_model
=
None
):
def
init_weight
(
self
):
"""
Initialize the parameters of model parts.
Args:
pretrained_model ([str], optional): the pretrained_model path of backbone. Defaults to None.
"""
if
pretrained_model
is
not
None
:
if
os
.
path
.
exists
(
pretrained_model
):
utils
.
load_pretrained_model
(
self
.
backbone
,
pretrained_model
)
pass
class
AFNB
(
nn
.
Layer
):
...
...
@@ -171,7 +208,7 @@ class AFNB(nn.Layer):
key_channels
,
value_channels
,
out_channels
,
size
)
for
size
in
sizes
])
self
.
conv_bn
=
layer_libs
.
ConvBn
(
self
.
conv_bn
=
ConvBN
(
in_channels
=
out_channels
+
high_in_channels
,
out_channels
=
out_channels
,
kernel_size
=
1
)
...
...
@@ -218,7 +255,7 @@ class APNB(nn.Layer):
SelfAttentionBlock_APNB
(
in_channels
,
out_channels
,
key_channels
,
value_channels
,
size
)
for
size
in
sizes
])
self
.
conv_bn
=
layer_libs
.
ConvBNReLU
(
self
.
conv_bn
=
ConvBNReLU
(
in_channels
=
in_channels
*
2
,
out_channels
=
out_channels
,
kernel_size
=
1
)
...
...
@@ -279,11 +316,11 @@ class SelfAttentionBlock_AFNB(nn.Layer):
if
out_channels
==
None
:
self
.
out_channels
=
high_in_channels
self
.
pool
=
nn
.
Pool2D
(
pool_size
=
(
scale
,
scale
),
pool_type
=
"max"
)
self
.
f_key
=
layer_libs
.
ConvBNReLU
(
self
.
f_key
=
ConvBNReLU
(
in_channels
=
low_in_channels
,
out_channels
=
key_channels
,
kernel_size
=
1
)
self
.
f_query
=
layer_libs
.
ConvBNReLU
(
self
.
f_query
=
ConvBNReLU
(
in_channels
=
high_in_channels
,
out_channels
=
key_channels
,
kernel_size
=
1
)
...
...
@@ -357,7 +394,7 @@ class SelfAttentionBlock_APNB(nn.Layer):
self
.
value_channels
=
value_channels
self
.
pool
=
nn
.
Pool2D
(
pool_size
=
(
scale
,
scale
),
pool_type
=
"max"
)
self
.
f_key
=
layer_libs
.
ConvBNReLU
(
self
.
f_key
=
ConvBNReLU
(
in_channels
=
self
.
in_channels
,
out_channels
=
self
.
key_channels
,
kernel_size
=
1
)
...
...
dygraph/paddleseg/models/deeplab.py
浏览文件 @
f7e5320e
...
...
@@ -18,7 +18,8 @@ import paddle
import
paddle.nn.functional
as
F
from
paddle
import
nn
from
paddleseg.cvlibs
import
manager
from
paddleseg.models.common
import
pyramid_pool
,
layer_libs
from
paddleseg.models.common
import
pyramid_pool
from
paddleseg.models.common.layer_libs
import
ConvBNReLU
,
DepthwiseConvBNReLU
,
AuxLayer
from
paddleseg.utils
import
utils
__all__
=
[
'DeepLabV3P'
,
'DeepLabV3'
]
...
...
@@ -47,8 +48,7 @@ class DeepLabV3P(nn.Layer):
if output_stride=16, aspp_ratios should be set as (1, 6, 12, 18).
if output_stride=8, aspp_ratios is (1, 12, 24, 36).
aspp_out_channels (int): the output channels of ASPP module.
pretrained (str): the path of pretrained model for fine tuning.
pretrained (str): the path of pretrained model. Default to None.
"""
def
__init__
(
self
,
...
...
@@ -94,7 +94,7 @@ class DeepLabV3PHead(nn.Layer):
each stage, so we set default (0, 3), which means taking feature map of the first
stage in backbone as low-level feature used in Decoder, and feature map of the fourth
stage as input of ASPP.
backbone_channels (tuple):
returned channels of backbone
backbone_channels (tuple):
the same length with "backbone_indices". It indicates the channels of corresponding index.
aspp_ratios (tuple): the dilation rate using in ASSP module.
if output_stride=16, aspp_ratios should be set as (1, 6, 12, 18).
if output_stride=8, aspp_ratios is (1, 12, 24, 36).
...
...
@@ -231,12 +231,12 @@ class Decoder(nn.Layer):
def
__init__
(
self
,
num_classes
,
in_channels
):
super
(
Decoder
,
self
).
__init__
()
self
.
conv_bn_relu1
=
layer_libs
.
ConvBNReLU
(
self
.
conv_bn_relu1
=
ConvBNReLU
(
in_channels
=
in_channels
,
out_channels
=
48
,
kernel_size
=
1
)
self
.
conv_bn_relu2
=
layer_libs
.
DepthwiseConvBNReLU
(
self
.
conv_bn_relu2
=
DepthwiseConvBNReLU
(
in_channels
=
304
,
out_channels
=
256
,
kernel_size
=
3
,
padding
=
1
)
self
.
conv_bn_relu3
=
layer_libs
.
DepthwiseConvBNReLU
(
self
.
conv_bn_relu3
=
DepthwiseConvBNReLU
(
in_channels
=
256
,
out_channels
=
256
,
kernel_size
=
3
,
padding
=
1
)
self
.
conv
=
nn
.
Conv2d
(
in_channels
=
256
,
out_channels
=
num_classes
,
kernel_size
=
1
)
...
...
dygraph/paddleseg/models/fast_scnn.py
浏览文件 @
f7e5320e
...
...
@@ -14,9 +14,11 @@
import
paddle.nn.functional
as
F
from
paddle
import
nn
from
paddleseg.cvlibs
import
manager
from
paddleseg.models.common
import
layer_libs
,
pyramid_pool
from
paddleseg.cvlibs
import
manager
from
paddleseg.models.common
import
pyramid_pool
from
paddleseg.models.common.layer_libs
import
ConvBNReLU
,
DepthwiseConvBNReLU
,
AuxLayer
from
paddleseg.utils
import
utils
@
manager
.
MODELS
.
add_component
class
FastSCNN
(
nn
.
Layer
):
...
...
@@ -33,15 +35,15 @@ class FastSCNN(nn.Layer):
Args:
num_classes (int): the unique number of target classes. Default to 2.
model_pretrained (str): the path of pretrained model. Default to None.
enable_auxiliary_loss (bool): a bool values indicates whether adding auxiliary loss.
if true, auxiliary loss will be added after LearningToDownsample module, where the weight is 0.4. Default to False.
pretrained (str): the path of pretrained model. Default to None.
"""
def
__init__
(
self
,
num_classes
,
model_pretrained
=
Non
e
,
enable_auxiliary_loss
=
Tru
e
):
enable_auxiliary_loss
=
Tru
e
,
pretrained
=
Non
e
):
super
(
FastSCNN
,
self
).
__init__
()
...
...
@@ -52,11 +54,12 @@ class FastSCNN(nn.Layer):
self
.
classifier
=
Classifier
(
128
,
num_classes
)
if
enable_auxiliary_loss
:
self
.
auxlayer
=
layer_libs
.
AuxLayer
(
64
,
32
,
num_classes
)
self
.
auxlayer
=
AuxLayer
(
64
,
32
,
num_classes
)
self
.
enable_auxiliary_loss
=
enable_auxiliary_loss
self
.
init_weight
(
model_pretrained
)
self
.
init_weight
()
utils
.
load_entire_model
(
self
,
pretrained
)
def
forward
(
self
,
input
,
label
=
None
):
...
...
@@ -76,18 +79,11 @@ class FastSCNN(nn.Layer):
return
logit_list
def
init_weight
(
self
,
pretrained_model
=
None
):
def
init_weight
(
self
):
"""
Initialize the parameters of model parts.
Args:
pretrained_model ([str], optional): the path of pretrained model. Defaults to None.
"""
if
pretrained_model
is
not
None
:
if
os
.
path
.
exists
(
pretrained_model
):
utils
.
load_pretrained_model
(
self
,
pretrained_model
)
else
:
raise
Exception
(
'Pretrained model is not found: {}'
.
format
(
pretrained_model
))
pass
class
LearningToDownsample
(
nn
.
Layer
):
...
...
@@ -105,15 +101,15 @@ class LearningToDownsample(nn.Layer):
def
__init__
(
self
,
dw_channels1
=
32
,
dw_channels2
=
48
,
out_channels
=
64
):
super
(
LearningToDownsample
,
self
).
__init__
()
self
.
conv_bn_relu
=
layer_libs
.
ConvBNReLU
(
self
.
conv_bn_relu
=
ConvBNReLU
(
in_channels
=
3
,
out_channels
=
dw_channels1
,
kernel_size
=
3
,
stride
=
2
)
self
.
dsconv_bn_relu1
=
layer_libs
.
DepthwiseConvBNReLU
(
self
.
dsconv_bn_relu1
=
DepthwiseConvBNReLU
(
in_channels
=
dw_channels1
,
out_channels
=
dw_channels2
,
kernel_size
=
3
,
stride
=
2
,
padding
=
1
)
self
.
dsconv_bn_relu2
=
layer_libs
.
DepthwiseConvBNReLU
(
self
.
dsconv_bn_relu2
=
DepthwiseConvBNReLU
(
in_channels
=
dw_channels2
,
out_channels
=
out_channels
,
kernel_size
=
3
,
...
...
@@ -208,13 +204,13 @@ class LinearBottleneck(nn.Layer):
expand_channels
=
in_channels
*
expansion
self
.
block
=
nn
.
Sequential
(
# pw
layer_libs
.
ConvBNReLU
(
ConvBNReLU
(
in_channels
=
in_channels
,
out_channels
=
expand_channels
,
kernel_size
=
1
,
bias_attr
=
False
),
# dw
layer_libs
.
ConvBNReLU
(
ConvBNReLU
(
in_channels
=
expand_channels
,
out_channels
=
expand_channels
,
kernel_size
=
3
,
...
...
@@ -253,7 +249,7 @@ class FeatureFusionModule(nn.Layer):
super
(
FeatureFusionModule
,
self
).
__init__
()
# There only depth-wise conv is used WITHOUT point-wise conv
self
.
dwconv
=
layer_libs
.
ConvBNReLU
(
self
.
dwconv
=
ConvBNReLU
(
in_channels
=
low_in_channels
,
out_channels
=
out_channels
,
kernel_size
=
3
,
...
...
@@ -289,9 +285,9 @@ class FeatureFusionModule(nn.Layer):
class
Classifier
(
nn
.
Layer
):
"""
The Classifier module implemetation.
The Classifier module impleme
n
tation.
This module consists of two depth-w
si
e conv and one conv.
This module consists of two depth-w
is
e conv and one conv.
Args:
input_channels (int): the input channels to this module.
...
...
@@ -301,13 +297,13 @@ class Classifier(nn.Layer):
def
__init__
(
self
,
input_channels
,
num_classes
):
super
(
Classifier
,
self
).
__init__
()
self
.
dsconv1
=
layer_libs
.
DepthwiseConvBNReLU
(
self
.
dsconv1
=
DepthwiseConvBNReLU
(
in_channels
=
input_channels
,
out_channels
=
input_channels
,
kernel_size
=
3
,
padding
=
1
)
self
.
dsconv2
=
layer_libs
.
DepthwiseConvBNReLU
(
self
.
dsconv2
=
DepthwiseConvBNReLU
(
in_channels
=
input_channels
,
out_channels
=
input_channels
,
kernel_size
=
3
,
...
...
dygraph/paddleseg/models/gcnet.py
浏览文件 @
f7e5320e
...
...
@@ -18,10 +18,12 @@ import paddle
import
paddle.nn.functional
as
F
from
paddle
import
nn
from
paddleseg.cvlibs
import
manager
from
paddleseg.models.common
import
layer_libs
from
paddleseg.models.common
.layer_libs
import
ConvBNReLU
,
AuxLayer
from
paddleseg.utils
import
utils
@
manager
.
MODELS
.
add_component
class
GCNet
(
nn
.
Layer
):
"""
...
...
@@ -34,7 +36,54 @@ class GCNet(nn.Layer):
Args:
num_classes (int): the unique number of target classes.
backbone (Paddle.nn.Layer): backbone network, currently support Resnet50/101.
model_pretrained (str): the path of pretrained model. Default to None.
backbone_indices (tuple): two values in the tuple indicate the indices of output of backbone.
gc_channels (int): input channels to Global Context Block. Default to 512.
ratio (float): it indicates the ratio of attention channels and gc_channels. Default to 1/4.
enable_auxiliary_loss (bool): a bool values indicates whether adding auxiliary loss. Default to True.
pretrained (str): the path of pretrained model. Default to None.
"""
def
__init__
(
self
,
num_classes
,
backbone
,
backbone_indices
=
(
2
,
3
),
gc_channels
=
512
,
ratio
=
1
/
4
,
enable_auxiliary_loss
=
True
,
pretrained
=
None
):
super
(
GCNet
,
self
).
__init__
()
self
.
backbone
=
backbone
backbone_channels
=
[
backbone
.
feat_channels
[
i
]
for
i
in
backbone_indices
]
self
.
head
=
GCNetHead
(
num_classes
,
backbone_indices
,
backbone_channels
,
gc_channels
,
ratio
,
enable_auxiliary_loss
)
utils
.
load_entire_model
(
self
,
pretrained
)
def
forward
(
self
,
input
):
feat_list
=
self
.
backbone
(
input
)
logit_list
=
self
.
head
(
feat_list
)
return
[
F
.
resize_bilinear
(
logit
,
input
.
shape
[
2
:])
for
logit
in
logit_list
]
class
GCNetHead
(
nn
.
Layer
):
"""
The GCNetHead implementation.
Args:
num_classes (int): the unique number of target classes.
backbone_indices (tuple): two values in the tuple indicate the indices of output of backbone.
the first index will be taken as a deep-supervision feature in auxiliary layer;
the second one will be taken as input of GlobalContextBlock. Usually backbone
...
...
@@ -49,21 +98,16 @@ class GCNet(nn.Layer):
def
__init__
(
self
,
num_classes
,
backbone
,
model_pretrained
=
None
,
backbone_indices
=
(
2
,
3
),
backbone_channels
=
(
1024
,
2048
),
gc_channels
=
512
,
ratio
=
1
/
4
,
enable_auxiliary_loss
=
True
,
pretrained_model
=
None
):
enable_auxiliary_loss
=
True
):
super
(
GCNet
,
self
).
__init__
()
self
.
backbone
=
backbone
super
(
GCNetHead
,
self
).
__init__
()
in_channels
=
backbone_channels
[
1
]
self
.
conv_bn_relu1
=
layer_libs
.
ConvBNReLU
(
self
.
conv_bn_relu1
=
ConvBNReLU
(
in_channels
=
in_channels
,
out_channels
=
gc_channels
,
kernel_size
=
3
,
...
...
@@ -71,13 +115,13 @@ class GCNet(nn.Layer):
self
.
gc_block
=
GlobalContextBlock
(
in_channels
=
gc_channels
,
ratio
=
ratio
)
self
.
conv_bn_relu2
=
layer_libs
.
ConvBNReLU
(
self
.
conv_bn_relu2
=
ConvBNReLU
(
in_channels
=
gc_channels
,
out_channels
=
gc_channels
,
kernel_size
=
3
,
padding
=
1
)
self
.
conv_bn_relu3
=
layer_libs
.
ConvBNReLU
(
self
.
conv_bn_relu3
=
ConvBNReLU
(
in_channels
=
in_channels
+
gc_channels
,
out_channels
=
gc_channels
,
kernel_size
=
3
,
...
...
@@ -87,7 +131,7 @@ class GCNet(nn.Layer):
in_channels
=
gc_channels
,
out_channels
=
num_classes
,
kernel_size
=
1
)
if
enable_auxiliary_loss
:
self
.
auxlayer
=
layer_libs
.
AuxLayer
(
self
.
auxlayer
=
AuxLayer
(
in_channels
=
backbone_channels
[
0
],
inter_channels
=
backbone_channels
[
0
]
//
4
,
out_channels
=
num_classes
)
...
...
@@ -95,12 +139,11 @@ class GCNet(nn.Layer):
self
.
backbone_indices
=
backbone_indices
self
.
enable_auxiliary_loss
=
enable_auxiliary_loss
self
.
init_weight
(
model_pretrained
)
self
.
init_weight
()
def
forward
(
self
,
input
,
label
=
None
):
def
forward
(
self
,
feat_list
):
logit_list
=
[]
_
,
feat_list
=
self
.
backbone
(
input
)
x
=
feat_list
[
self
.
backbone_indices
[
1
]]
output
=
self
.
conv_bn_relu1
(
x
)
...
...
@@ -112,14 +155,11 @@ class GCNet(nn.Layer):
output
=
F
.
dropout
(
output
,
p
=
0.1
)
# dropout_prob
logit
=
self
.
conv
(
output
)
logit
=
F
.
resize_bilinear
(
logit
,
input
.
shape
[
2
:])
logit_list
.
append
(
logit
)
if
self
.
enable_auxiliary_loss
:
low_level_feat
=
feat_list
[
self
.
backbone_indices
[
0
]]
auxiliary_logit
=
self
.
auxlayer
(
low_level_feat
)
auxiliary_logit
=
F
.
resize_bilinear
(
auxiliary_logit
,
input
.
shape
[
2
:])
logit_list
.
append
(
auxiliary_logit
)
return
logit_list
...
...
@@ -127,15 +167,8 @@ class GCNet(nn.Layer):
def
init_weight
(
self
,
pretrained_model
=
None
):
"""
Initialize the parameters of model parts.
Args:
pretrained_model ([str], optional): the path of pretrained model. Defaults to None.
"""
if
pretrained_model
is
not
None
:
if
os
.
path
.
exists
(
pretrained_model
):
utils
.
load_pretrained_model
(
self
,
pretrained_model
)
else
:
raise
Exception
(
'Pretrained model is not found: {}'
.
format
(
pretrained_model
))
pass
class
GlobalContextBlock
(
nn
.
Layer
):
...
...
dygraph/paddleseg/models/pspnet.py
浏览文件 @
f7e5320e
...
...
@@ -17,7 +17,8 @@ import os
import
paddle.nn.functional
as
F
from
paddle
import
nn
from
paddleseg.cvlibs
import
manager
from
paddleseg.models.common
import
layer_libs
,
pyramid_pool
from
paddleseg.models.common
import
pyramid_pool
from
paddleseg.models.common.layer_libs
import
ConvBNReLU
,
AuxLayer
from
paddleseg.utils
import
utils
...
...
@@ -35,6 +36,54 @@ class PSPNet(nn.Layer):
num_classes (int): the unique number of target classes.
backbone (Paddle.nn.Layer): backbone network, currently support Resnet50/101.
model_pretrained (str): the path of pretrained model. Default to None.
backbone_indices (tuple): two values in the tuple indicate the indices of output of backbone.
pp_out_channels (int): output channels after Pyramid Pooling Module. Default to 1024.
bin_sizes (tuple): the out size of pooled feature maps. Default to (1,2,3,6).
enable_auxiliary_loss (bool): a bool values indicates whether adding auxiliary loss. Default to True.
pretrained (str): the path of pretrained model. Default to None.
"""
def
__init__
(
self
,
num_classes
,
backbone
,
backbone_indices
=
(
2
,
3
),
pp_out_channels
=
1024
,
bin_sizes
=
(
1
,
2
,
3
,
6
),
enable_auxiliary_loss
=
True
,
pretrained
=
None
):
super
(
PSPNet
,
self
).
__init__
()
self
.
backbone
=
backbone
backbone_channels
=
[
backbone
.
feat_channels
[
i
]
for
i
in
backbone_indices
]
self
.
head
=
PSPNetHead
(
num_classes
,
backbone_indices
,
backbone_channels
,
pp_out_channels
,
bin_sizes
,
enable_auxiliary_loss
)
utils
.
load_entire_model
(
self
,
pretrained
)
def
forward
(
self
,
input
):
feat_list
=
self
.
backbone
(
input
)
logit_list
=
self
.
head
(
feat_list
)
return
[
F
.
resize_bilinear
(
logit
,
input
.
shape
[
2
:])
for
logit
in
logit_list
]
class
PSPNetHead
(
nn
.
Layer
):
"""
The PSPNetHead implementation.
Args:
num_classes (int): the unique number of target classes.
backbone_indices (tuple): two values in the tuple indicate the indices of output of backbone.
the first index will be taken as a deep-supervision feature in auxiliary layer;
the second one will be taken as input of Pyramid Pooling Module (PPModule).
...
...
@@ -49,17 +98,14 @@ class PSPNet(nn.Layer):
def
__init__
(
self
,
num_classes
,
backbone
,
model_pretrained
=
None
,
backbone_indices
=
(
2
,
3
),
backbone_channels
=
(
1024
,
2048
),
pp_out_channels
=
1024
,
bin_sizes
=
(
1
,
2
,
3
,
6
),
enable_auxiliary_loss
=
True
):
super
(
PSPNet
,
self
).
__init__
()
super
(
PSPNet
Head
,
self
).
__init__
()
self
.
backbone
=
backbone
self
.
backbone_indices
=
backbone_indices
self
.
psp_module
=
pyramid_pool
.
PPModule
(
...
...
@@ -74,32 +120,28 @@ class PSPNet(nn.Layer):
if
enable_auxiliary_loss
:
self
.
auxlayer
=
layer_libs
.
AuxLayer
(
self
.
auxlayer
=
AuxLayer
(
in_channels
=
backbone_channels
[
0
],
inter_channels
=
backbone_channels
[
0
]
//
4
,
out_channels
=
num_classes
)
self
.
enable_auxiliary_loss
=
enable_auxiliary_loss
self
.
init_weight
(
model_pretrained
)
self
.
init_weight
()
def
forward
(
self
,
input
,
label
=
None
):
def
forward
(
self
,
feat_list
):
logit_list
=
[]
_
,
feat_list
=
self
.
backbone
(
input
)
x
=
feat_list
[
self
.
backbone_indices
[
1
]]
x
=
self
.
psp_module
(
x
)
x
=
F
.
dropout
(
x
,
p
=
0.1
)
# dropout_prob
logit
=
self
.
conv
(
x
)
logit
=
F
.
resize_bilinear
(
logit
,
input
.
shape
[
2
:])
logit_list
.
append
(
logit
)
if
self
.
enable_auxiliary_loss
:
auxiliary_feat
=
feat_list
[
self
.
backbone_indices
[
0
]]
auxiliary_logit
=
self
.
auxlayer
(
auxiliary_feat
)
auxiliary_logit
=
F
.
resize_bilinear
(
auxiliary_logit
,
input
.
shape
[
2
:])
logit_list
.
append
(
auxiliary_logit
)
return
logit_list
...
...
@@ -107,13 +149,6 @@ class PSPNet(nn.Layer):
def
init_weight
(
self
,
pretrained_model
=
None
):
"""
Initialize the parameters of model parts.
Args:
pretrained_model ([str], optional): the path of pretrained model. Defaults to None.
"""
if
pretrained_model
is
not
None
:
if
os
.
path
.
exists
(
pretrained_model
):
utils
.
load_pretrained_model
(
self
,
pretrained_model
)
else
:
raise
Exception
(
'Pretrained model is not found: {}'
.
format
(
pretrained_model
))
pass
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录