| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | from typing import Optional, Literal |
| | from dataclasses import dataclass |
| | import tyro |
| |
|
| | from vhap.config.base import ( |
| | StageRgbSequentialTrackingConfig, StageRgbGlobalTrackingConfig, PipelineConfig, |
| | DataConfig, LossWeightConfig, BaseTrackingConfig, |
| | ) |
| | from vhap.util.log import get_logger |
| | logger = get_logger(__name__) |
| |
|
| |
|
| | @dataclass() |
| | class NersembleDataConfig(DataConfig): |
| | _target: str = "vhap.data.nersemble_dataset.NeRSembleDataset" |
| | calibrated: bool = True |
| | image_size_during_calibration: Optional[tuple[int, int]] = (3208, 2200) |
| | """(height, width). Will be use to convert principle points when the image size is not included in the camera parameters.""" |
| | background_color: Optional[Literal['white', 'black']] = None |
| | landmark_source: Optional[Literal["face-alignment", 'star']] = "star" |
| |
|
| | subject: str = "" |
| | """Subject ID. Such as 018, 218, 251, 253""" |
| | use_color_correction: bool = True |
| | """Whether to use color correction to harmonize the color of the input images.""" |
| |
|
| | @dataclass() |
| | class NersembleLossWeightConfig(LossWeightConfig): |
| | landmark: Optional[float] = 3. |
| | always_enable_jawline_landmarks: bool = False |
| | reg_expr: float = 1e-2 |
| | reg_tex_tv: Optional[float] = 1e5 |
| |
|
| | @dataclass() |
| | class NersembleStageRgbSequentialTrackingConfig(StageRgbSequentialTrackingConfig): |
| | optimizable_params: tuple[str, ...] = ("pose", "joints", "expr", "dynamic_offset") |
| |
|
| | align_texture_except: tuple[str, ...] = ("boundary",) |
| | align_boundary_except: tuple[str, ...] = ("boundary",) |
| | """Due to the limited flexibility in the lower neck region of FLAME, we relax the |
| | alignment constraints for better alignment in the face region. |
| | """ |
| |
|
| | @dataclass() |
| | class NersembleStageRgbGlobalTrackingConfig(StageRgbGlobalTrackingConfig): |
| | align_texture_except: tuple[str, ...] = ("boundary",) |
| | align_boundary_except: tuple[str, ...] = ("boundary",) |
| | """Due to the limited flexibility in the lower neck region of FLAME, we relax the |
| | alignment constraints for better alignment in the face region. |
| | """ |
| |
|
| | @dataclass() |
| | class NersemblePipelineConfig(PipelineConfig): |
| | rgb_sequential_tracking: NersembleStageRgbSequentialTrackingConfig |
| | rgb_global_tracking: NersembleStageRgbGlobalTrackingConfig |
| |
|
| | @dataclass() |
| | class NersembleTrackingConfig(BaseTrackingConfig): |
| | data: NersembleDataConfig |
| | w: NersembleLossWeightConfig |
| | pipeline: NersemblePipelineConfig |
| |
|
| | def get_occluded(self): |
| | occluded_table = { |
| | '018': ('neck_lower',), |
| | '218': ('neck_lower',), |
| | '251': ('neck_lower', 'boundary'), |
| | '253': ('neck_lower',), |
| | } |
| | if self.data.subject in occluded_table: |
| | logger.info(f"Automatically setting cfg.model.occluded to {occluded_table[self.data.subject]}") |
| | self.model.occluded = occluded_table[self.data.subject] |
| |
|
| |
|
| | if __name__ == "__main__": |
| | config = tyro.cli(NersembleTrackingConfig) |
| | print(tyro.to_yaml(config)) |