from typing import List from PIL import Image import pandas as pd 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): whale_name = whale_class.replace("_", " ").title() return whale_name def display_whale(whale_classes:List[str], i:int, viewcontainer=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: The container to display the whale information. If not provided, use the current streamlit context (works via 'with ' syntax) Returns: None TODO: how to find the object type of viewcontainer.? they are just "deltagenerators" but we want the result of the generator.. In any case, it works ok with either call signature. """ import streamlit as st 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]) ) image = Image.open("images/references/" + df_whale_img_ref.loc[whale_classes[i], "WHALE_IMAGES"]) viewcontainer.image(image, caption=df_whale_img_ref.loc[whale_classes[i], "WHALE_REFERENCES"]) # link st.markdown(f"[{df.loc[whale_classes[i], 'WHALE_REFERENCES']}]({df.loc[whale_classes[i], 'WHALE_REFERENCES']})")