SUAD_Park / src /app.py
Léo Bourrel
remove dependency
687f595
"""App to display images in a gallery"""
import json
import pandas as pd
import numpy as np
import streamlit as st
from image_preprocessing import get_image_caption, get_images, resize_image
import plotly.express as px
from park_statistics import get_plot_from_most_common_elements, aggregate_fauna_elements
from data_models.sql_connection import get_db_connection
from data_models.park_manager import ParkManager
from data_models.image_manager import ImageManager
from data_models.openai_manager import OpenAIManager
from cloud_storage import GoogleCloudStorage
engine, session = get_db_connection()
park_manager = ParkManager()
image_manager = ImageManager()
openai_manager = OpenAIManager()
gcs = GoogleCloudStorage()
def get_image_predictions(images: list[dict]) -> dict:
"""Get predictions for a list of images
Args:
images (list): list of images to get predictions for
Returns:
list: list of predictions for the images
"""
predictions = {}
for image in images:
predictions[image["id"]] = openai_manager.get_predictions(image["id"])
return predictions
def image_gallery(images: list[dict], predictions: dict) -> None:
"""Display a gallery of images in a streamlit app
Args:
images (list): list of images to display
"""
st.title("Welcome")
columns = st.columns(3)
for index, image in enumerate(images):
with columns[index % 3]:
image_blob = gcs.download_blob("suad_park", image["name"])
st.image(
image_blob, width=200, caption=f"Image id #{image['id']}"
)
if not image["id"] in predictions or predictions[image["id"]] is None:
st.write("No predictions available")
continue
st.json(predictions[image["id"]])
def get_park_list() -> list:
return park_manager.get_parks()
def get_park_images(park: str) -> list:
return image_manager.get_images_by_park(park)
def sidebar() -> dict | None:
"""Create a sidebar to select the park
Returns:
selected_park: selected park in the sidebar
"""
park_list = get_park_list()
def _park_list_formatter(park):
return park["name"]
return st.sidebar.selectbox(
label="Park List",
options=park_list,
index=None,
format_func=_park_list_formatter,
)
def display_stats() -> None:
"""Display statistics about the images"""
st.title("Statistics")
st.write("Number of images: ", image_manager.get_image_count())
st.write("Number of parks: ", park_manager.get_park_count())
predictions = openai_manager.get_all_predictions()
df = pd.DataFrame(predictions)
st.markdown("## Most common elements")
st.plotly_chart(get_plot_from_most_common_elements(df, "built_elements", "elements"))
st.markdown("## Fauna identification")
fauna_elements = aggregate_fauna_elements(df)
fauna_elements = pd.DataFrame(fauna_elements.items(), columns=["fauna", "count"])
st.plotly_chart(px.pie(fauna_elements, names="fauna", values="count", labels={"count": "# Animals", "fauna": "Fauna"}))
st.markdown("## Vegetation detection")
st.plotly_chart(get_plot_from_most_common_elements(df, "vegetation_detection", "vegetation"))
def main() -> None:
"""Main function to run the app"""
park = sidebar()
if not park:
display_stats()
st.stop()
images = get_park_images(park["id"])
predictions = get_image_predictions(images)
image_gallery(images, predictions)
if __name__ == "__main__":
main()