BEEPASv3 / app.py
youl's picture
Update app.py
9d75349 verified
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
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
import pickle as pk
import json
#import boto3
from shapely.geometry import MultiPolygon,shape
from shapely.geometry import Point
from shapely.geometry.polygon import Polygon
from glob import glob
import wget
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 "Choisissez une zone de la CI","","","",""
else:
df = pd.read_csv("data/frame.csv")
name = find_good_tile(df,point2)
if name ==404:
reponse = "Sentinel-2 ne dispose pas de données ce sur ce lieu à ce jour"
return reponse,"","","",""
else:
path = "https://data354-public-assets.s3.eu-west-3.amazonaws.com/cisentineldata/"
url = path+name
#wget.download(url)
unzip()
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)
# create image dataset
images_10 = extract_sub_image(bandes_path_10,tile_path,cord)
# bandes with 20m resolution
#path_cld_20
images_20 = extract_sub_image(bandes_path_20,tile_path,cord,20,1)
# bandes with 60m resolution
#path_cld_60
images_60 = extract_sub_image(bandes_path_60,tile_path,cord,60)
#
feature = images_10.tolist()+images_20.tolist()+images_60.tolist()
bands = ['B02', 'B03', 'B04', 'B05', 'B06', 'B07', 'B08', 'B8A', 'B11', 'B12','B01','B09']
print("feature : ",feature)
print("BANDES : ",bands)
X = pd.DataFrame([feature],columns = bands)
print("==================== X SHAPE", X.shape)
## Coordinate
cord_df = pd.DataFrame({"Latitude":[lat],
"Longitude":[lon]})
#print("==================== cord_df SHAPE", cord_df.shape)
## PCA dimension reduction
# later reload the pickle file
sdc_reload = pk.load(open("data/sdc.pkl",'rb'))
pca_reload = pk.load(open("data/pca.pkl",'rb'))
# standardization
X_pca = sdc_reload.transform(X)
# make pca
principalComponents = pca_reload .transform(X_pca)
principalDf = pd.DataFrame(data =principalComponents[:,:4],
columns = ["PC1","PC2","PC3","PC4"])
#print("==================== principalDf SHAPE", principalDf.shape)
# vegetation index calculation
X = indices(X)
# Drop all 12 bands of S2
tab = list(range(12))
X_index = X.drop(X.iloc[:,tab],axis=1)
#print("=============SHAPE1",X_index.shape)
# Create predictive features
X_final =pd.concat([cord_df,principalDf,X_index],axis=1)
#print("=============SHAPE2",X_final.shape)
# load the model from disk
filename = "data/finalized_model4.sav"
loaded_model = pk.load(open(filename, 'rb'))
# make prediction
biomass = loaded_model.predict(X_final)[0]
if biomass<0:
biomass =0.0
carbon = 0.55*biomass
# NDVI
ndvi_index = ndvi(cord,name)
# deleted download files
#delete_tiles()
return str(cld_prob)+ " % cloud coverage", str(days_ago)+" days ago",str(biomass)+" t/ha", str(carbon)+" tC/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 certain areas 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],["Treichville Bernabé :",5.293168, -3.999796],["Adjamé :",5.346938, -4.027849],["ile boulay :",5.280498,-4.089883]]
outputs = [
gr.Textbox(label="Cloud coverage"),
gr.Textbox(label="Number of days since sensing"),
gr.Textbox(label="Above ground biomass density(AGBD) t/ha"),
gr.Textbox(label="Carbon stock density tC/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)