saving-willy-dev / src /whale_viewer.py
vancauwe's picture
Merge branch 'dev' into feat/image-batch
330b67d
raw
history blame
6.14 kB
from typing import List
import streamlit as st
from streamlit.delta_generator import DeltaGenerator
from PIL import Image
import pandas as pd
import os
WHALE_CLASSES = [
"beluga",
"blue_whale",
"bottlenose_dolphin",
"brydes_whale",
"commersons_dolphin",
"common_dolphin",
"cuviers_beaked_whale",
"dusky_dolphin",
"false_killer_whale",
"fin_whale",
"frasiers_dolphin",
"gray_whale",
"humpback_whale",
"killer_whale",
"long_finned_pilot_whale",
"melon_headed_whale",
"minke_whale",
"pantropic_spotted_dolphin",
"pygmy_killer_whale",
"rough_toothed_dolphin",
"sei_whale",
"short_finned_pilot_whale",
"southern_right_whale",
"spinner_dolphin",
"spotted_dolphin",
"white_sided_dolphin",
]
WHALE_IMAGES = [
"beluga.webp",
"blue-whale.webp",
"bottlenose_dolphin.webp",
"brydes.webp",
"common_dolphin.webp",
"common_dolphin.webp",
"cuviers_beaked_whale.webp",
"common_dolphin.webp",
"false-killer-whale.webp",
"fin-whale.webp",
"fin-whale.webp",
"gray-whale.webp",
"Humpback.webp",
"killer_whale.webp",
"640x427-long-finned-pilot-whale.webp",
"melon.webp",
"minke-whale.webp",
"pantropical-spotted-dolphin.webp",
"pygmy-killer-whale.webp",
"rough-toothed-dolphin.webp",
"sei.webp",
"Whale_Short-Finned_Pilot-markedDW.png", ## Background
"640x427-southern-right-whale.jpg", ## background
"spinner.webp",
"pantropical-spotted-dolphin.webp", ## duplicate also used for
"640x427-atlantic-white-sided-dolphin.jpg", ##background
]
WHALE_REFERENCES = [
"https://www.fisheries.noaa.gov/species/beluga-whale",
"https://www.fisheries.noaa.gov/species/blue-whale",
"https://www.fisheries.noaa.gov/species/common-bottlenose-dolphin",
"https://www.fisheries.noaa.gov/species/brydes-whale",
"https://en.wikipedia.org/wiki/Commerson's_dolphin",
#"commersons_dolphin - reference missing - classification to be verified", ## class matching to be verified
"https://www.fisheries.noaa.gov/species/short-beaked-common-dolphin",
"https://www.fisheries.noaa.gov/species/cuviers-beaked-whale",
"https://en.wikipedia.org/wiki/Dusky_dolphin",
#"dusky_dolphin - reference missing - classification to be verified", ## class matching to be verified
"https://www.fisheries.noaa.gov/species/false-killer-whale",
"https://www.fisheries.noaa.gov/species/fin-whale",
"https://www.fisheries.noaa.gov/species/frasers-dolphin",
#"frasiers_dolphin - reference missing - classification to be verified", ## class matching to be verified
"https://www.fisheries.noaa.gov/species/gray-whale",
"https://www.fisheries.noaa.gov/species/humpback-whale",
"https://www.fisheries.noaa.gov/species/killer-whale",
"https://www.fisheries.noaa.gov/species/long-finned-pilot-whale",
"https://www.fisheries.noaa.gov/species/melon-headed-whale",
"https://www.fisheries.noaa.gov/species/minke-whale",
"https://www.fisheries.noaa.gov/species/pantropical-spotted-dolphin",
"https://www.fisheries.noaa.gov/species/pygmy-killer-whale",
"https://www.fisheries.noaa.gov/species/rough-toothed-dolphin",
"https://www.fisheries.noaa.gov/species/sei-whale",
"https://www.fisheries.noaa.gov/species/short-finned-pilot-whale",
"https://www.fisheries.noaa.gov/species/southern-right-whale",
"https://www.fisheries.noaa.gov/species/spinner-dolphin",
"https://www.fisheries.noaa.gov/species/pantropical-spotted-dolphin",
"https://www.fisheries.noaa.gov/species/atlantic-white-sided-dolphin",
]
# Create a dataframe
df_whale_img_ref = pd.DataFrame(
{
"WHALE_CLASSES": WHALE_CLASSES,
"WHALE_IMAGES": WHALE_IMAGES,
"WHALE_REFERENCES": WHALE_REFERENCES,
}
).set_index("WHALE_CLASSES")
def format_whale_name(whale_class:str) -> str:
"""
Formats a whale class name for display
Args:
whale_class (str): The class name of the whale, with words separated by underscores.
Returns:
str: The formatted whale name with spaces instead of underscores and each word capitalized.
"""
whale_name = whale_class.replace("_", " ").title()
return whale_name
def display_whale(whale_classes:List[str], i:int, viewcontainer:DeltaGenerator=None) -> None:
"""
Display whale image and reference to the provided viewcontainer.
Args:
whale_classes (List[str]): A list of whale class names.
i (int): The index of the whale class to display.
viewcontainer (streamlit.delta_generator.DeltaGenerator): The container
to display the whale information. If not provided, use the current
streamlit context (works via 'with `container`' syntax)
Returns:
None
"""
if viewcontainer is None:
viewcontainer = st
# validate the input i should be within the range of the whale_classes
if i >= len(whale_classes):
raise ValueError(f"Index {i} is out of range. The whale_classes list has only {len(whale_classes)} elements.")
# validate the existence of the whale class in the dataframe as a row key
if whale_classes[i] not in df_whale_img_ref.index:
raise ValueError(f"Whale class {whale_classes[i]} not found in the dataframe.")
viewcontainer.markdown(
":whale: #" + str(i + 1) + ": " + format_whale_name(whale_classes[i])
)
current_dir = os.getcwd()
image_path = os.path.join(current_dir, "src/images/references/")
image = Image.open(image_path + df_whale_img_ref.loc[whale_classes[i], "WHALE_IMAGES"])
viewcontainer.image(image, caption=df_whale_img_ref.loc[whale_classes[i], "WHALE_REFERENCES"], use_column_width=True)