Spaces:
Sleeping
Sleeping
# -*- coding = utf-8 -*- | |
# Copyright (c) Facebook, Inc. and its affiliates. | |
# pyre-ignore-all-errors | |
from detectron2.config import CfgNode as CN | |
def add_dataset_category_config(cfg: CN) -> None: | |
""" | |
Add config for additional category-related dataset options | |
- category whitelisting | |
- category mapping | |
""" | |
_C = cfg | |
_C.DATASETS.CATEGORY_MAPS = CN(new_allowed=True) | |
_C.DATASETS.WHITELISTED_CATEGORIES = CN(new_allowed=True) | |
# class to mesh mapping | |
_C.DATASETS.CLASS_TO_MESH_NAME_MAPPING = CN(new_allowed=True) | |
def add_evaluation_config(cfg: CN) -> None: | |
_C = cfg | |
_C.DENSEPOSE_EVALUATION = CN() | |
# evaluator type, possible values: | |
# - "iou": evaluator for models that produce iou data | |
# - "cse": evaluator for models that produce cse data | |
_C.DENSEPOSE_EVALUATION.TYPE = "iou" | |
# storage for DensePose results, possible values: | |
# - "none": no explicit storage, all the results are stored in the | |
# dictionary with predictions, memory intensive; | |
# historically the default storage type | |
# - "ram": RAM storage, uses per-process RAM storage, which is | |
# reduced to a single process storage on later stages, | |
# less memory intensive | |
# - "file": file storage, uses per-process file-based storage, | |
# the least memory intensive, but may create bottlenecks | |
# on file system accesses | |
_C.DENSEPOSE_EVALUATION.STORAGE = "none" | |
# minimum threshold for IOU values: the lower its values is, | |
# the more matches are produced (and the higher the AP score) | |
_C.DENSEPOSE_EVALUATION.MIN_IOU_THRESHOLD = 0.5 | |
# Non-distributed inference is slower (at inference time) but can avoid RAM OOM | |
_C.DENSEPOSE_EVALUATION.DISTRIBUTED_INFERENCE = True | |
# evaluate mesh alignment based on vertex embeddings, only makes sense in CSE context | |
_C.DENSEPOSE_EVALUATION.EVALUATE_MESH_ALIGNMENT = False | |
# meshes to compute mesh alignment for | |
_C.DENSEPOSE_EVALUATION.MESH_ALIGNMENT_MESH_NAMES = [] | |
def add_bootstrap_config(cfg: CN) -> None: | |
""" """ | |
_C = cfg | |
_C.BOOTSTRAP_DATASETS = [] | |
_C.BOOTSTRAP_MODEL = CN() | |
_C.BOOTSTRAP_MODEL.WEIGHTS = "" | |
_C.BOOTSTRAP_MODEL.DEVICE = "cuda" | |
def get_bootstrap_dataset_config() -> CN: | |
_C = CN() | |
_C.DATASET = "" | |
# ratio used to mix data loaders | |
_C.RATIO = 0.1 | |
# image loader | |
_C.IMAGE_LOADER = CN(new_allowed=True) | |
_C.IMAGE_LOADER.TYPE = "" | |
_C.IMAGE_LOADER.BATCH_SIZE = 4 | |
_C.IMAGE_LOADER.NUM_WORKERS = 4 | |
_C.IMAGE_LOADER.CATEGORIES = [] | |
_C.IMAGE_LOADER.MAX_COUNT_PER_CATEGORY = 1_000_000 | |
_C.IMAGE_LOADER.CATEGORY_TO_CLASS_MAPPING = CN(new_allowed=True) | |
# inference | |
_C.INFERENCE = CN() | |
# batch size for model inputs | |
_C.INFERENCE.INPUT_BATCH_SIZE = 4 | |
# batch size to group model outputs | |
_C.INFERENCE.OUTPUT_BATCH_SIZE = 2 | |
# sampled data | |
_C.DATA_SAMPLER = CN(new_allowed=True) | |
_C.DATA_SAMPLER.TYPE = "" | |
_C.DATA_SAMPLER.USE_GROUND_TRUTH_CATEGORIES = False | |
# filter | |
_C.FILTER = CN(new_allowed=True) | |
_C.FILTER.TYPE = "" | |
return _C | |
def load_bootstrap_config(cfg: CN) -> None: | |
""" | |
Bootstrap datasets are given as a list of `dict` that are not automatically | |
converted into CfgNode. This method processes all bootstrap dataset entries | |
and ensures that they are in CfgNode format and comply with the specification | |
""" | |
if not cfg.BOOTSTRAP_DATASETS: | |
return | |
bootstrap_datasets_cfgnodes = [] | |
for dataset_cfg in cfg.BOOTSTRAP_DATASETS: | |
_C = get_bootstrap_dataset_config().clone() | |
_C.merge_from_other_cfg(CN(dataset_cfg)) | |
bootstrap_datasets_cfgnodes.append(_C) | |
cfg.BOOTSTRAP_DATASETS = bootstrap_datasets_cfgnodes | |
def add_densepose_head_cse_config(cfg: CN) -> None: | |
""" | |
Add configuration options for Continuous Surface Embeddings (CSE) | |
""" | |
_C = cfg | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE = CN() | |
# Dimensionality D of the embedding space | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.EMBED_SIZE = 16 | |
# Embedder specifications for various mesh IDs | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.EMBEDDERS = CN(new_allowed=True) | |
# normalization coefficient for embedding distances | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.EMBEDDING_DIST_GAUSS_SIGMA = 0.01 | |
# normalization coefficient for geodesic distances | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.GEODESIC_DIST_GAUSS_SIGMA = 0.01 | |
# embedding loss weight | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.EMBED_LOSS_WEIGHT = 0.6 | |
# embedding loss name, currently the following options are supported: | |
# - EmbeddingLoss: cross-entropy on vertex labels | |
# - SoftEmbeddingLoss: cross-entropy on vertex label combined with | |
# Gaussian penalty on distance between vertices | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.EMBED_LOSS_NAME = "EmbeddingLoss" | |
# optimizer hyperparameters | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.FEATURES_LR_FACTOR = 1.0 | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.EMBEDDING_LR_FACTOR = 1.0 | |
# Shape to shape cycle consistency loss parameters: | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.SHAPE_TO_SHAPE_CYCLE_LOSS = CN({"ENABLED": False}) | |
# shape to shape cycle consistency loss weight | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.SHAPE_TO_SHAPE_CYCLE_LOSS.WEIGHT = 0.025 | |
# norm type used for loss computation | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.SHAPE_TO_SHAPE_CYCLE_LOSS.NORM_P = 2 | |
# normalization term for embedding similarity matrices | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.SHAPE_TO_SHAPE_CYCLE_LOSS.TEMPERATURE = 0.05 | |
# maximum number of vertices to include into shape to shape cycle loss | |
# if negative or zero, all vertices are considered | |
# if positive, random subset of vertices of given size is considered | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.SHAPE_TO_SHAPE_CYCLE_LOSS.MAX_NUM_VERTICES = 4936 | |
# Pixel to shape cycle consistency loss parameters: | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.PIX_TO_SHAPE_CYCLE_LOSS = CN({"ENABLED": False}) | |
# pixel to shape cycle consistency loss weight | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.PIX_TO_SHAPE_CYCLE_LOSS.WEIGHT = 0.0001 | |
# norm type used for loss computation | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.PIX_TO_SHAPE_CYCLE_LOSS.NORM_P = 2 | |
# map images to all meshes and back (if false, use only gt meshes from the batch) | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.PIX_TO_SHAPE_CYCLE_LOSS.USE_ALL_MESHES_NOT_GT_ONLY = False | |
# Randomly select at most this number of pixels from every instance | |
# if negative or zero, all vertices are considered | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.PIX_TO_SHAPE_CYCLE_LOSS.NUM_PIXELS_TO_SAMPLE = 100 | |
# normalization factor for pixel to pixel distances (higher value = smoother distribution) | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.PIX_TO_SHAPE_CYCLE_LOSS.PIXEL_SIGMA = 5.0 | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.PIX_TO_SHAPE_CYCLE_LOSS.TEMPERATURE_PIXEL_TO_VERTEX = 0.05 | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.PIX_TO_SHAPE_CYCLE_LOSS.TEMPERATURE_VERTEX_TO_PIXEL = 0.05 | |
def add_densepose_head_config(cfg: CN) -> None: | |
""" | |
Add config for densepose head. | |
""" | |
_C = cfg | |
_C.MODEL.DENSEPOSE_ON = True | |
_C.MODEL.ROI_DENSEPOSE_HEAD = CN() | |
_C.MODEL.ROI_DENSEPOSE_HEAD.NAME = "" | |
_C.MODEL.ROI_DENSEPOSE_HEAD.NUM_STACKED_CONVS = 8 | |
# Number of parts used for point labels | |
_C.MODEL.ROI_DENSEPOSE_HEAD.NUM_PATCHES = 24 | |
_C.MODEL.ROI_DENSEPOSE_HEAD.DECONV_KERNEL = 4 | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CONV_HEAD_DIM = 512 | |
_C.MODEL.ROI_DENSEPOSE_HEAD.CONV_HEAD_KERNEL = 3 | |
_C.MODEL.ROI_DENSEPOSE_HEAD.UP_SCALE = 2 | |
_C.MODEL.ROI_DENSEPOSE_HEAD.HEATMAP_SIZE = 112 | |
_C.MODEL.ROI_DENSEPOSE_HEAD.POOLER_TYPE = "ROIAlignV2" | |
_C.MODEL.ROI_DENSEPOSE_HEAD.POOLER_RESOLUTION = 28 | |
_C.MODEL.ROI_DENSEPOSE_HEAD.POOLER_SAMPLING_RATIO = 2 | |
_C.MODEL.ROI_DENSEPOSE_HEAD.NUM_COARSE_SEGM_CHANNELS = 2 # 15 or 2 | |
# Overlap threshold for an RoI to be considered foreground (if >= FG_IOU_THRESHOLD) | |
_C.MODEL.ROI_DENSEPOSE_HEAD.FG_IOU_THRESHOLD = 0.7 | |
# Loss weights for annotation masks.(14 Parts) | |
_C.MODEL.ROI_DENSEPOSE_HEAD.INDEX_WEIGHTS = 5.0 | |
# Loss weights for surface parts. (24 Parts) | |
_C.MODEL.ROI_DENSEPOSE_HEAD.PART_WEIGHTS = 1.0 | |
# Loss weights for UV regression. | |
_C.MODEL.ROI_DENSEPOSE_HEAD.POINT_REGRESSION_WEIGHTS = 0.01 | |
# Coarse segmentation is trained using instance segmentation task data | |
_C.MODEL.ROI_DENSEPOSE_HEAD.COARSE_SEGM_TRAINED_BY_MASKS = False | |
# For Decoder | |
_C.MODEL.ROI_DENSEPOSE_HEAD.DECODER_ON = True | |
_C.MODEL.ROI_DENSEPOSE_HEAD.DECODER_NUM_CLASSES = 256 | |
_C.MODEL.ROI_DENSEPOSE_HEAD.DECODER_CONV_DIMS = 256 | |
_C.MODEL.ROI_DENSEPOSE_HEAD.DECODER_NORM = "" | |
_C.MODEL.ROI_DENSEPOSE_HEAD.DECODER_COMMON_STRIDE = 4 | |
# For DeepLab head | |
_C.MODEL.ROI_DENSEPOSE_HEAD.DEEPLAB = CN() | |
_C.MODEL.ROI_DENSEPOSE_HEAD.DEEPLAB.NORM = "GN" | |
_C.MODEL.ROI_DENSEPOSE_HEAD.DEEPLAB.NONLOCAL_ON = 0 | |
# Predictor class name, must be registered in DENSEPOSE_PREDICTOR_REGISTRY | |
# Some registered predictors: | |
# "DensePoseChartPredictor": predicts segmentation and UV coordinates for predefined charts | |
# "DensePoseChartWithConfidencePredictor": predicts segmentation, UV coordinates | |
# and associated confidences for predefined charts (default) | |
# "DensePoseEmbeddingWithConfidencePredictor": predicts segmentation, embeddings | |
# and associated confidences for CSE | |
_C.MODEL.ROI_DENSEPOSE_HEAD.PREDICTOR_NAME = "DensePoseChartWithConfidencePredictor" | |
# Loss class name, must be registered in DENSEPOSE_LOSS_REGISTRY | |
# Some registered losses: | |
# "DensePoseChartLoss": loss for chart-based models that estimate | |
# segmentation and UV coordinates | |
# "DensePoseChartWithConfidenceLoss": loss for chart-based models that estimate | |
# segmentation, UV coordinates and the corresponding confidences (default) | |
_C.MODEL.ROI_DENSEPOSE_HEAD.LOSS_NAME = "DensePoseChartWithConfidenceLoss" | |
# Confidences | |
# Enable learning UV confidences (variances) along with the actual values | |
_C.MODEL.ROI_DENSEPOSE_HEAD.UV_CONFIDENCE = CN({"ENABLED": False}) | |
# UV confidence lower bound | |
_C.MODEL.ROI_DENSEPOSE_HEAD.UV_CONFIDENCE.EPSILON = 0.01 | |
# Enable learning segmentation confidences (variances) along with the actual values | |
_C.MODEL.ROI_DENSEPOSE_HEAD.SEGM_CONFIDENCE = CN({"ENABLED": False}) | |
# Segmentation confidence lower bound | |
_C.MODEL.ROI_DENSEPOSE_HEAD.SEGM_CONFIDENCE.EPSILON = 0.01 | |
# Statistical model type for confidence learning, possible values: | |
# - "iid_iso": statistically independent identically distributed residuals | |
# with isotropic covariance | |
# - "indep_aniso": statistically independent residuals with anisotropic | |
# covariances | |
_C.MODEL.ROI_DENSEPOSE_HEAD.UV_CONFIDENCE.TYPE = "iid_iso" | |
# List of angles for rotation in data augmentation during training | |
_C.INPUT.ROTATION_ANGLES = [0] | |
_C.TEST.AUG.ROTATION_ANGLES = () # Rotation TTA | |
add_densepose_head_cse_config(cfg) | |
def add_hrnet_config(cfg: CN) -> None: | |
""" | |
Add config for HRNet backbone. | |
""" | |
_C = cfg | |
# For HigherHRNet w32 | |
_C.MODEL.HRNET = CN() | |
_C.MODEL.HRNET.STEM_INPLANES = 64 | |
_C.MODEL.HRNET.STAGE2 = CN() | |
_C.MODEL.HRNET.STAGE2.NUM_MODULES = 1 | |
_C.MODEL.HRNET.STAGE2.NUM_BRANCHES = 2 | |
_C.MODEL.HRNET.STAGE2.BLOCK = "BASIC" | |
_C.MODEL.HRNET.STAGE2.NUM_BLOCKS = [4, 4] | |
_C.MODEL.HRNET.STAGE2.NUM_CHANNELS = [32, 64] | |
_C.MODEL.HRNET.STAGE2.FUSE_METHOD = "SUM" | |
_C.MODEL.HRNET.STAGE3 = CN() | |
_C.MODEL.HRNET.STAGE3.NUM_MODULES = 4 | |
_C.MODEL.HRNET.STAGE3.NUM_BRANCHES = 3 | |
_C.MODEL.HRNET.STAGE3.BLOCK = "BASIC" | |
_C.MODEL.HRNET.STAGE3.NUM_BLOCKS = [4, 4, 4] | |
_C.MODEL.HRNET.STAGE3.NUM_CHANNELS = [32, 64, 128] | |
_C.MODEL.HRNET.STAGE3.FUSE_METHOD = "SUM" | |
_C.MODEL.HRNET.STAGE4 = CN() | |
_C.MODEL.HRNET.STAGE4.NUM_MODULES = 3 | |
_C.MODEL.HRNET.STAGE4.NUM_BRANCHES = 4 | |
_C.MODEL.HRNET.STAGE4.BLOCK = "BASIC" | |
_C.MODEL.HRNET.STAGE4.NUM_BLOCKS = [4, 4, 4, 4] | |
_C.MODEL.HRNET.STAGE4.NUM_CHANNELS = [32, 64, 128, 256] | |
_C.MODEL.HRNET.STAGE4.FUSE_METHOD = "SUM" | |
_C.MODEL.HRNET.HRFPN = CN() | |
_C.MODEL.HRNET.HRFPN.OUT_CHANNELS = 256 | |
def add_densepose_config(cfg: CN) -> None: | |
add_densepose_head_config(cfg) | |
add_hrnet_config(cfg) | |
add_bootstrap_config(cfg) | |
add_dataset_category_config(cfg) | |
add_evaluation_config(cfg) | |