upload
Browse files- app.py +42 -0
- data/testv1.jpg +0 -0
- data/testv2.jpg +0 -0
- data/testv3.jpg +0 -0
- requirements.txt +6 -0
- utils.py +91 -0
app.py
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from skimage.util import montage as montage2d
|
2 |
+
from utils import load_model, preprocess_image, attempt_download_from_hub
|
3 |
+
import matplotlib.pyplot as plt
|
4 |
+
|
5 |
+
import gradio as gr
|
6 |
+
|
7 |
+
|
8 |
+
def keras_inference(img_data, model_path):
|
9 |
+
model_path = attempt_download_from_hub(model_path)
|
10 |
+
seg_model = load_model(model_path)
|
11 |
+
out_img = preprocess_image(img_data)
|
12 |
+
pred_y = seg_model.predict(out_img)
|
13 |
+
|
14 |
+
plt.imshow(montage2d(pred_y[:, :, :, 0]), cmap = 'bone_r')
|
15 |
+
plt.savefig('output.png')
|
16 |
+
return 'output.png'
|
17 |
+
|
18 |
+
inputs = [
|
19 |
+
gr.Image(type='filepath', label='Image'),
|
20 |
+
gr.Dropdown(['keras_model.h5'], label='Model Path')
|
21 |
+
]
|
22 |
+
|
23 |
+
outputs = gr.Image(label='Segmentation')
|
24 |
+
|
25 |
+
examples = [
|
26 |
+
['data/testv1.jpg', 'kadirnar/Keras-Segmenting-Buildings-v1'],
|
27 |
+
['data/testv2.jpg', 'kadirnar/Keras-Segmenting-Buildings-v1'],
|
28 |
+
['data/testv3.jpg', 'kadirnar/Keras-Segmenting-Buildings-v1'],
|
29 |
+
]
|
30 |
+
|
31 |
+
title = 'Segmenting Buildings in Satellite Images with Keras'
|
32 |
+
|
33 |
+
demo_app = gr.Interface(
|
34 |
+
keras_inference,
|
35 |
+
inputs,
|
36 |
+
outputs,
|
37 |
+
title=title,
|
38 |
+
examples=examples,
|
39 |
+
cache_examples=True,
|
40 |
+
)
|
41 |
+
|
42 |
+
demo_app.launch(debug=True, enable_queue=True)
|
data/testv1.jpg
ADDED
data/testv2.jpg
ADDED
data/testv3.jpg
ADDED
requirements.txt
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
huggingface_hub==0.12.0
|
2 |
+
keras==2.11.0
|
3 |
+
matplotlib==3.6.2
|
4 |
+
numpy==1.23.5
|
5 |
+
opencv_python==4.6.0.66
|
6 |
+
scikit_image==0.19.3
|
utils.py
ADDED
@@ -0,0 +1,91 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#https://www.kaggle.com/code/kmader/segmenting-buildings-in-satellite-images
|
2 |
+
|
3 |
+
from keras import models, layers
|
4 |
+
from skimage.io import imread
|
5 |
+
import numpy as np
|
6 |
+
import cv2
|
7 |
+
|
8 |
+
t_x_shape = (300, 300, 3)
|
9 |
+
GAUSSIAN_NOISE = 0.1
|
10 |
+
BASE_DEPTH = 16
|
11 |
+
BLOCK_COUNT = 1
|
12 |
+
SPATIAL_DROPOUT = 0.25
|
13 |
+
EDGE_CROP = 16
|
14 |
+
|
15 |
+
|
16 |
+
def conv_bn(x, filt, dl_rate=(1,1), preblock = False):
|
17 |
+
y = layers.Convolution2D(filt, (3, 3),
|
18 |
+
activation='linear',
|
19 |
+
padding='same',
|
20 |
+
dilation_rate=dl_rate,
|
21 |
+
use_bias=False)(x)
|
22 |
+
if preblock: return y
|
23 |
+
y = layers.BatchNormalization()(y)
|
24 |
+
return layers.Activation('elu')(y)
|
25 |
+
|
26 |
+
def keras_model():
|
27 |
+
in_layer = layers.Input(t_x_shape, name = 'RGB_Input')
|
28 |
+
pp_in_layer = layers.GaussianNoise(GAUSSIAN_NOISE)(in_layer)
|
29 |
+
pp_in_layer = layers.BatchNormalization()(pp_in_layer)
|
30 |
+
|
31 |
+
c = conv_bn(pp_in_layer, BASE_DEPTH//2)
|
32 |
+
c = conv_bn(c, BASE_DEPTH//2)
|
33 |
+
c = conv_bn(c, BASE_DEPTH)
|
34 |
+
|
35 |
+
skip_layers = [pp_in_layer]
|
36 |
+
for j in range(BLOCK_COUNT):
|
37 |
+
depth_steps = int(np.log2(t_x_shape[0])-2)
|
38 |
+
d = layers.concatenate(skip_layers+[conv_bn(c, BASE_DEPTH*2**j, (2**i, 2**i), preblock=True)
|
39 |
+
for i in range(depth_steps)])
|
40 |
+
d = layers.SpatialDropout2D(SPATIAL_DROPOUT)(d)
|
41 |
+
d = layers.BatchNormalization()(d)
|
42 |
+
d = layers.Activation('elu')(d)
|
43 |
+
# bottleneck
|
44 |
+
d = conv_bn(d, BASE_DEPTH*2**(j+1))
|
45 |
+
skip_layers += [c]
|
46 |
+
c = d
|
47 |
+
d = layers.Convolution2D(1, (1, 1), activation='sigmoid', padding='same')(d)
|
48 |
+
d = layers.Cropping2D((EDGE_CROP, EDGE_CROP))(d)
|
49 |
+
d = layers.ZeroPadding2D((EDGE_CROP, EDGE_CROP))(d)
|
50 |
+
|
51 |
+
seg_model = models.Model(inputs = [in_layer],outputs = [d])
|
52 |
+
|
53 |
+
return seg_model
|
54 |
+
|
55 |
+
def load_model(weight_path):
|
56 |
+
seg_model = keras_model()
|
57 |
+
seg_model.load_weights(weight_path)
|
58 |
+
return seg_model
|
59 |
+
|
60 |
+
def preprocess_image(img_data):
|
61 |
+
img_data = imread(img_data)
|
62 |
+
|
63 |
+
if img_data.shape[:2] == (300, 300):
|
64 |
+
img_data = img_data
|
65 |
+
else:
|
66 |
+
img_data = cv2.resize(img_data, (300, 300))
|
67 |
+
|
68 |
+
out_img = []
|
69 |
+
out_img += [img_data]
|
70 |
+
|
71 |
+
out_img = (np.stack(out_img, 0)/255.0).astype(np.float32)
|
72 |
+
return out_img
|
73 |
+
|
74 |
+
|
75 |
+
def attempt_download_from_hub(repo_id, hf_token=None):
|
76 |
+
# https://github.com/fcakyon/yolov5-pip/blob/main/yolov5/utils/downloads.py
|
77 |
+
from huggingface_hub import hf_hub_download, list_repo_files
|
78 |
+
from huggingface_hub.utils._errors import RepositoryNotFoundError
|
79 |
+
from huggingface_hub.utils._validators import HFValidationError
|
80 |
+
try:
|
81 |
+
repo_files = list_repo_files(repo_id=repo_id, repo_type='model', token=hf_token)
|
82 |
+
model_file = [f for f in repo_files if f.endswith('.h5')][0]
|
83 |
+
file = hf_hub_download(
|
84 |
+
repo_id=repo_id,
|
85 |
+
filename=model_file,
|
86 |
+
repo_type='model',
|
87 |
+
token=hf_token,
|
88 |
+
)
|
89 |
+
return file
|
90 |
+
except (RepositoryNotFoundError, HFValidationError):
|
91 |
+
return None
|