| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import torch |
|
|
| from .base_depth_dataset import BaseDepthDataset, DepthFileNameMode |
| from .base_normals_dataset import BaseNormalsDataset |
| from .base_iid_dataset import BaseIIDDataset |
|
|
|
|
| class HypersimDepthDataset(BaseDepthDataset): |
| def __init__( |
| self, |
| **kwargs, |
| ) -> None: |
| super().__init__( |
| |
| min_depth=1e-5, |
| max_depth=65.0, |
| has_filled_depth=False, |
| name_mode=DepthFileNameMode.rgb_i_d, |
| **kwargs, |
| ) |
|
|
| def _read_depth_file(self, rel_path): |
| depth_in = self._read_image(rel_path) |
| |
| depth_decoded = depth_in / 1000.0 |
| return depth_decoded |
|
|
|
|
| class HypersimNormalsDataset(BaseNormalsDataset): |
| pass |
|
|
|
|
| class HypersimIIDDataset(BaseIIDDataset): |
| def _load_targets_data(self, rel_paths): |
| albedo_path = rel_paths[0] |
| shading_path = rel_paths[1] |
| residual_path = rel_paths[2] |
|
|
| albedo_raw = self._read_numpy(albedo_path) |
| shading_raw = self._read_numpy(shading_path) |
| residual_raw = self._read_numpy(residual_path) |
|
|
| rasters = { |
| "albedo": torch.from_numpy(albedo_raw).float(), |
| "shading_raw": torch.from_numpy(shading_raw), |
| "residual_raw": torch.from_numpy(residual_raw), |
| } |
| del albedo_raw, shading_raw, residual_raw |
|
|
| |
| cut_off_value = self._get_cut_off_value(rasters) |
| |
| rasters = self._process_shading_residual(rasters, cut_off_value) |
|
|
| |
| valid_mask_albedo, valid_mask_shading, valid_mask_residual = ( |
| self._get_valid_masks(rasters) |
| ) |
| rasters.update( |
| { |
| "mask_albedo": valid_mask_albedo.bool(), |
| "mask_shading": valid_mask_shading.bool(), |
| "mask_residual": valid_mask_residual.bool(), |
| } |
| ) |
| return rasters |
|
|
| def _process_shading_residual(self, rasters, cut_off_value): |
| |
| shading_clipped = torch.clip(rasters["shading_raw"], 0, cut_off_value) |
| residual_clipped = torch.clip(rasters["residual_raw"], 0, cut_off_value) |
| |
| shading_norm = shading_clipped / cut_off_value |
| residual_norm = residual_clipped / cut_off_value |
|
|
| rasters.update( |
| { |
| "shading": shading_norm.float(), |
| "residual": residual_norm.float(), |
| } |
| ) |
| return rasters |
|
|
| def _get_cut_off_value(self, rasters): |
| shading_raw = rasters["shading_raw"] |
| residual_raw = rasters["residual_raw"] |
|
|
| |
| residual_98 = torch.quantile(residual_raw, 0.98) |
| shading_98 = torch.quantile(shading_raw, 0.98) |
| cut_off_value = torch.max(torch.tensor([residual_98, shading_98])) |
|
|
| return cut_off_value |
|
|
| def _get_valid_masks(self, rasters): |
| albedo_gt_ts = rasters["albedo"] |
| invalid_mask_albedo = torch.isnan(albedo_gt_ts) | torch.isinf(albedo_gt_ts) |
| zero_mask = (albedo_gt_ts == 0).all(dim=0, keepdim=True) |
| zero_mask = zero_mask.expand_as(albedo_gt_ts) |
| invalid_mask_albedo |= zero_mask |
| valid_mask_albedo = ~invalid_mask_albedo |
|
|
| shading_gt_ts = rasters["shading"] |
| invalid_mask_shading = torch.isnan(shading_gt_ts) | torch.isinf(shading_gt_ts) |
| valid_mask_shading = ~invalid_mask_shading |
|
|
| residual_gt_ts = rasters["residual"] |
| invalid_mask_residual = torch.isnan(residual_gt_ts) | torch.isinf( |
| residual_gt_ts |
| ) |
| valid_mask_residual = ~invalid_mask_residual |
|
|
| return valid_mask_albedo, valid_mask_shading, valid_mask_residual |
|
|