| import os |
| import torch |
| import argparse |
| import numpy as np |
| import cv2 |
| from pathlib import Path |
| from tqdm.auto import tqdm |
|
|
|
|
| def parse_arguments(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument( |
| "--img_path", type=str, required=True, help="path to the file or the folder" |
| ) |
| parser.add_argument( |
| "--save_folder", type=str, default="./depth/", help="path to the folder" |
| ) |
| parser.add_argument( |
| "--midas_model", type=str, default="DPT_Large", help="Midas model name" |
| ) |
| parser.add_argument("--use_cuda", action="store_true") |
| parser.add_argument("--baseline", type=float, default=0.54) |
| parser.add_argument("--focal", type=float, default=721.09) |
| parser.add_argument("--img_scale", type=float, default=1) |
| return parser.parse_args() |
|
|
|
|
| def get_depth_estimation_model(model_name: str, device="cpu"): |
| assert model_name in ["DPT_Large", "DPT_Hybrid", "MiDaS_small"] |
|
|
| midas = torch.hub.load("intel-isl/MiDaS", model_name) |
| midas.eval() |
| midas.to(device) |
|
|
| midas_transforms = torch.hub.load("intel-isl/MiDaS", "transforms") |
| if model_name in ["DPT_Large", "DPT_Hybrid"]: |
| transform = midas_transforms.dpt_transform |
| else: |
| transform = midas_transforms.small_transform |
| return midas, transform |
|
|
|
|
| def getDisparityMap(model, transform, img_path): |
| img = cv2.imread(str(img_path)) |
| img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) |
| input_batch = transform(img) |
|
|
| with torch.no_grad(): |
| prediction = model(input_batch.cuda()) |
|
|
| prediction = torch.nn.functional.interpolate( |
| prediction.unsqueeze(1), |
| size=img.shape[:2], |
| mode="bicubic", |
| align_corners=False, |
| ).squeeze() |
| return prediction.cpu().numpy() |
|
|
|
|
| def get_depth_map( |
| midas, midas_transform, imgp, baseline=0.54, focal=721.09, img_scale=1 |
| ): |
| disp = getDisparityMap(midas, midas_transform, imgp) |
| disp[disp < 0] = 0 |
| disp = disp + 1e-3 |
| depth = baseline * focal / (disp * img_scale) |
|
|
| return depth |
|
|
|
|
| def get_depth_map_new(midas, midas_transform, imgp): |
| depth = getDisparityMap(midas, midas_transform, imgp) |
| depth[depth < 0] = 0 |
| depth = depth + 1e-3 |
| depth = depth |
| return depth.max() - depth |
|
|
|
|
| def main(): |
| args = parse_arguments() |
|
|
| device = torch.device("cpu") |
| if args.use_cuda: |
| device = torch.device("cuda") |
|
|
| |
| baseline = args.baseline |
| focal = args.focal |
| img_scale = args.img_scale |
|
|
| imgP = Path(args.img_path) |
| save_folder = Path(args.save_folder) |
| if not save_folder.exists(): |
| os.makedirs(str(save_folder)) |
|
|
| midas, midas_transform = get_depth_estimation_model( |
| model_name=args.midas_model, device=device |
| ) |
|
|
| if imgP.is_dir(): |
| image_files = sorted(Path(imgP).glob("*")) |
| for imgp in tqdm(image_files): |
| depth = get_depth_map( |
| midas, midas_transform, imgp, baseline, focal, img_scale |
| ) |
| np.save(save_folder / imgp.stem, depth) |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|