BEEPAS-2 / app.py
youl's picture
Update app.py
5272916
import gradio as gr
from api import *
from processing import *
import pandas as pd
from indices import indices
#import xgboost as xgb
from lightgbm import LGBMRegressor
import pickle
import json
from datetime import datetime
from shapely.geometry import MultiPolygon,shape
from shapely.geometry import Point
from shapely.geometry.polygon import Polygon
from glob import glob
import wget
##
def timer(message,start_time=None):
if not start_time:
start_time = datetime.now()
return start_time
elif start_time:
thour, temp_sec = divmod((datetime.now() - start_time).total_seconds(), 3600)
tmin, tsec = divmod(temp_sec, 60)
print('\n'+message+' Time taken: %i hours %i minutes and %s seconds.' % (thour, tmin, round(tsec, 2)))
##
def predict(location_name,lat, lon):
cord = [lon,lat]
lon = round(lon,4)
lat = round(lat,4)
x1 = [lon,lat]
x2 = [lat,lon]
with open("data/CIV_0.json","r") as file:
data = json.load(file)
# extract ivory coast polygone
features = [data['features'][0]['geometry']['coordinates'][0]+data['features'][0]['geometry']['coordinates'][1]+data['features'][0]['geometry']['coordinates'][2]]
data['features'][0]['geometry']['coordinates'] = features
ci_polygone = data['features'][0]['geometry']['coordinates'][0][0]
point1 = Point(x1)
point2 = Point(x2)
polygon = Polygon(ci_polygone)
result = polygon.contains(point1)
if not result:
return "Choose an area of ivory coast","","","",""
else:
start_time_research = timer('research tile',None)
df = pd.read_csv("data/frame.csv")
name = find_good_tile(df,point2)
timer('research tile',start_time_research)
if name ==404:
reponse = "Sentinel-2 does not have data on this location to date"
return reponse,"","","",""
else:
start_time_download = timer('download tile',None)
path = "https://data354-public-assets.s3.eu-west-3.amazonaws.com/cisentineldata/"
url = path+name
wget.download(url)
timer('download tile',start_time_download)
start_time_unzip = timer('unzip data',None)
unzip()
timer('unzip data',start_time_unzip)
start_time_processing = timer('processing data',None)
start_time_select_best_tile = timer('select best tile',None)
name,cld_prob,days_ago = select_best_cloud_coverage_tile()
bandes_path_10,bandes_path_20,bandes_path_60,tile_path,path_cld_20,path_cld_60 =paths(name)
timer('select best tile',start_time_select_best_tile)
start_time_10m = timer('create 10m image',None)
# create image dataset
images_10 = extract_sub_image(bandes_path_10,tile_path,cord)
timer('create 10m image',start_time_10m)
start_time_20m = timer('create 20m image',None)
# bandes with 20m resolution
#path_cld_20
images_20 = extract_sub_image(bandes_path_20,tile_path,cord,20,1)
start_time_20m = timer('create 20m image',start_time_20m)
start_time_60m = timer('create 60m image',None)
# bandes with 60m resolution
#path_cld_60
images_60 = extract_sub_image(bandes_path_60,tile_path,cord,60)
start_time_60m = timer('create 60m image',start_time_60m)
#
start_time_make_prediction = timer('make prediction',None)
feature = images_10.tolist()+images_20.tolist()+images_60.tolist()
bands = ['B02', 'B03', 'B04', 'B05', 'B06', 'B07', 'B08', 'B8A', 'B11', 'B12','B01','B09']
X = pd.DataFrame([feature],columns = bands)
# vegetation index calculation
X = indices(X)
# load the model from disk
filename = "data/new_version_model.sav"
loaded_model = pickle.load(open(filename, 'rb'))
# make prediction
biomass = loaded_model.predict(X)[0]
carbon = 0.55*biomass
timer('make prediction',start_time_make_prediction)
# NDVI
start_time_make_ndvi = timer('NDVI calculation',None)
ndvi_index = ndvi(cord,name)
timer('NDVI calculation',start_time_make_ndvi)
timer('processing data',start_time_processing)
# deleted download files
delete_tiles()
return str(cld_prob)+ " % cloud coverage", str(days_ago)+" days ago",str(biomass)+" Kg/ha", str(carbon)+" KgC/ha","NDVI: "+ str(ndvi_index)
# Create title, description and article strings
title = "🌴BEEPAS : Biomass estimation to Evaluate the Environmental Performance of Agroforestry Systems🌴"
description = "This application estimates the biomass of areas in ivory coast using AI and satellite images (S2)."
article = "Created by data354."
# Create examples list from "examples/" directory
#example_list = [["examples/" + example] for example in os.listdir("examples")]
example_list = [["Foret du banco :",5.379913, -4.050445],["Pharmacie Y4 :",5.363292, -3.9481601],["Hotel ivoire : ",5.316458, -4.017172],["Adjamé :",5.346938, -4.027849]]
outputs = [
gr.Textbox(label="Cloud coverage"),
gr.Textbox(label="Number of days since sensing"),
gr.Textbox(label="Above ground biomass density(AGBD) Kg/ha"),
gr.Textbox(label="Carbon stock density KgC/ha "),
gr.Textbox(label="Mean NDVI"),]
demo = gr.Interface(
fn=predict,
inputs=["text","number", "number"],
outputs=outputs, #[ "text", "text","text","text","text"],
examples=example_list,
title=title,
description=description,
article=article,
)
demo.launch(share=True)