Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added Panoptic deeplab #10537

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
54fae04
Added `PanopticDeepLabFusion` layer
srihari-humbarwadi Jan 12, 2022
78949f9
added new feature_fusion: panoptic_deeplab_fusion
srihari-humbarwadi Jan 12, 2022
c8e0233
added tests for panoptic_deeplab_fusion
srihari-humbarwadi Jan 12, 2022
e257b29
added `kernel_size` param for `SegmentationHead`
srihari-humbarwadi Jan 12, 2022
6742d61
added `InstanceCenterHead`
srihari-humbarwadi Jan 12, 2022
a6a14de
added tests for `InstanceCenterHead`
srihari-humbarwadi Jan 12, 2022
6ee54a6
added `PanopticDeeplabModel`
srihari-humbarwadi Jan 12, 2022
8a8d5fa
added tests for `PanopticDeeplabModel`
srihari-humbarwadi Jan 12, 2022
c3282ab
added `build_panoptic_deeplab` in panoptic factory
srihari-humbarwadi Jan 12, 2022
ac67130
added tests for `build_panoptic_deeplab` in panoptic factory
srihari-humbarwadi Jan 12, 2022
09d9656
Merge branch 'panoptic-segmentation' into panoptic-deeplab-modeling
srihari-humbarwadi Jan 13, 2022
4dc4f6c
Revert "added `kernel_size` param for `SegmentationHead`"
srihari-humbarwadi Jan 14, 2022
29ab89c
Revert "added new feature_fusion: panoptic_deeplab_fusion"
srihari-humbarwadi Jan 14, 2022
cbe4739
Revert "added tests for panoptic_deeplab_fusion"
srihari-humbarwadi Jan 14, 2022
7e6c550
Revert "added `InstanceCenterHead`"
srihari-humbarwadi Jan 22, 2022
01685ee
Revert "added tests for `InstanceCenterHead`"
srihari-humbarwadi Jan 22, 2022
ecbc5cb
implemneted `PanopticDeeplabHead`
srihari-humbarwadi Jan 22, 2022
abee356
added tests for `PanopticDeeplabHead`
srihari-humbarwadi Jan 22, 2022
31a8e46
use `SemanticHead` and `InstanceHead` from panoptic_deeplab_heads
srihari-humbarwadi Jan 22, 2022
2ad1ec1
added configs for `SemanticHead` and `InstanceHead`
srihari-humbarwadi Jan 22, 2022
d751119
Merge branch 'tensorflow:master' into panoptic-deeplab-modeling
srihari-humbarwadi Jan 22, 2022
df60a19
revert misc changes
srihari-humbarwadi Jan 22, 2022
e0a91f2
fixed import error
srihari-humbarwadi Jan 28, 2022
75f304d
move `PanopticDeepLabFusion` into project dir
srihari-humbarwadi Jan 28, 2022
7865791
Revert "Added `PanopticDeepLabFusion` layer"
srihari-humbarwadi Jan 28, 2022
c127d52
Merge branch 'panoptic-segmentation' into panoptic-deeplab-modeling
srihari-humbarwadi Feb 4, 2022
2d739bb
import code PostProcessor code from deeplab2
srihari-humbarwadi Feb 15, 2022
4ace44b
added post processing layer
srihari-humbarwadi Feb 15, 2022
8b60a5a
added config for post processing layer
srihari-humbarwadi Feb 15, 2022
7479dbb
Merge branch 'tensorflow:master' into panoptic-deeplab-modeling
srihari-humbarwadi Feb 15, 2022
0225b13
Merge branch 'tensorflow:master' into panoptic-deeplab-modeling
srihari-humbarwadi Mar 5, 2022
81edc4f
added dataloader for Panoptic Deeplab
srihari-humbarwadi Mar 5, 2022
7e4f1ef
rename features attr for `TfExampleDecoder`
srihari-humbarwadi Mar 6, 2022
edee549
added `_parse_data` with `is_training` flag
srihari-humbarwadi Mar 6, 2022
6a6e199
fixed dtypes and formatting
srihari-humbarwadi Mar 6, 2022
4d68a0d
Merge branch 'tensorflow:master' into panoptic-deeplab-dataloader
srihari-humbarwadi Mar 9, 2022
cdd61f6
Merge branch 'panoptic-segmentation' into panoptic-deeplab-modeling
srihari-humbarwadi Mar 9, 2022
9222174
Merge pull request #14 from srihari-humbarwadi/panoptic-deeplab-modeling
srihari-humbarwadi Mar 10, 2022
3d09f14
Merge pull request #15 from srihari-humbarwadi/panoptic-deeplab-datal…
srihari-humbarwadi Mar 10, 2022
e46a249
add option to generate panoptic masks
srihari-humbarwadi Mar 16, 2022
a6c6089
rescale predictions before generating outputs
srihari-humbarwadi Mar 16, 2022
4f8826a
rename output tensor keys
srihari-humbarwadi Mar 16, 2022
051f1f0
rename label keys
srihari-humbarwadi Mar 16, 2022
18c138b
added center heatmap and offset losses
srihari-humbarwadi Mar 16, 2022
75cfba0
added `PanopticDeeplabTask`
srihari-humbarwadi Mar 16, 2022
5e478a4
added tests for `PanopticDeeplabTask`
srihari-humbarwadi Mar 16, 2022
83b87f0
added configs for dataloader, losses and task
srihari-humbarwadi Mar 16, 2022
dfcc691
Merge branch 'master' into panoptic-deeplab
srihari-humbarwadi Mar 16, 2022
d106a11
fix missing import
srihari-humbarwadi Mar 18, 2022
43b997e
added `fusion_num_output_filters` param
srihari-humbarwadi Mar 18, 2022
4c75cd7
fixed missing params for panoptic_deeplab_head
srihari-humbarwadi Mar 18, 2022
9e2fbc6
fixed bug in calculating `total_loss`
srihari-humbarwadi Mar 18, 2022
07d7cb8
added experiment config for `panoptic_deeplab_coco`
srihari-humbarwadi Mar 18, 2022
7189e61
cleanup
srihari-humbarwadi Mar 18, 2022
f024e38
changed base lr
srihari-humbarwadi Mar 18, 2022
177e2d7
fix bug in `learning_rate` config
srihari-humbarwadi Mar 18, 2022
c5afee4
cast to original dtype after resizing
srihari-humbarwadi Mar 18, 2022
2597ef4
import panoptic_deeplab
srihari-humbarwadi Mar 18, 2022
95f061b
use `stem_type=v0` for `dilated_resnet`
srihari-humbarwadi Mar 18, 2022
abfd069
compute small instance weights based on mask area
srihari-humbarwadi Mar 20, 2022
6e0d65c
refactor losses; implemented weighted semantic loss
srihari-humbarwadi Mar 20, 2022
277f935
import `resize_and_rescale_offsets` fn
srihari-humbarwadi Mar 20, 2022
5893d61
rescale offest masks before resizing
srihari-humbarwadi Mar 20, 2022
5d7d327
disable learning rate warmup
srihari-humbarwadi Mar 20, 2022
0fa4095
fixed `sample_weight` shape bug in instance center losses
srihari-humbarwadi Mar 20, 2022
a46df93
set learning rate warmup steps
srihari-humbarwadi Mar 20, 2022
e54c17f
use `panoptic_mask` to derive category and instance masks
srihari-humbarwadi Mar 25, 2022
7cffacf
fixed bug ins `thing_class_ids`
srihari-humbarwadi Mar 25, 2022
8b641b1
Merge branch 'tensorflow:master' into panoptic-deeplab
srihari-humbarwadi Mar 25, 2022
1408d2c
use DSConv2D in heads
srihari-humbarwadi Mar 25, 2022
5e54ed8
fixed import paths
srihari-humbarwadi Mar 25, 2022
0530009
Merge pull request #16 from srihari-humbarwadi/panoptic-deeplab-DSConv2D
srihari-humbarwadi Mar 28, 2022
cb7e265
Merge branch 'tensorflow:master' into panoptic-deeplab
srihari-humbarwadi Mar 28, 2022
0692e42
added `panoptic_deeplab_policy`
srihari-humbarwadi Mar 28, 2022
a7b55e8
enable `AutoAugment` augmentation
srihari-humbarwadi Mar 28, 2022
170eb70
fix runtime dtype
srihari-humbarwadi Mar 28, 2022
b9bd2f1
fixed dtype bug in `resize_and_rescale_offsets`
srihari-humbarwadi Mar 29, 2022
adf0c8e
Merge pull request #17 from srihari-humbarwadi/panoptic-deeplab-augme…
srihari-humbarwadi Mar 30, 2022
14f4c9d
set `pool_kernel_size` and `dropout_rate` for `ASPP`
srihari-humbarwadi Mar 30, 2022
054d11f
Merge branch 'tensorflow:master' into panoptic-deeplab
srihari-humbarwadi Mar 31, 2022
6ab9251
compute `top_k` loss per sample
srihari-humbarwadi Mar 31, 2022
686a287
Merge pull request #18 from srihari-humbarwadi/panoptic-deeplab-topk-fix
srihari-humbarwadi Apr 1, 2022
44f6d51
Merge branch 'tensorflow:master' into panoptic-deeplab
srihari-humbarwadi Apr 25, 2022
11adf3e
use `stem_type=v1` in resnet
srihari-humbarwadi Apr 25, 2022
b4cd335
Merge pull request #19 from srihari-humbarwadi/panoptic-deeplab-resne…
srihari-humbarwadi Apr 26, 2022
0eb186e
added docstrings
srihari-humbarwadi Apr 28, 2022
a9e15bd
removed Todo
srihari-humbarwadi Apr 28, 2022
c4ce3a9
make keys to panoptic masks configurable in `TfExampleDecoder`
srihari-humbarwadi Apr 28, 2022
5755768
Merge branch 'tensorflow:master' into panoptic-deeplab
srihari-humbarwadi Apr 28, 2022
80e9b6d
fixed description
srihari-humbarwadi Apr 28, 2022
12ec618
added table entry for resnet50 model results
srihari-humbarwadi Apr 28, 2022
1f765c5
added table entry for resnet101 model results
srihari-humbarwadi May 2, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions official/vision/beta/projects/panoptic_maskrcnn/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,12 @@ ResNet-50 | 3x | `panoptic_fpn_coco` | 40.64 | 36.29

**Note**: Here 1x schedule refers to ~12 epochs

### Panoptic Deeplab
Backbone | Experiment name | Overall PQ | Things PQ | Stuff PQ | Checkpoints
:---------------------| :-------------------------------| ---------- | --------- | -------- | ------------:
Dilated ResNet-50 | `panoptic_deeplab_resnet_coco` | 36.80 | 37.51 | 35.73 | [ckpt](gs://tf_model_garden/vision/panoptic/panoptic_deeplab_resnet50)
Dilated ResNet-101 | `panoptic_deeplab_resnet_coco` | 38.39 | 39.47 | 36.75 | [ckpt](gs://tf_model_garden/vision/panoptic/panoptic_deeplab_resnet101)

___
## Citation
```
Expand All @@ -94,4 +100,12 @@ ___
archivePrefix={arXiv},
primaryClass={cs.CV}
}

@article{Cheng2020PanopticDeepLabAS,
title={Panoptic-DeepLab: A Simple, Strong, and Fast Baseline for Bottom-Up Panoptic Segmentation},
author={Bowen Cheng and Maxwell D. Collins and Yukun Zhu and Ting Liu and Thomas S. Huang and Hartwig Adam and Liang-Chieh Chen},
journal={2020 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
year={2020},
pages={12472-12482}
}
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,337 @@
# Copyright 2022 The TensorFlow Authors. All Rights Reserved.
#
# 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.

"""Panoptic Deeplab configuration definition."""
import os
import dataclasses
from typing import List, Optional, Tuple, Union

import numpy as np

from official.core import config_definitions as cfg
from official.core import exp_factory
from official.modeling import hyperparams
from official.modeling import optimization
from official.vision.configs import common
from official.vision.configs import backbones
from official.vision.configs import decoders


_COCO_INPUT_PATH_BASE = 'coco/tfrecords'
_COCO_TRAIN_EXAMPLES = 118287
_COCO_VAL_EXAMPLES = 5000


@dataclasses.dataclass
class Parser(hyperparams.Config):
ignore_label: int = 0
# If resize_eval_groundtruth is set to False, original image sizes are used
# for eval. In that case, groundtruth_padded_size has to be specified too to
# allow for batching the variable input sizes of images.
resize_eval_groundtruth: bool = True
groundtruth_padded_size: List[int] = dataclasses.field(default_factory=list)
aug_scale_min: float = 1.0
aug_scale_max: float = 1.0
aug_rand_hflip: bool = True
aug_type: common.Augmentation = common.Augmentation()
sigma: float = 8.0
small_instance_area_threshold: int = 4096
small_instance_weight: float = 3.0
dtype = 'float32'


@dataclasses.dataclass
class TfExampleDecoder(common.TfExampleDecoder):
"""A simple TF Example decoder config."""
panoptic_category_mask_key: str = 'image/panoptic/category_mask'
panoptic_instance_mask_key: str = 'image/panoptic/instance_mask'

@dataclasses.dataclass
class DataDecoder(common.DataDecoder):
"""Data decoder config."""
simple_decoder: TfExampleDecoder = TfExampleDecoder()


@dataclasses.dataclass
class DataConfig(cfg.DataConfig):
"""Input config for training."""
decoder: DataDecoder = DataDecoder()
parser: Parser = Parser()
file_type: str = 'tfrecord'


@dataclasses.dataclass
class PanopticDeeplabHead(hyperparams.Config):
"""Panoptic Deeplab head config."""
level: int = 3
num_convs: int = 2
num_filters: int = 256
kernel_size: int = 5
use_depthwise_convolution: bool = False
upsample_factor: int = 1
low_level: Union[List[int], Tuple[int]] = (3, 2)
low_level_num_filters: Union[List[int], Tuple[int]] = (64, 32)
fusion_num_output_filters: int = 256


@dataclasses.dataclass
class SemanticHead(PanopticDeeplabHead):
"""Semantic head config."""
prediction_kernel_size: int = 1


@dataclasses.dataclass
class InstanceHead(PanopticDeeplabHead):
"""Instance head config."""
prediction_kernel_size: int = 1


@dataclasses.dataclass
class PanopticDeeplabPostProcessor(hyperparams.Config):
"""Panoptic Deeplab PostProcessing config."""
output_size: List[int] = dataclasses.field(
default_factory=list)
center_score_threshold: float = 0.1
thing_class_ids: List[int] = dataclasses.field(default_factory=list)
label_divisor: int = 256 * 256 * 256
stuff_area_limit: int = 4096
ignore_label: int = 0
nms_kernel: int = 7
keep_k_centers: int = 200
rescale_predictions: bool = True


@dataclasses.dataclass
class PanopticDeeplab(hyperparams.Config):
"""Panoptic Deeplab model config."""
num_classes: int = 2
input_size: List[int] = dataclasses.field(default_factory=list)
min_level: int = 3
max_level: int = 6
norm_activation: common.NormActivation = common.NormActivation()
backbone: backbones.Backbone = backbones.Backbone(
type='resnet', resnet=backbones.ResNet())
decoder: decoders.Decoder = decoders.Decoder(type='aspp')
semantic_head: SemanticHead = SemanticHead()
instance_head: InstanceHead = InstanceHead()
shared_decoder: bool = False
generate_panoptic_masks: bool = True
post_processor: PanopticDeeplabPostProcessor = PanopticDeeplabPostProcessor()


@dataclasses.dataclass
class Losses(hyperparams.Config):
label_smoothing: float = 0.0
ignore_label: int = 0
class_weights: List[float] = dataclasses.field(default_factory=list)
l2_weight_decay: float = 1e-4
top_k_percent_pixels: float = 0.15
segmentation_loss_weight: float = 1.0
center_heatmap_loss_weight: float = 200
center_offset_loss_weight: float = 0.01


@dataclasses.dataclass
class Evaluation(hyperparams.Config):
""" Evaluation config """
ignored_label: int = 0
max_instances_per_category: int = 256
offset: int = 256 * 256 * 256
is_thing: List[float] = dataclasses.field(
default_factory=list)
rescale_predictions: bool = True
report_per_class_pq: bool = False

report_per_class_iou: bool = False
report_train_mean_iou: bool = True # Turning this off can speed up training.


@dataclasses.dataclass
class PanopticDeeplabTask(cfg.TaskConfig):
model: PanopticDeeplab = PanopticDeeplab()
train_data: DataConfig = DataConfig(is_training=True)
validation_data: DataConfig = DataConfig(
is_training=False,
drop_remainder=False)
losses: Losses = Losses()
init_checkpoint: Optional[str] = None
init_checkpoint_modules: Union[str, List[str]] = 'all' # all, backbone, and/or decoder
evaluation: Evaluation = Evaluation()


@exp_factory.register_config_factory('panoptic_deeplab_resnet_coco')
def panoptic_deeplab_coco() -> cfg.ExperimentConfig:
"""COCO panoptic segmentation with Panoptic Deeplab."""
train_steps = 200000
train_batch_size = 64
eval_batch_size = 1
steps_per_epoch = _COCO_TRAIN_EXAMPLES // train_batch_size
validation_steps = _COCO_VAL_EXAMPLES // eval_batch_size

num_panoptic_categories = 201
num_thing_categories = 91
ignore_label = 0

is_thing = [False]
for idx in range(1, num_panoptic_categories):
is_thing.append(True if idx <= num_thing_categories else False)

input_size = [640, 640, 3]
output_stride = 16
aspp_dilation_rates = [6, 12, 18]
multigrid = [1, 2, 4]
stem_type = 'v1'
level = int(np.math.log2(output_stride))

config = cfg.ExperimentConfig(
runtime=cfg.RuntimeConfig(
mixed_precision_dtype='bfloat16', enable_xla=True),
task=PanopticDeeplabTask(
init_checkpoint='gs://cloud-tpu-checkpoints/vision-2.0/deeplab/deeplab_resnet50_imagenet/ckpt-62400', # pylint: disable=line-too-long
init_checkpoint_modules=['backbone'],
model=PanopticDeeplab(
num_classes=num_panoptic_categories,
input_size=input_size,
backbone=backbones.Backbone(
type='dilated_resnet', dilated_resnet=backbones.DilatedResNet(
model_id=50,
stem_type=stem_type,
output_stride=output_stride,
multigrid=multigrid,
se_ratio=0.25,
last_stage_repeats=1,
stochastic_depth_drop_rate=0.2)),
decoder=decoders.Decoder(
type='aspp',
aspp=decoders.ASPP(
level=level,
num_filters=256,
pool_kernel_size=input_size[:2],
dilation_rates=aspp_dilation_rates,
use_depthwise_convolution=True,
dropout_rate=0.1)),
semantic_head=SemanticHead(
level=level,
num_convs=1,
num_filters=256,
kernel_size=5,
use_depthwise_convolution=True,
upsample_factor=1,
low_level=(3, 2),
low_level_num_filters=(64, 32),
fusion_num_output_filters=256,
prediction_kernel_size=1),
instance_head=InstanceHead(
level=level,
num_convs=1,
num_filters=32,
kernel_size=5,
use_depthwise_convolution=True,
upsample_factor=1,
low_level=(3, 2),
low_level_num_filters=(32, 16),
fusion_num_output_filters=128,
prediction_kernel_size=1),
shared_decoder=False,
generate_panoptic_masks=True,
post_processor=PanopticDeeplabPostProcessor(
output_size=input_size[:2],
center_score_threshold=0.1,
thing_class_ids=[i for i in range(1, num_thing_categories)],
label_divisor=256,
stuff_area_limit=4096,
ignore_label=ignore_label,
nms_kernel=41,
keep_k_centers=200,
rescale_predictions=True)),
losses=Losses(
label_smoothing=0.0,
ignore_label=ignore_label,
l2_weight_decay=0.0,
top_k_percent_pixels=0.2,
segmentation_loss_weight=1.0,
center_heatmap_loss_weight=200,
center_offset_loss_weight=0.01),
train_data=DataConfig(
input_path=os.path.join(_COCO_INPUT_PATH_BASE, 'train*'),
is_training=True,
global_batch_size=train_batch_size,
parser=Parser(
aug_scale_min=0.5,
aug_scale_max=1.5,
aug_rand_hflip=True,
aug_type=common.Augmentation(
type='autoaug',
autoaug=common.AutoAugment(
augmentation_name='panoptic_deeplab_policy')),
sigma=8.0,
small_instance_area_threshold=4096,
small_instance_weight=3.0)),
validation_data=DataConfig(
input_path=os.path.join(_COCO_INPUT_PATH_BASE, 'val*'),
is_training=False,
global_batch_size=eval_batch_size,
parser=Parser(
resize_eval_groundtruth=False,
groundtruth_padded_size=[640, 640],
aug_scale_min=1.0,
aug_scale_max=1.0,
aug_rand_hflip=False,
aug_type=None,
sigma=8.0,
small_instance_area_threshold=4096,
small_instance_weight=3.0),
drop_remainder=False),
evaluation=Evaluation(
ignored_label=ignore_label,
max_instances_per_category=256,
offset=256*256*256,
is_thing=is_thing,
rescale_predictions=True,
report_per_class_pq=False,
report_per_class_iou=False,
report_train_mean_iou=False)),
trainer=cfg.TrainerConfig(
train_steps=train_steps,
validation_steps=validation_steps,
validation_interval=steps_per_epoch,
steps_per_loop=steps_per_epoch,
summary_interval=steps_per_epoch,
checkpoint_interval=steps_per_epoch,
optimizer_config=optimization.OptimizationConfig({
'optimizer': {
'type': 'adam',
},
'learning_rate': {
'type': 'polynomial',
'polynomial': {
'initial_learning_rate': 0.0005,
'decay_steps': train_steps,
'end_learning_rate': 0.0,
'power': 0.9
}
},
'warmup': {
'type': 'linear',
'linear': {
'warmup_steps': 2000,
'warmup_learning_rate': 0
}
}
})),
restrictions=[
'task.train_data.is_training != None',
'task.validation_data.is_training != None'
])
return config
Loading