File size: 5,666 Bytes
c82f030 6d70836 c82f030 6d70836 9372a94 c82f030 6d70836 3e64c5e 6d70836 3e64c5e 6d70836 e6ef0c2 6d70836 c82f030 6d70836 c82f030 6d70836 9372a94 6d70836 9372a94 fdb6f4b 9372a94 6d70836 9372a94 6d70836 9372a94 fdb6f4b 9372a94 6d70836 9372a94 6d70836 9372a94 6d70836 9372a94 c82f030 9372a94 6d70836 9372a94 6d70836 |
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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
from detectree2model.predictions.predict import run_detectree2
from polygons_processing.postpprocess_detectree2 import postprocess
from generate_tree_images.generate_tree_images import generate_tree_images
from classification.classification_predict import classify
import os
import json
import gradio as gr
import rasterio
from rasterio.plot import show
import geopandas as gpd
import matplotlib.pyplot as plt
from shapely.geometry import Point
def row_to_feature(row):
feature = {
"id": row["id"],
"type": "Feature",
"properties": {"Confidence_score": row["Confidence_score"], "species": row['species']},
"geometry": {"type": "Polygon", "coordinates": [row["coordinates"]]},
}
return feature
# [[first guess, prob],[second guess, prob],[third guess, prob]]
def export_geojson(df, filename):
features = [row_to_feature(row) for idx, row in df.iterrows()]
feature_collection = {
"type": "FeatureCollection",
"crs": {"type": "name", "properties": {"name": "urn:ogc:def:crs:EPSG::32720"}},
"features": features,
}
output_geojson = json.dumps(feature_collection)
with open(f"{filename}.geojson", "w") as f:
f.write(output_geojson)
print(f"GeoJSON data exported to '{filename}.geojson' file.")
"""
tif_input: the file containing a tif that we are analyzing
tif_file_name: the file name of the tif input. tif_input is the folder in which the tif file lies
(detectree2 works with that) but generate_tree_images requires path including the file hence the file name is needed
output_directory: the directory were all in-between and final files are stored
generate_tree_images stores the cutout tree images in a separate folder
"""
def greet(image_path: str):
current_directory = os.getcwd()
output_directory = os.path.join(current_directory, "outputs")
if not os.path.exists(output_directory):
os.makedirs(output_directory)
run_detectree2(image_path, store_path=output_directory)
processed_output_df = postprocess(output_directory + '/detectree2_delin.geojson', output_directory + '/processed_delin')
processed_geojson = output_directory + '/processed_delin.geojson'
generate_tree_images(processed_geojson, image_path)
output_folder = './tree_images'
all_top_3_list = [] # Initialize an empty list to accumulate all top_3 lists
for file_name in os.listdir(output_folder):
file_path = os.path.join(output_folder, file_name)
probs = classify(file_path)
top_3 = probs.head(3)
top_3_list = [[cls, prob] for cls, prob in top_3.items()]
# Accumulate the top_3_list for each file
all_top_3_list.append(top_3_list)
# Assign the accumulated top_3_list to the 'species' column of the dataframe
processed_output_df['species'] = all_top_3_list
final_output_path = 'result'
export_geojson(processed_output_df, final_output_path)
with rasterio.open(image_path) as src:
tif_image = src.read([1, 2, 3]) # Read the first three bands (RGB)
tif_transform = src.transform
# Read the GeoJSON file
geojson_data = gpd.read_file(final_output_path)
# Set the interactive backend to Qt5Agg
plt.switch_backend('Qt5Agg') # You have to install PyQt5
# Enable interactive mode
plt.ion()
# Plotting
fig, ax = plt.subplots(figsize=(10, 10))
# Plot the RGB TIF image
show(tif_image, transform=tif_transform, ax=ax)
# Plot the GeoJSON polygons
geojson_data.plot(ax=ax, facecolor='none', edgecolor='red')
# Set plot title
ax.set_title('TIF Image with Tree Crowns Overlay')
# Create an annotation box
annot = ax.annotate("", xy=(0, 0), xytext=(20, 20),
textcoords="offset points",
bbox=dict(boxstyle="round", fc="w"),
arrowprops=dict(arrowstyle="->"))
annot.set_visible(False)
# Create a function to handle mouse clicks
def on_click(event):
if event.inaxes is not None:
# Get the coordinates of the click
click_point = Point(event.xdata, event.ydata)
# Check if the click is within any of the polygons
for idx, row in geojson_data.iterrows():
if row['geometry'].contains(click_point):
# Access the properties dictionarㅋ
# Extract species and confidence score
species_info = row['species']
confidence_score = row['Confidence_score']
# Display information about the clicked polygon
annot.xy = (event.xdata, event.ydata)
text = f"Polygon {idx}\n\nConfidence:\n{confidence_score}\n\nSpecies and their probability:\n{species_info}"
annot.set_text(text)
annot.set_visible(True)
fig.canvas.draw()
break
# Connect the click event to the handler function
cid = fig.canvas.mpl_connect('button_press_event', on_click)
figure = plt.figure()
return figure
#tif_file_name = "TreeCrownVectorDataset_761588_9673769_20_20_32720.tif"
#tif_input = "/Users/jonathanseele/ETH/Hackathons/EcoHackathon/WeCanopy/test/" + tif_file_name
# File paths
#tif_file_path = '/Users/taekim/ecohackathon/WeCanopy/test/TreeCrownVectorDataset_761588_9673769_20_20_32720.tif'
#geojson_file_path = '/Users/taekim/ecohackathon/WeCanopy/test/result.geojson'
# Read the TIF file
demo = gr.Interface(
fn=greet,
inputs=gr.File(type='filepath'),
outputs=gr.Plot(label="Tree Crowns")
)
demo.launch()
|