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)) | |
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) | |