JordanLee vumichien commited on
Commit
7c9860e
·
0 Parent(s):

Duplicate from keras-io/Monocular-Depth-Estimation

Browse files

Co-authored-by: vumichien <[email protected]>

.gitattributes ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bin.* filter=lfs diff=lfs merge=lfs -text
5
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.model filter=lfs diff=lfs merge=lfs -text
12
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
13
+ *.onnx filter=lfs diff=lfs merge=lfs -text
14
+ *.ot filter=lfs diff=lfs merge=lfs -text
15
+ *.parquet filter=lfs diff=lfs merge=lfs -text
16
+ *.pb filter=lfs diff=lfs merge=lfs -text
17
+ *.pt filter=lfs diff=lfs merge=lfs -text
18
+ *.pth filter=lfs diff=lfs merge=lfs -text
19
+ *.rar filter=lfs diff=lfs merge=lfs -text
20
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
21
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
22
+ *.tflite filter=lfs diff=lfs merge=lfs -text
23
+ *.tgz filter=lfs diff=lfs merge=lfs -text
24
+ *.xz filter=lfs diff=lfs merge=lfs -text
25
+ *.zip filter=lfs diff=lfs merge=lfs -text
26
+ *.zstandard filter=lfs diff=lfs merge=lfs -text
27
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Monocular Depth Estimation
3
+ emoji: 🐢
4
+ colorFrom: blue
5
+ colorTo: purple
6
+ sdk: gradio
7
+ sdk_version: 3.0.13
8
+ app_file: app.py
9
+ pinned: false
10
+ duplicated_from: keras-io/Monocular-Depth-Estimation
11
+ ---
12
+
13
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces#reference
app.py ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from layers import BilinearUpSampling2D
2
+ from tensorflow.keras.models import load_model
3
+ from utils import load_images, predict
4
+ import matplotlib.pyplot as plt
5
+ import numpy as np
6
+ import gradio as gr
7
+ from huggingface_hub import from_pretrained_keras
8
+
9
+ custom_objects = {'BilinearUpSampling2D': BilinearUpSampling2D, 'depth_loss_function': None}
10
+ print('Loading model...')
11
+ model = from_pretrained_keras("keras-io/monocular-depth-estimation", custom_objects=custom_objects, compile=False)
12
+ print('Successfully loaded model...')
13
+ examples = ['examples/00015_colors.png', 'examples/00084_colors.png', 'examples/00033_colors.png']
14
+
15
+
16
+ def infer(image):
17
+ inputs = load_images([image])
18
+ outputs = predict(model, inputs)
19
+ plasma = plt.get_cmap('plasma')
20
+ rescaled = outputs[0][:, :, 0]
21
+ rescaled = rescaled - np.min(rescaled)
22
+ rescaled = rescaled / np.max(rescaled)
23
+ image_out = plasma(rescaled)[:, :, :3]
24
+ return image_out
25
+
26
+
27
+ iface = gr.Interface(
28
+ fn=infer,
29
+ title="Monocular Depth Estimation",
30
+ description = "Keras Implementation of Unet architecture with Densenet201 backbone for estimating the depth of image 📏",
31
+ inputs=[gr.inputs.Image(label="image", type="numpy", shape=(640, 480))],
32
+ outputs="image",
33
+ article = "Author: <a href=\"https://huggingface.co/vumichien\">Vu Minh Chien</a>. The ideal based on the keras example from <a href=\"https://keras.io/examples/vision/depth_estimation/\">Victor Basu</a>",
34
+ examples=examples, cache_examples=True).launch(debug=True)
examples/00015_colors.png ADDED
examples/00033_colors.png ADDED
examples/00084_colors.png ADDED
layers.py ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from tensorflow.keras.layers import Layer, InputSpec
2
+ import keras.utils.conv_utils as conv_utils
3
+ import tensorflow as tf
4
+ import tensorflow.keras.backend as K
5
+
6
+
7
+ def normalize_data_format(value):
8
+ if value is None:
9
+ value = K.image_data_format()
10
+ data_format = value.lower()
11
+ if data_format not in {'channels_first', 'channels_last'}:
12
+ raise ValueError('The `data_format` argument must be one of '
13
+ '"channels_first", "channels_last". Received: ' +
14
+ str(value))
15
+ return data_format
16
+
17
+
18
+ class BilinearUpSampling2D(Layer):
19
+ def __init__(self, size=(2, 2), data_format=None, **kwargs):
20
+ super(BilinearUpSampling2D, self).__init__(**kwargs)
21
+ self.data_format = normalize_data_format(data_format)
22
+ self.size = conv_utils.normalize_tuple(size, 2, 'size')
23
+ self.input_spec = InputSpec(ndim=4)
24
+
25
+ def compute_output_shape(self, input_shape):
26
+ if self.data_format == 'channels_first':
27
+ height = self.size[0] * input_shape[2] if input_shape[2] is not None else None
28
+ width = self.size[1] * input_shape[3] if input_shape[3] is not None else None
29
+ return (input_shape[0],
30
+ input_shape[1],
31
+ height,
32
+ width)
33
+ elif self.data_format == 'channels_last':
34
+ height = self.size[0] * input_shape[1] if input_shape[1] is not None else None
35
+ width = self.size[1] * input_shape[2] if input_shape[2] is not None else None
36
+ return (input_shape[0],
37
+ height,
38
+ width,
39
+ input_shape[3])
40
+
41
+ def call(self, inputs):
42
+ input_shape = K.shape(inputs)
43
+ if self.data_format == 'channels_first':
44
+ height = self.size[0] * input_shape[2] if input_shape[2] is not None else None
45
+ width = self.size[1] * input_shape[3] if input_shape[3] is not None else None
46
+ elif self.data_format == 'channels_last':
47
+ height = self.size[0] * input_shape[1] if input_shape[1] is not None else None
48
+ width = self.size[1] * input_shape[2] if input_shape[2] is not None else None
49
+
50
+ return tf.image.resize(inputs, [height, width], method=tf.image.ResizeMethod.BILINEAR)
51
+
52
+ def get_config(self):
53
+ config = {'size': self.size, 'data_format': self.data_format}
54
+ base_config = super(BilinearUpSampling2D, self).get_config()
55
+ return dict(list(base_config.items()) + list(config.items()))
model/model.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c23caa0daa6f34c4c4b0beeb2d2d7de0b7d5b07ef8c53ccbd3149ee5ccab595e
3
+ size 479691272
requirements.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ tensorflow
2
+ keras
utils.py ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+
3
+
4
+ def depth_norm(x, maxDepth):
5
+ return maxDepth / x
6
+
7
+
8
+ def predict(model, images, minDepth=10, maxDepth=1000, batch_size=2):
9
+ # Support multiple RGBs, one RGB image, even grayscale
10
+ if len(images.shape) < 3: images = np.stack((images, images, images), axis=2)
11
+ if len(images.shape) < 4: images = images.reshape((1, images.shape[0], images.shape[1], images.shape[2]))
12
+ # Compute predictions
13
+ predictions = model.predict(images, batch_size=batch_size)
14
+ # Put in expected range
15
+ return np.clip(depth_norm(predictions, maxDepth=maxDepth), minDepth, maxDepth) / maxDepth
16
+
17
+
18
+ def load_images(image_files):
19
+ loaded_images = []
20
+ for file in image_files:
21
+ x = np.clip(file.reshape(480, 640, 3) / 255, 0, 1)
22
+ loaded_images.append(x)
23
+ return np.stack(loaded_images, axis=0)