| | |
| |
|
| | import json |
| | import requests |
| | import shutil |
| | from pathlib import Path |
| |
|
| | import cv2 |
| | import numpy as np |
| | import torch |
| | from tqdm.auto import tqdm |
| |
|
| | 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]) |
| | 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 |
| |
|