|
|
|
|
|
|
|
|
|
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)
|
|
|
|
_C.DATASETS.CLASS_TO_MESH_NAME_MAPPING = CN(new_allowed=True)
|
|
|
|
|
|
def add_evaluation_config(cfg: CN) -> None:
|
|
_C = cfg
|
|
_C.DENSEPOSE_EVALUATION = CN()
|
|
|
|
|
|
|
|
_C.DENSEPOSE_EVALUATION.TYPE = "iou"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_C.DENSEPOSE_EVALUATION.STORAGE = "none"
|
|
|
|
|
|
_C.DENSEPOSE_EVALUATION.MIN_IOU_THRESHOLD = 0.5
|
|
|
|
_C.DENSEPOSE_EVALUATION.DISTRIBUTED_INFERENCE = True
|
|
|
|
_C.DENSEPOSE_EVALUATION.EVALUATE_MESH_ALIGNMENT = False
|
|
|
|
_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 = ""
|
|
|
|
_C.RATIO = 0.1
|
|
|
|
_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)
|
|
|
|
_C.INFERENCE = CN()
|
|
|
|
_C.INFERENCE.INPUT_BATCH_SIZE = 4
|
|
|
|
_C.INFERENCE.OUTPUT_BATCH_SIZE = 2
|
|
|
|
_C.DATA_SAMPLER = CN(new_allowed=True)
|
|
_C.DATA_SAMPLER.TYPE = ""
|
|
_C.DATA_SAMPLER.USE_GROUND_TRUTH_CATEGORIES = False
|
|
|
|
_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()
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.EMBED_SIZE = 16
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.EMBEDDERS = CN(new_allowed=True)
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.EMBEDDING_DIST_GAUSS_SIGMA = 0.01
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.GEODESIC_DIST_GAUSS_SIGMA = 0.01
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.EMBED_LOSS_WEIGHT = 0.6
|
|
|
|
|
|
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.EMBED_LOSS_NAME = "EmbeddingLoss"
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.FEATURES_LR_FACTOR = 1.0
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.EMBEDDING_LR_FACTOR = 1.0
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.SHAPE_TO_SHAPE_CYCLE_LOSS = CN({"ENABLED": False})
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.SHAPE_TO_SHAPE_CYCLE_LOSS.WEIGHT = 0.025
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.SHAPE_TO_SHAPE_CYCLE_LOSS.NORM_P = 2
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.SHAPE_TO_SHAPE_CYCLE_LOSS.TEMPERATURE = 0.05
|
|
|
|
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.SHAPE_TO_SHAPE_CYCLE_LOSS.MAX_NUM_VERTICES = 4936
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.PIX_TO_SHAPE_CYCLE_LOSS = CN({"ENABLED": False})
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.PIX_TO_SHAPE_CYCLE_LOSS.WEIGHT = 0.0001
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.PIX_TO_SHAPE_CYCLE_LOSS.NORM_P = 2
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.PIX_TO_SHAPE_CYCLE_LOSS.USE_ALL_MESHES_NOT_GT_ONLY = False
|
|
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.CSE.PIX_TO_SHAPE_CYCLE_LOSS.NUM_PIXELS_TO_SAMPLE = 100
|
|
|
|
_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
|
|
|
|
_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
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.FG_IOU_THRESHOLD = 0.7
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.INDEX_WEIGHTS = 5.0
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.PART_WEIGHTS = 1.0
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.POINT_REGRESSION_WEIGHTS = 0.01
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.COARSE_SEGM_TRAINED_BY_MASKS = False
|
|
|
|
_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
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.DEEPLAB = CN()
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.DEEPLAB.NORM = "GN"
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.DEEPLAB.NONLOCAL_ON = 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.PREDICTOR_NAME = "DensePoseChartWithConfidencePredictor"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.LOSS_NAME = "DensePoseChartWithConfidenceLoss"
|
|
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.UV_CONFIDENCE = CN({"ENABLED": False})
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.UV_CONFIDENCE.EPSILON = 0.01
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.SEGM_CONFIDENCE = CN({"ENABLED": False})
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.SEGM_CONFIDENCE.EPSILON = 0.01
|
|
|
|
|
|
|
|
|
|
|
|
_C.MODEL.ROI_DENSEPOSE_HEAD.UV_CONFIDENCE.TYPE = "iid_iso"
|
|
|
|
_C.INPUT.ROTATION_ANGLES = [0]
|
|
_C.TEST.AUG.ROTATION_ANGLES = ()
|
|
|
|
add_densepose_head_cse_config(cfg)
|
|
|
|
|
|
def add_hrnet_config(cfg: CN) -> None:
|
|
"""
|
|
Add config for HRNet backbone.
|
|
"""
|
|
_C = cfg
|
|
|
|
|
|
_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)
|
|
|