Spaces:
Runtime error
Runtime error
| """Compute depth maps for images in the input folder. | |
| """ | |
| import os | |
| import glob | |
| import utils | |
| import cv2 | |
| import argparse | |
| import tensorflow as tf | |
| from transforms import Resize, NormalizeImage, PrepareForNet | |
| def run(input_path, output_path, model_path, model_type="large"): | |
| """Run MonoDepthNN to compute depth maps. | |
| Args: | |
| input_path (str): path to input folder | |
| output_path (str): path to output folder | |
| model_path (str): path to saved model | |
| """ | |
| print("initialize") | |
| # the runtime initialization will not allocate all memory on the device to avoid out of GPU memory | |
| gpus = tf.config.experimental.list_physical_devices('GPU') | |
| if gpus: | |
| try: | |
| for gpu in gpus: | |
| #tf.config.experimental.set_memory_growth(gpu, True) | |
| tf.config.experimental.set_virtual_device_configuration(gpu, | |
| [tf.config.experimental.VirtualDeviceConfiguration(memory_limit=4000)]) | |
| except RuntimeError as e: | |
| print(e) | |
| # network resolution | |
| if model_type == "large": | |
| net_w, net_h = 384, 384 | |
| elif model_type == "small": | |
| net_w, net_h = 256, 256 | |
| else: | |
| print(f"model_type '{model_type}' not implemented, use: --model_type large") | |
| assert False | |
| # load network | |
| graph_def = tf.compat.v1.GraphDef() | |
| with tf.io.gfile.GFile(model_path, 'rb') as f: | |
| graph_def.ParseFromString(f.read()) | |
| tf.import_graph_def(graph_def, name='') | |
| model_operations = tf.compat.v1.get_default_graph().get_operations() | |
| input_node = '0:0' | |
| output_layer = model_operations[len(model_operations) - 1].name + ':0' | |
| print("Last layer name: ", output_layer) | |
| resize_image = Resize( | |
| net_w, | |
| net_h, | |
| resize_target=None, | |
| keep_aspect_ratio=False, | |
| ensure_multiple_of=32, | |
| resize_method="upper_bound", | |
| image_interpolation_method=cv2.INTER_CUBIC, | |
| ) | |
| def compose2(f1, f2): | |
| return lambda x: f2(f1(x)) | |
| transform = compose2(resize_image, PrepareForNet()) | |
| # get input | |
| img_names = glob.glob(os.path.join(input_path, "*")) | |
| num_images = len(img_names) | |
| # create output folder | |
| os.makedirs(output_path, exist_ok=True) | |
| print("start processing") | |
| with tf.compat.v1.Session() as sess: | |
| try: | |
| # load images | |
| for ind, img_name in enumerate(img_names): | |
| print(" processing {} ({}/{})".format(img_name, ind + 1, num_images)) | |
| # input | |
| img = utils.read_image(img_name) | |
| img_input = transform({"image": img})["image"] | |
| # compute | |
| prob_tensor = sess.graph.get_tensor_by_name(output_layer) | |
| prediction, = sess.run(prob_tensor, {input_node: [img_input] }) | |
| prediction = prediction.reshape(net_h, net_w) | |
| prediction = cv2.resize(prediction, (img.shape[1], img.shape[0]), interpolation=cv2.INTER_CUBIC) | |
| # output | |
| filename = os.path.join( | |
| output_path, os.path.splitext(os.path.basename(img_name))[0] | |
| ) | |
| utils.write_depth(filename, prediction, bits=2) | |
| except KeyError: | |
| print ("Couldn't find input node: ' + input_node + ' or output layer: " + output_layer + ".") | |
| exit(-1) | |
| print("finished") | |
| if __name__ == "__main__": | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument('-i', '--input_path', | |
| default='input', | |
| help='folder with input images' | |
| ) | |
| parser.add_argument('-o', '--output_path', | |
| default='output', | |
| help='folder for output images' | |
| ) | |
| parser.add_argument('-m', '--model_weights', | |
| default='model-f6b98070.pb', | |
| help='path to the trained weights of model' | |
| ) | |
| parser.add_argument('-t', '--model_type', | |
| default='large', | |
| help='model type: large or small' | |
| ) | |
| args = parser.parse_args() | |
| # compute depth maps | |
| run(args.input_path, args.output_path, args.model_weights, args.model_type) | |