Spaces:
Running
Running
| # Copyright (c) Meta Platforms, Inc. and affiliates. | |
| import json | |
| import shutil | |
| from pathlib import Path | |
| import cv2 | |
| import numpy as np | |
| import requests | |
| import torch | |
| from tqdm.auto import tqdm | |
| from .. import logger | |
| DATA_URL = "https://cvg-data.inf.ethz.ch/OrienterNet_CVPR2023" | |
| def read_image(path, grayscale=False): | |
| if grayscale: | |
| mode = cv2.IMREAD_GRAYSCALE | |
| else: | |
| mode = cv2.IMREAD_COLOR | |
| image = cv2.imread(str(path), mode) | |
| if image is None: | |
| raise ValueError(f"Cannot read image {path}.") | |
| if not grayscale and len(image.shape) == 3: | |
| image = np.ascontiguousarray(image[:, :, ::-1]) # BGR to RGB | |
| return image | |
| def write_torch_image(path, image): | |
| image_cv2 = np.round(image.clip(0, 1) * 255).astype(int)[..., ::-1] | |
| cv2.imwrite(str(path), image_cv2) | |
| class JSONEncoder(json.JSONEncoder): | |
| def default(self, obj): | |
| if isinstance(obj, (np.ndarray, torch.Tensor)): | |
| return obj.tolist() | |
| elif isinstance(obj, np.generic): | |
| return obj.item() | |
| return json.JSONEncoder.default(self, obj) | |
| def write_json(path, data): | |
| with open(path, "w") as f: | |
| json.dump(data, f, cls=JSONEncoder) | |
| def download_file(url, path): | |
| path = Path(path) | |
| if path.is_dir(): | |
| path = path / Path(url).name | |
| path.parent.mkdir(exist_ok=True, parents=True) | |
| logger.info("Downloading %s to %s.", url, path) | |
| with requests.get(url, stream=True) as r: | |
| total_length = int(r.headers.get("Content-Length")) | |
| with tqdm.wrapattr(r.raw, "read", total=total_length, desc="") as raw: | |
| with open(path, "wb") as output: | |
| shutil.copyfileobj(raw, output) | |
| return path | |