File size: 4,864 Bytes
98e563e
 
 
 
 
 
 
 
e6c27ee
98e563e
 
 
 
 
 
7f7d638
66c9d87
e6c27ee
 
 
 
 
 
a177517
98e563e
7f7d638
98e563e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2faec43
98e563e
 
66c9d87
98e563e
 
66c9d87
98e563e
2faec43
98e563e
 
66c9d87
98e563e
 
 
66c9d87
7f7d638
66c9d87
98e563e
66c9d87
7f7d638
66c9d87
98e563e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66c9d87
98e563e
 
 
 
 
 
 
 
dc6eb16
98e563e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import gradio as gr
from api import *
from processing import *
import pandas as pd
from indices import indices
import xgboost as xgb
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(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)
            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']
            X = pd.DataFrame([feature],columns = bands)
            # vegetation index calculation
            X = indices(X)
            # load the model from disk
            filename = "data/finalized_model.sav"
            loaded_model = pickle.load(open(filename, 'rb'))
            # make prediction
            biomass = loaded_model.predict(X)[0]
            carbon = 0.55*biomass

            # NDVI
            ndvi_index = ndvi(cord,name)
            timer('processing data',start_time_processing)

            # deleted download files
            delete_tiles()

            return str(cld_prob)+ " % cloud coverage", str(days_ago)+" days ago",str(biomass)+" Mg/ha", str(carbon)+" MgC/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 = [[5.379913, -4.050445],[6.54644,-7.86156],[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) Mg/ha"),
    gr.Textbox(label="Carbon stock density MgC/ha "),
    gr.Textbox(label="Mean NDVI"),]


demo = gr.Interface(
    fn=predict,
    inputs=["number", "number"],
    outputs=outputs, #[ "text", "text","text","text","text"],
    examples=example_list,
    title=title,
    description=description,
    article=article,
    )

demo.launch(share=True)