import json import os import joblib import matplotlib.pyplot as plt import numpy as np import streamlit as st from matplotlib.colors import ListedColormap from tensorflow.keras.models import load_model from utils.utils import input_predict # Load models and other resources directory = "utils" model_1_path = os.path.join(directory, "nnmodel_117d.keras") model_2_path = os.path.join(directory, "nnmodel_2d.keras") pca_adim_path = os.path.join(directory, "pca_2d.pkl") json_file_path = os.path.join(directory, "columns.json") mushroom_attributes_path = os.path.join(directory, "mushroom_attributes.json") prediction_grid_path = os.path.join(directory, "pred_grid.npz") model_1 = load_model(model_1_path) model_2 = load_model(model_2_path) pca_2d_loaded = joblib.load(pca_adim_path) with open(json_file_path, 'r') as json_file: df_columns = json.load(json_file) with open(mushroom_attributes_path, 'r') as json_file: loaded_dicts = json.load(json_file) with np.load(prediction_grid_path) as data: xx = data['xx'] yy = data['yy'] Z = data['Z'] example_input = { 'cap-shape': 'convex', 'cap-surface': 'smooth', 'cap-color': 'white', 'bruises': 'bruises', 'odor': 'pungent', 'gill-attachment': 'free', 'gill-spacing': 'close', 'gill-size': 'narrow', 'gill-color': 'black', 'stalk-shape': 'enlarging', 'stalk-root': 'equal', 'stalk-surface-above-ring': 'smooth', 'stalk-surface-below-ring': 'smooth', 'stalk-color-above-ring': 'white', 'stalk-color-below-ring': 'white', 'veil-type': 'partial', 'veil-color': 'white', 'ring-number': 'one', 'ring-type': 'pendant', 'spore-print-color': 'black', 'population': 'several', 'habitat': 'grasses' } st.title('Mushroom Classification') input_data = {} keys = list(example_input.keys()) for i in range(0, len(keys), 4): cols = st.columns(4) for col, key in zip(cols, keys[i:i + 4]): options = list(loaded_dicts.get(key.replace('-', '_') + '_dict', {}).values()) input_data[key] = col.selectbox( label=key.replace('_', ' ').title(), options=options, index=options.index(example_input[key]) if example_input[key] in options else 0, ) boundary_color1 = 'palegreen' boundary_color2 = 'lightcoral' custom_cmap = ListedColormap([boundary_color1, boundary_color2]) submitted = st.button('Submit') if submitted: mushroom_input = np.array([list(input_data.values())]) predict = input_predict(input_data, df_columns=df_columns, model_1=model_1, model_2=model_2, pca=pca_2d_loaded) print(str(predict[1][0])) if str(predict[1][0]) == 'poisonous': header_col = 'red' else: header_col = 'green' st.header(f':{header_col}[{str(predict[1][0]).upper()}]', anchor=False, divider=header_col) if not predict[2]: st.markdown( '⚠ Potential Misleading Plot', unsafe_allow_html=True ) st.markdown( 'The plotted data may be misleading because the Principal Component Analysis (PCA) used for dimensionality reduction only explains 30% of the variance in the original dataset.', unsafe_allow_html=True ) vec_2d_imput = predict[0] train_size = 50 fig, ax = plt.subplots(figsize=(9, 7)) ax.contourf(xx, yy, Z, np.linspace(0, 1, 3), alpha=0.3, cmap=custom_cmap) prediction_test = ax.scatter(vec_2d_imput[:, 0], vec_2d_imput[:, 1], marker='x', c='k', s=200, label=f'Prediction') train_edible_marker = ax.scatter([], [], c=boundary_color1, label='Edible', s=train_size, marker='o') train_poisonus_marker = ax.scatter([], [], c=boundary_color2, label='Poisonus', s=train_size, marker='o') ax.legend(handles=[train_edible_marker, train_poisonus_marker, prediction_test]) ax.axis('off') plt.subplots_adjust(left=0, right=1, top=1, bottom=0) st.pyplot(fig) # streamlit run C:/Users/teoto/PycharmProjects/huggingface_app/app.py