|
|
|
|
|
|
|
|
|
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) |
|
|