opensfm/dataset_base.py (190 lines of code) (raw):
import logging
from abc import ABC, abstractmethod
from typing import Dict, List, Tuple, Optional, IO, Any
import numpy as np
from opensfm import (
features,
geo,
io,
pygeometry,
types,
pymap,
)
logger = logging.getLogger(__name__)
class DataSetBase(ABC):
"""Base for dataset classes providing i/o access to persistent data.
It is possible to store data remotely or in different formats
by subclassing this class and overloading its methods.
"""
@property
@abstractmethod
def io_handler(self) -> io.IoFilesystemBase:
pass
@property
@abstractmethod
def config(self) -> Dict[str, Any]:
pass
@abstractmethod
def images(self) -> List[str]:
pass
@abstractmethod
def open_image_file(self, image: str) -> IO[Any]:
pass
@abstractmethod
def load_image(
self,
image: str,
unchanged: bool = False,
anydepth: bool = False,
grayscale: bool = False,
) -> np.ndarray:
pass
@abstractmethod
def image_size(self, image: str) -> Tuple[int, int]:
pass
@abstractmethod
def load_mask(self, image: str) -> Optional[np.ndarray]:
pass
@abstractmethod
def load_instances(self, image: str) -> Optional[np.ndarray]:
pass
@abstractmethod
def segmentation_labels(self) -> List[Any]:
pass
@abstractmethod
def load_segmentation(self, image: str) -> Optional[np.ndarray]:
pass
@abstractmethod
def segmentation_ignore_values(self, image: str) -> List[int]:
pass
@abstractmethod
def undistorted_segmentation_ignore_values(self, image: str) -> List[int]:
pass
@abstractmethod
def load_exif(self, image: str) -> Dict[str, Any]:
pass
@abstractmethod
def save_exif(self, image: str, data: Dict[str, Any]) -> None:
pass
@abstractmethod
def exif_exists(self, image: str) -> bool:
pass
@abstractmethod
def feature_type(self) -> str:
pass
@abstractmethod
def features_exist(self, image: str) -> bool:
pass
@abstractmethod
def load_features(self, image: str) -> Optional[features.FeaturesData]:
pass
@abstractmethod
def save_features(self, image: str, features_data: features.FeaturesData) -> None:
pass
@abstractmethod
def words_exist(self, image: str) -> bool:
pass
@abstractmethod
def load_words(self, image: str) -> np.ndarray:
pass
@abstractmethod
def save_words(self, image: str, words: np.ndarray) -> None:
pass
@abstractmethod
def matches_exists(self, image: str) -> bool:
pass
@abstractmethod
def load_matches(self, image: str) -> Dict[str, np.ndarray]:
pass
@abstractmethod
def save_matches(self, image: str, matches: Dict[str, np.ndarray]) -> None:
pass
@abstractmethod
def load_tracks_manager(
self, filename: Optional[str] = None
) -> pymap.TracksManager:
pass
@abstractmethod
def save_tracks_manager(
self, tracks_manager: pymap.TracksManager, filename: Optional[str] = None
) -> None:
pass
@abstractmethod
def load_reconstruction(
self, filename: Optional[str] = None
) -> List[types.Reconstruction]:
pass
@abstractmethod
def save_reconstruction(
self,
reconstruction: List[types.Reconstruction],
filename: Optional[str] = None,
minify=False,
) -> None:
pass
@abstractmethod
def init_reference(self, images: Optional[List[str]] = None) -> None:
pass
@abstractmethod
def reference_exists(self) -> bool:
pass
@abstractmethod
def load_reference(self) -> geo.TopocentricConverter:
pass
@abstractmethod
def save_reference(self, reference: geo.TopocentricConverter) -> None:
pass
@abstractmethod
def load_camera_models(self) -> Dict[str, pygeometry.Camera]:
pass
@abstractmethod
def save_camera_models(self, camera_models: Dict[str, pygeometry.Camera]) -> None:
pass
@abstractmethod
def camera_models_overrides_exists(self) -> bool:
pass
@abstractmethod
def load_camera_models_overrides(self) -> Dict[str, pygeometry.Camera]:
pass
@abstractmethod
def save_camera_models_overrides(
self, camera_models: Dict[str, pygeometry.Camera]
) -> None:
pass
@abstractmethod
def exif_overrides_exists(self) -> bool:
pass
@abstractmethod
def load_exif_overrides(self) -> Dict[str, Any]:
pass
@abstractmethod
def load_rig_cameras(
self,
) -> Dict[str, pymap.RigCamera]:
pass
@abstractmethod
def save_rig_cameras(self, rig_cameras: Dict[str, pymap.RigCamera]) -> None:
pass
@abstractmethod
def load_rig_assignments(self) -> Dict[str, List[Tuple[str, str]]]:
pass
@abstractmethod
def save_rig_assignments(
self, rig_assignments: Dict[str, List[Tuple[str, str]]]
) -> None:
pass
@abstractmethod
def append_to_profile_log(self, content: str) -> None:
pass
@abstractmethod
def load_report(self, path: str) -> str:
pass
@abstractmethod
def save_report(self, report_str: str, path: str) -> None:
pass
@abstractmethod
def load_ground_control_points(self) -> List[pymap.GroundControlPoint]:
pass
@abstractmethod
def save_ground_control_points(
self, points: List[pymap.GroundControlPoint]
) -> None:
pass
def clean_up(self) -> None:
pass