lazy all_train_cameras

Summary: Avoid calculating all_train_cameras before it is needed, because it is slow in some datasets.

Reviewed By: shapovalov

Differential Revision: D38037157

fbshipit-source-id: 95461226655cde2626b680661951ab17ebb0ec75
This commit is contained in:
Jeremy Reizenstein
2022-07-21 15:04:00 -07:00
committed by Facebook GitHub Bot
parent b2dc520210
commit 3783437d2f
6 changed files with 19 additions and 13 deletions

View File

@@ -30,9 +30,10 @@ class DataSourceBase(ReplaceableBase):
def get_datasets_and_dataloaders(self) -> Tuple[DatasetMap, DataLoaderMap]:
raise NotImplementedError()
def get_all_train_cameras(self) -> Optional[CamerasBase]:
@property
def all_train_cameras(self) -> Optional[CamerasBase]:
"""
If the data is all for a single scene, returns a list
If the data is all for a single scene, a list
of the known training cameras for that scene, which is
used for evaluating the viewpoint difficulty of the
unseen cameras.
@@ -59,6 +60,7 @@ class ImplicitronDataSource(DataSourceBase): # pyre-ignore[13]
def __post_init__(self):
run_auto_creation(self)
self._all_train_cameras_cache: Optional[Tuple[Optional[CamerasBase]]] = None
def get_datasets_and_dataloaders(self) -> Tuple[DatasetMap, DataLoaderMap]:
datasets = self.dataset_map_provider.get_dataset_map()
@@ -68,5 +70,10 @@ class ImplicitronDataSource(DataSourceBase): # pyre-ignore[13]
def get_task(self) -> Task:
return self.dataset_map_provider.get_task()
def get_all_train_cameras(self) -> Optional[CamerasBase]:
return self.dataset_map_provider.get_all_train_cameras()
@property
def all_train_cameras(self) -> Optional[CamerasBase]:
if self._all_train_cameras_cache is None: # pyre-ignore[16]
all_train_cameras = self.dataset_map_provider.get_all_train_cameras()
self._all_train_cameras_cache = (all_train_cameras,)
return self._all_train_cameras_cache[0]

View File

@@ -118,8 +118,6 @@ def evaluate_dbir_for_category(
if test_dataset is None or test_dataloader is None:
raise ValueError("must have a test dataset.")
all_train_cameras = data_source.get_all_train_cameras()
image_size = cast(JsonIndexDataset, test_dataset).image_width
if image_size is None:
@@ -149,7 +147,7 @@ def evaluate_dbir_for_category(
preds["implicitron_render"],
bg_color=bg_color,
lpips_model=lpips_model,
source_cameras=all_train_cameras,
source_cameras=data_source.all_train_cameras,
)
)