Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
曾经的那一瞬间
Models
提交
f4477a29
M
Models
项目概览
曾经的那一瞬间
/
Models
大约 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
Models
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f4477a29
编写于
10月 29, 2020
作者:
A
Abdullah Rashwan
提交者:
A. Unique TensorFlower
10月 29, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Internal change
PiperOrigin-RevId: 339773662
上级
9139a7b9
变更
12
显示空白变更内容
内联
并排
Showing
12 changed file
with
214 addition
and
22 deletion
+214
-22
official/vision/beta/configs/experiments/image_classification/imagenet_resnet101_deeplab_tpu.yaml
.../image_classification/imagenet_resnet101_deeplab_tpu.yaml
+1
-1
official/vision/beta/configs/experiments/image_classification/imagenet_resnet50_deeplab_tpu.yaml
...s/image_classification/imagenet_resnet50_deeplab_tpu.yaml
+1
-1
official/vision/beta/configs/experiments/semantic_segmentation/deeplab_resnet101_pascal_tpu.yaml
...s/semantic_segmentation/deeplab_resnet101_pascal_tpu.yaml
+1
-1
official/vision/beta/configs/experiments/semantic_segmentation/deeplabv3plus_resnet101_pascal_tpu.yaml
...ntic_segmentation/deeplabv3plus_resnet101_pascal_tpu.yaml
+17
-0
official/vision/beta/configs/experiments/semantic_segmentation/deeplabv3plus_resnet50_pascal_tpu.yaml
...antic_segmentation/deeplabv3plus_resnet50_pascal_tpu.yaml
+16
-0
official/vision/beta/configs/semantic_segmentation.py
official/vision/beta/configs/semantic_segmentation.py
+102
-4
official/vision/beta/configs/semantic_segmentation_test.py
official/vision/beta/configs/semantic_segmentation_test.py
+2
-1
official/vision/beta/modeling/factory.py
official/vision/beta/modeling/factory.py
+3
-0
official/vision/beta/modeling/heads/segmentation_heads.py
official/vision/beta/modeling/heads/segmentation_heads.py
+49
-4
official/vision/beta/modeling/heads/segmentation_heads_test.py
...ial/vision/beta/modeling/heads/segmentation_heads_test.py
+8
-3
official/vision/beta/modeling/segmentation_model.py
official/vision/beta/modeling/segmentation_model.py
+11
-4
official/vision/beta/tasks/semantic_segmentation.py
official/vision/beta/tasks/semantic_segmentation.py
+3
-3
未找到文件。
official/vision/beta/configs/experiments/image_classification/imagenet_resnet101_deeplab_tpu.yaml
浏览文件 @
f4477a29
...
...
@@ -9,7 +9,7 @@ task:
type
:
'
dilated_resnet'
dilated_resnet
:
model_id
:
101
output_stride
:
8
output_stride
:
16
norm_activation
:
activation
:
'
swish'
losses
:
...
...
official/vision/beta/configs/experiments/image_classification/imagenet_resnet50_deeplab_tpu.yaml
浏览文件 @
f4477a29
...
...
@@ -9,7 +9,7 @@ task:
type
:
'
dilated_resnet'
dilated_resnet
:
model_id
:
50
output_stride
:
8
output_stride
:
16
norm_activation
:
activation
:
'
swish'
losses
:
...
...
official/vision/beta/configs/experiments/semantic_segmentation/deeplab_resnet101_pascal_tpu.yaml
浏览文件 @
f4477a29
# Dilated ResNet-
50
Pascal segmentation. 80.89 mean IOU.
# Dilated ResNet-
101
Pascal segmentation. 80.89 mean IOU.
runtime
:
distribution_strategy
:
'
tpu'
mixed_precision_dtype
:
'
float32'
...
...
official/vision/beta/configs/experiments/semantic_segmentation/deeplabv3plus_resnet101_pascal_tpu.yaml
0 → 100644
浏览文件 @
f4477a29
# Dilated ResNet-101 Pascal segmentation. 80.83 mean IOU with output stride of 16.
runtime
:
distribution_strategy
:
'
tpu'
mixed_precision_dtype
:
'
float32'
task
:
model
:
backbone
:
type
:
'
dilated_resnet'
dilated_resnet
:
model_id
:
101
output_stride
:
16
head
:
feature_fusion
:
'
deeplabv3plus'
low_level
:
2
low_level_num_filters
:
48
init_checkpoint
:
'
gs://cloud-tpu-checkpoints/vision-2.0/deeplab/deeplab_resnet101_imagenet/ckpt-62400'
init_checkpoint_modules
:
'
backbone'
official/vision/beta/configs/experiments/semantic_segmentation/deeplabv3plus_resnet50_pascal_tpu.yaml
0 → 100644
浏览文件 @
f4477a29
runtime
:
distribution_strategy
:
'
tpu'
mixed_precision_dtype
:
'
float32'
task
:
model
:
backbone
:
type
:
'
dilated_resnet'
dilated_resnet
:
model_id
:
50
output_stride
:
16
head
:
feature_fusion
:
'
deeplabv3plus'
low_level
:
2
low_level_num_filters
:
48
init_checkpoint
:
'
gs://cloud-tpu-checkpoints/vision-2.0/deeplab/deeplab_resnet50_imagenet/ckpt-62400'
init_checkpoint_modules
:
'
backbone'
official/vision/beta/configs/semantic_segmentation.py
浏览文件 @
f4477a29
...
...
@@ -15,8 +15,11 @@
# ==============================================================================
"""Semantic segmentation configuration definition."""
import
os
from
typing
import
List
,
Union
,
Optional
from
typing
import
List
,
Optional
,
Union
import
dataclasses
import
numpy
as
np
from
official.core
import
exp_factory
from
official.modeling
import
hyperparams
from
official.modeling
import
optimization
...
...
@@ -48,6 +51,10 @@ class SegmentationHead(hyperparams.Config):
num_convs
:
int
=
2
num_filters
:
int
=
256
upsample_factor
:
int
=
1
feature_fusion
:
Optional
[
str
]
=
None
# None, or deeplabv3plus
# deeplabv3plus feature fusion params
low_level
:
int
=
2
low_level_num_filters
:
int
=
48
@
dataclasses
.
dataclass
...
...
@@ -109,6 +116,9 @@ def seg_deeplabv3_pascal() -> cfg.ExperimentConfig:
train_batch_size
=
16
eval_batch_size
=
8
steps_per_epoch
=
PASCAL_TRAIN_EXAMPLES
//
train_batch_size
output_stride
=
8
aspp_dilation_rates
=
[
12
,
24
,
36
]
# [6, 12, 18] if output_stride = 16
level
=
int
(
np
.
math
.
log2
(
output_stride
))
config
=
cfg
.
ExperimentConfig
(
task
=
SemanticSegmentationTask
(
model
=
SemanticSegmentationModel
(
...
...
@@ -117,11 +127,99 @@ def seg_deeplabv3_pascal() -> cfg.ExperimentConfig:
input_size
=
[
512
,
512
,
3
],
backbone
=
backbones
.
Backbone
(
type
=
'dilated_resnet'
,
dilated_resnet
=
backbones
.
DilatedResNet
(
model_id
=
50
,
output_stride
=
8
)),
model_id
=
50
,
output_stride
=
output_stride
)),
decoder
=
decoders
.
Decoder
(
type
=
'aspp'
,
aspp
=
decoders
.
ASPP
(
level
=
3
,
dilation_rates
=
[
12
,
24
,
36
])),
head
=
SegmentationHead
(
level
=
3
,
num_convs
=
0
),
level
=
level
,
dilation_rates
=
aspp_dilation_rates
)),
head
=
SegmentationHead
(
level
=
level
,
num_convs
=
0
),
norm_activation
=
common
.
NormActivation
(
activation
=
'swish'
,
norm_momentum
=
0.9997
,
norm_epsilon
=
1e-3
,
use_sync_bn
=
True
)),
losses
=
Losses
(
l2_weight_decay
=
1e-4
),
train_data
=
DataConfig
(
input_path
=
os
.
path
.
join
(
PASCAL_INPUT_PATH_BASE
,
'train_aug*'
),
is_training
=
True
,
global_batch_size
=
train_batch_size
,
aug_scale_min
=
0.5
,
aug_scale_max
=
2.0
),
validation_data
=
DataConfig
(
input_path
=
os
.
path
.
join
(
PASCAL_INPUT_PATH_BASE
,
'val*'
),
is_training
=
False
,
global_batch_size
=
eval_batch_size
,
resize_eval_groundtruth
=
False
,
groundtruth_padded_size
=
[
512
,
512
],
drop_remainder
=
False
),
# resnet50
init_checkpoint
=
'gs://cloud-tpu-checkpoints/vision-2.0/deeplab/deeplab_resnet50_imagenet/ckpt-62400'
,
init_checkpoint_modules
=
'backbone'
),
trainer
=
cfg
.
TrainerConfig
(
steps_per_loop
=
steps_per_epoch
,
summary_interval
=
steps_per_epoch
,
checkpoint_interval
=
steps_per_epoch
,
train_steps
=
45
*
steps_per_epoch
,
validation_steps
=
PASCAL_VAL_EXAMPLES
//
eval_batch_size
,
validation_interval
=
steps_per_epoch
,
optimizer_config
=
optimization
.
OptimizationConfig
({
'optimizer'
:
{
'type'
:
'sgd'
,
'sgd'
:
{
'momentum'
:
0.9
}
},
'learning_rate'
:
{
'type'
:
'polynomial'
,
'polynomial'
:
{
'initial_learning_rate'
:
0.007
,
'decay_steps'
:
45
*
steps_per_epoch
,
'end_learning_rate'
:
0.0
,
'power'
:
0.9
}
},
'warmup'
:
{
'type'
:
'linear'
,
'linear'
:
{
'warmup_steps'
:
5
*
steps_per_epoch
,
'warmup_learning_rate'
:
0
}
}
})),
restrictions
=
[
'task.train_data.is_training != None'
,
'task.validation_data.is_training != None'
])
return
config
@
exp_factory
.
register_config_factory
(
'seg_deeplabv3plus_pascal'
)
def
seg_deeplabv3plus_pascal
()
->
cfg
.
ExperimentConfig
:
"""Image segmentation on imagenet with resnet deeplabv3+."""
train_batch_size
=
16
eval_batch_size
=
8
steps_per_epoch
=
PASCAL_TRAIN_EXAMPLES
//
train_batch_size
output_stride
=
16
aspp_dilation_rates
=
[
6
,
12
,
18
]
# [12, 24, 36] if output_stride = 8
level
=
int
(
np
.
math
.
log2
(
output_stride
))
config
=
cfg
.
ExperimentConfig
(
task
=
SemanticSegmentationTask
(
model
=
SemanticSegmentationModel
(
num_classes
=
21
,
input_size
=
[
512
,
512
,
3
],
backbone
=
backbones
.
Backbone
(
type
=
'dilated_resnet'
,
dilated_resnet
=
backbones
.
DilatedResNet
(
model_id
=
50
,
output_stride
=
output_stride
)),
decoder
=
decoders
.
Decoder
(
type
=
'aspp'
,
aspp
=
decoders
.
ASPP
(
level
=
level
,
dilation_rates
=
aspp_dilation_rates
)),
head
=
SegmentationHead
(
level
=
level
,
num_convs
=
2
,
feature_fusion
=
'deeplabv3plus'
,
low_level
=
2
,
low_level_num_filters
=
48
),
norm_activation
=
common
.
NormActivation
(
activation
=
'swish'
,
norm_momentum
=
0.9997
,
...
...
official/vision/beta/configs/semantic_segmentation_test.py
浏览文件 @
f4477a29
...
...
@@ -27,7 +27,8 @@ from official.vision.beta.configs import semantic_segmentation as exp_cfg
class
ImageSegmentationConfigTest
(
tf
.
test
.
TestCase
,
parameterized
.
TestCase
):
@
parameterized
.
parameters
((
'seg_deeplabv3_pascal'
,),)
@
parameterized
.
parameters
((
'seg_deeplabv3_pascal'
,),
(
'seg_deeplabv3plus_pascal'
,))
def
test_semantic_segmentation_configs
(
self
,
config_name
):
config
=
exp_factory
.
get_exp_config
(
config_name
)
self
.
assertIsInstance
(
config
,
cfg
.
ExperimentConfig
)
...
...
official/vision/beta/modeling/factory.py
浏览文件 @
f4477a29
...
...
@@ -263,6 +263,9 @@ def build_segmentation_model(
num_convs
=
head_config
.
num_convs
,
num_filters
=
head_config
.
num_filters
,
upsample_factor
=
head_config
.
upsample_factor
,
feature_fusion
=
head_config
.
feature_fusion
,
low_level
=
head_config
.
low_level
,
low_level_num_filters
=
head_config
.
low_level_num_filters
,
activation
=
norm_activation_config
.
activation
,
use_sync_bn
=
norm_activation_config
.
use_sync_bn
,
norm_momentum
=
norm_activation_config
.
norm_momentum
,
...
...
official/vision/beta/modeling/heads/segmentation_heads.py
浏览文件 @
f4477a29
...
...
@@ -14,7 +14,6 @@
# ==============================================================================
"""Segmentation heads."""
# Import libraries
import
tensorflow
as
tf
from
official.modeling
import
tf_utils
...
...
@@ -31,6 +30,9 @@ class SegmentationHead(tf.keras.layers.Layer):
num_convs
=
2
,
num_filters
=
256
,
upsample_factor
=
1
,
feature_fusion
=
None
,
low_level
=
2
,
low_level_num_filters
=
48
,
activation
=
'relu'
,
use_sync_bn
=
False
,
norm_momentum
=
0.99
,
...
...
@@ -50,6 +52,14 @@ class SegmentationHead(tf.keras.layers.Layer):
Default is 256.
upsample_factor: `int` number to specify the upsampling factor to generate
finer mask. Default 1 means no upsampling is applied.
feature_fusion: One of `deeplabv3plus`, or None. If `deeplabv3plus`,
features from decoder_features[level] will be fused with
low level feature maps from backbone.
low_level: `int`, backbone level to be used for feature fusion. This arg
is used when feature_fusion is set to deeplabv3plus.
low_level_num_filters: `int`, reduced number of filters for the low
level features before fusing it with higher level features. This args is
only used when feature_fusion is set to deeplabv3plus.
activation: `string`, indicating which activation is used, e.g. 'relu',
'swish', etc.
use_sync_bn: `bool`, whether to use synchronized batch normalization
...
...
@@ -63,12 +73,16 @@ class SegmentationHead(tf.keras.layers.Layer):
**kwargs: other keyword arguments passed to Layer.
"""
super
(
SegmentationHead
,
self
).
__init__
(
**
kwargs
)
self
.
_config_dict
=
{
'num_classes'
:
num_classes
,
'level'
:
level
,
'num_convs'
:
num_convs
,
'num_filters'
:
num_filters
,
'upsample_factor'
:
upsample_factor
,
'feature_fusion'
:
feature_fusion
,
'low_level'
:
low_level
,
'low_level_num_filters'
:
low_level_num_filters
,
'activation'
:
activation
,
'use_sync_bn'
:
use_sync_bn
,
'norm_momentum'
:
norm_momentum
,
...
...
@@ -101,6 +115,20 @@ class SegmentationHead(tf.keras.layers.Layer):
'epsilon'
:
self
.
_config_dict
[
'norm_epsilon'
],
}
if
self
.
_config_dict
[
'feature_fusion'
]
==
'deeplabv3plus'
:
# Deeplabv3+ feature fusion layers.
self
.
_dlv3p_conv
=
conv_op
(
kernel_size
=
1
,
padding
=
'same'
,
bias_initializer
=
tf
.
zeros_initializer
(),
kernel_initializer
=
tf
.
keras
.
initializers
.
RandomNormal
(
stddev
=
0.01
),
kernel_regularizer
=
self
.
_config_dict
[
'kernel_regularizer'
],
name
=
'segmentation_head_deeplabv3p_fusion_conv'
,
filters
=
self
.
_config_dict
[
'low_level_num_filters'
])
self
.
_dlv3p_norm
=
bn_op
(
name
=
'segmentation_head_deeplabv3p_fusion_norm'
,
**
bn_kwargs
)
# Segmentation head layers.
self
.
_convs
=
[]
self
.
_norms
=
[]
...
...
@@ -121,11 +149,15 @@ class SegmentationHead(tf.keras.layers.Layer):
super
(
SegmentationHead
,
self
).
build
(
input_shape
)
def
call
(
self
,
features
):
def
call
(
self
,
backbone_output
,
decoder_output
):
"""Forward pass of the segmentation head.
Args:
features: a dict of tensors
backbone_output: a dict of tensors
- key: `str`, the level of the multilevel features.
- values: `Tensor`, the feature map tensors, whose shape is
[batch, height_l, width_l, channels].
decoder_output: a dict of tensors
- key: `str`, the level of the multilevel features.
- values: `Tensor`, the feature map tensors, whose shape is
[batch, height_l, width_l, channels].
...
...
@@ -133,7 +165,20 @@ class SegmentationHead(tf.keras.layers.Layer):
segmentation prediction mask: `Tensor`, the segmentation mask scores
predicted from input feature.
"""
x
=
features
[
str
(
self
.
_config_dict
[
'level'
])]
x
=
decoder_output
[
str
(
self
.
_config_dict
[
'level'
])]
if
self
.
_config_dict
[
'feature_fusion'
]
==
'deeplabv3plus'
:
# deeplabv3+ feature fusion
y
=
backbone_output
[
str
(
self
.
_config_dict
[
'low_level'
])]
y
=
self
.
_dlv3p_norm
(
self
.
_dlv3p_conv
(
y
))
y
=
self
.
_activation
(
y
)
x
=
tf
.
image
.
resize
(
x
,
tf
.
shape
(
y
)[
1
:
3
],
method
=
tf
.
image
.
ResizeMethod
.
BILINEAR
)
x
=
tf
.
concat
([
x
,
y
],
axis
=
self
.
_bn_axis
)
for
conv
,
norm
in
zip
(
self
.
_convs
,
self
.
_norms
):
x
=
conv
(
x
)
x
=
norm
(
x
)
...
...
official/vision/beta/modeling/heads/segmentation_heads_test.py
浏览文件 @
f4477a29
...
...
@@ -30,14 +30,19 @@ class SegmentationHeadTest(parameterized.TestCase, tf.test.TestCase):
)
def
test_forward
(
self
,
level
):
head
=
segmentation_heads
.
SegmentationHead
(
num_classes
=
10
,
level
=
level
)
features
=
{
backbone_
features
=
{
'3'
:
np
.
random
.
rand
(
2
,
128
,
128
,
16
),
'4'
:
np
.
random
.
rand
(
2
,
64
,
64
,
16
),
}
logits
=
head
(
features
)
decoder_features
=
{
'3'
:
np
.
random
.
rand
(
2
,
128
,
128
,
16
),
'4'
:
np
.
random
.
rand
(
2
,
64
,
64
,
16
),
}
logits
=
head
(
backbone_features
,
decoder_features
)
self
.
assertAllEqual
(
logits
.
numpy
().
shape
,
[
2
,
features
[
str
(
level
)].
shape
[
1
],
features
[
str
(
level
)].
shape
[
2
],
10
])
[
2
,
decoder_features
[
str
(
level
)].
shape
[
1
],
decoder_features
[
str
(
level
)].
shape
[
2
],
10
])
def
test_serialize_deserialize
(
self
):
head
=
segmentation_heads
.
SegmentationHead
(
num_classes
=
10
,
level
=
3
)
...
...
official/vision/beta/modeling/segmentation_model.py
浏览文件 @
f4477a29
...
...
@@ -26,7 +26,11 @@ class SegmentationModel(tf.keras.Model):
Input images are passed through backbone first. Decoder network is then
applied, and finally, segmentation head is applied on the output of the
decoder network. Layers such as ASPP should be part of decoder.
decoder network. Layers such as ASPP should be part of decoder. Any feature
fusion is done as part of the segmentation head (i.e. deeplabv3+ feature
fusion is not part of the decoder, instead it is part of the segmentation
head). This way, different feature fusion techniques can be combined with
different backbones, and decoders.
"""
def
__init__
(
self
,
...
...
@@ -53,11 +57,14 @@ class SegmentationModel(tf.keras.Model):
self
.
head
=
head
def
call
(
self
,
inputs
,
training
=
None
):
features
=
self
.
backbone
(
inputs
)
backbone_
features
=
self
.
backbone
(
inputs
)
if
self
.
decoder
:
features
=
self
.
decoder
(
features
)
return
self
.
head
(
features
)
decoder_features
=
self
.
decoder
(
backbone_features
)
else
:
decoder_features
=
backbone_features
return
self
.
head
(
backbone_features
,
decoder_features
)
@
property
def
checkpoint_items
(
self
):
...
...
official/vision/beta/tasks/semantic_segmentation.py
浏览文件 @
f4477a29
...
...
@@ -30,10 +30,10 @@ from official.vision.beta.modeling import factory
@
task_factory
.
register_task_cls
(
exp_cfg
.
SemanticSegmentationTask
)
class
SemanticSegmentationTask
(
base_task
.
Task
):
"""A task for semantic
classific
ation."""
"""A task for semantic
segment
ation."""
def
build_model
(
self
):
"""Builds
classific
ation model."""
"""Builds
segment
ation model."""
input_specs
=
tf
.
keras
.
layers
.
InputSpec
(
shape
=
[
None
]
+
self
.
task_config
.
model
.
input_size
)
...
...
@@ -105,7 +105,7 @@ class SemanticSegmentationTask(base_task.Task):
return
dataset
def
build_losses
(
self
,
labels
,
model_outputs
,
aux_losses
=
None
):
"""S
parse categorical cross entropy
loss.
"""S
egmentation
loss.
Args:
labels: labels.
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录