Spaces:
Sleeping
Sleeping
| # -*- coding: utf-8 -*- | |
| """ | |
| Created on Mon Apr 17 08:43:48 2023 | |
| @author: mritchey | |
| """ | |
| import keras | |
| import streamlit as st | |
| from PIL import Image | |
| import pandas as pd | |
| import numpy as np | |
| from keras import layers | |
| import matplotlib.pyplot as plt | |
| def get_img_array(img_path, target_size): | |
| array = keras.utils.img_to_array(img) | |
| array = np.expand_dims(array, axis=0) | |
| return array | |
| st.set_page_config(layout="wide") | |
| model_type = st.sidebar.selectbox( | |
| 'Select Model', ('VGG16', 'VGG19', 'ResNet50V2', 'MobileNetV2')) | |
| models = {'VGG16': 'vgg16', 'VGG19': 'vgg19', 'ResNet50V2': 'resnet_v2', | |
| 'MobileNetV2': 'mobilenet_v2'} | |
| model_type2 = models[model_type] | |
| top_n = st.sidebar.selectbox('Number of Results', (3, 5, 10, 100,500)) | |
| results = st.sidebar.selectbox('Display Summary', ('No','Yes')) | |
| display = st.sidebar.selectbox('Display Filtered Images', ('No','Yes')) | |
| exec(f'from keras.applications.{model_type2} import {model_type}') | |
| exec( | |
| f'from keras.applications.{model_type2} import preprocess_input, decode_predictions') | |
| model = eval(f'{model_type}(weights="imagenet")') | |
| img_path = st.file_uploader("Upload Picture") | |
| try: | |
| img = Image.open(img_path) | |
| except: | |
| img = Image.open('dog.jpg') | |
| img = img.resize((224, 224)) # Resize to match VGG16 input size | |
| x = np.array(img) | |
| x = np.expand_dims(x, axis=0) | |
| x = preprocess_input(x) | |
| # Make predictions on the image | |
| preds = model.predict(x) | |
| # Convert the predictions to human-readable labels | |
| decoded_preds = decode_predictions(preds, top=top_n)[0] | |
| df = pd.DataFrame(decoded_preds) | |
| df.columns = ['label', 'Object', 'Percent Certainty'] | |
| df.index = df.index+1 | |
| df = df[['Object', 'Percent Certainty']] | |
| df['Percent Certainty'] = df['Percent Certainty'].apply( | |
| lambda x: '{:.2%}'.format(x)) | |
| # with st.container(): | |
| with st.container(): | |
| col1, col2 = st.columns((1,3)) | |
| with col1: | |
| st.image(img,width=400) | |
| with col2: | |
| st.dataframe(df) | |
| with st.container(): | |
| col1, col2 = st.columns((2, 4)) | |
| if results=='Yes': | |
| with col1: | |
| stringlist = [] | |
| model.summary(print_fn=lambda x: stringlist.append(x)) | |
| short_model_summary = "\n".join(stringlist) | |
| print(short_model_summary) | |
| st.write(short_model_summary) | |
| if display =='Yes': | |
| img_tensor = get_img_array(img, target_size=(224, 224)) | |
| layer_outputs = [] | |
| layer_names = [] | |
| for layer in model.layers: | |
| if isinstance(layer, (layers.Conv2D, layers.MaxPooling2D)): | |
| layer_outputs.append(layer.output) | |
| layer_names.append(layer.name) | |
| activation_model = keras.Model(inputs=model.input, outputs=layer_outputs) | |
| activations = activation_model.predict(img_tensor) | |
| first_layer_activation = activations[0] | |
| plt.matshow(first_layer_activation[0, :, :, 5], cmap="viridis") | |
| images_per_row = 16 | |
| all_pngs=[] | |
| for layer_name, layer_activation in zip(layer_names, activations): | |
| n_features = layer_activation.shape[-1] | |
| size = layer_activation.shape[1] | |
| n_cols = n_features // images_per_row | |
| display_grid = np.zeros(((size + 1) * n_cols - 1, | |
| images_per_row * (size + 1) - 1)) | |
| for col in range(n_cols): | |
| for row in range(images_per_row): | |
| channel_index = col * images_per_row + row | |
| channel_image = layer_activation[0, :, :, channel_index].copy() | |
| if channel_image.sum() != 0: | |
| channel_image -= channel_image.mean() | |
| channel_image /= channel_image.std() | |
| channel_image *= 64 | |
| channel_image += 128 | |
| channel_image = np.clip(channel_image, 0, 255).astype("uint8") | |
| display_grid[ | |
| col * (size + 1): (col + 1) * size + col, | |
| row * (size + 1) : (row + 1) * size + row] = channel_image | |
| scale = 1. / size | |
| plt.figure(figsize=(scale * display_grid.shape[1], | |
| scale * display_grid.shape[0])) | |
| plt.title(layer_name) | |
| plt.grid(False) | |
| plt.axis("off") | |
| plt.imshow(display_grid, aspect="auto", cmap="viridis") | |
| filename=f'{layer_name}.png' | |
| plt.savefig(f'{layer_name}.png') | |
| all_pngs.append(filename) | |
| with col2: | |
| for i in all_pngs: st.image(i) | |