import os import cv2 from PIL import Image import numpy as np import geopandas as gpd import matplotlib.pyplot as plt from keras.models import load_model from tensorflow.keras.preprocessing.image import load_img, img_to_array import geopandas as gpd from skimage.measure import regionprops, label from shapely.geometry import Polygon import shutil import gradio as gr def predict(img): # model = load_model('drive/My Drive/building_footprint_extraction_model.h5') model = load_model('building_footprint_extraction_model.h5') img_array = img_to_array(img) img_array = img_array.reshape((1, 256, 256, 3)) img_array = img_array / 255.0 predictions = model.predict(img_array) predicted_image = np.argmax(predictions, axis=3) predicted_image = predicted_image[0,:,:] predicted_image = predicted_image * 255 return predictions,predicted_image def get_shape_files(img): predictions,predicted_image= predict(img) threshold = 0.5 binary_mask = (predictions > threshold).astype(np.uint8)[:, :, 1] if np.sum(binary_mask) == 0: print("No building pixels detected. Saving an empty shapefile.") else: labeled_mask = label(binary_mask) building_polygons = [] props = regionprops(labeled_mask) for prop in props: polygon = Polygon([(point[1], point[0]) for point in prop.coords]) building_polygons.append(polygon) gdf = gpd.GeoDataFrame(geometry=building_polygons, crs="EPSG:4326") output_shapefile = "shapefiles/building_footprints.shp" if os.path.exists('shapefiles'): pass else: os.mkdir('shapefiles') gdf.to_file(output_shapefile) # To get Masked Image cv2.imwrite('shapefiles/mask.jpg',predicted_image) shutil.make_archive('shapefile', 'zip', 'shapefiles') return 'shapefile.zip',predicted_image my_app = gr.Blocks() with my_app: gr.Markdown("

Building Footprint Extraction

") with gr.Tabs(): # with gr.TabItem("Get Mask Image"): # with gr.Row(): # with gr.Column(): # img_source = gr.Image(label="Please select source Image", shape=(256, 256)) # source_image_loader = gr.Button("Load above Image") # with gr.Column(): # img_output = gr.Image(label="Image Output") # source_image_loader.click(predict,img_source,[img_output]) with gr.TabItem("Get Mask Image and Shapefiles"): with gr.Row(): with gr.Column(): img_source = gr.Image(label="Please select source Image", shape=(256, 256)) get_shape_loader = gr.Button("Get Shape File") with gr.Column(): with gr.Row(): mask_img=gr.Image(label="Image Output") with gr.Row(): output_zip = gr.outputs.File() get_shape_loader.click(get_shape_files,img_source,[output_zip,mask_img]) my_app.launch(debug = True)