Siddharth Maddali
Better color scaling in activation maps
5a43470
# AUTOGENERATED! DO NOT EDIT! File to edit: four-way-classifier.ipynb.
# %% auto 0
__all__ = ['learn', 'categories', 'model', 'description', 'image', 'label', 'examples', 'interf', 'get_best_layout',
'create_plots', 'classify_image']
# %% four-way-classifier.ipynb 1
from fastai.vision.all import *
import gradio as gr
import PIL
import glob
import primefac
from torchviz import make_dot
from pytorch_grad_cam.utils.image import preprocess_image
# %% four-way-classifier.ipynb 2
warnings.filterwarnings( 'ignore' )
warnings.simplefilter( 'ignore' )
# plt.rcParams[ 'figure.figsize' ] = [ 15, 15 ]
plt.rcParams[ 'figure.autolayout' ] = True
# %% four-way-classifier.ipynb 3
def get_best_layout( num_imgs, img_size ):
prime_factors = list( primefac.primefac( num_imgs ) )
aspect_ratios = []
for n in range( len( prime_factors[1:-1] ) ):
n1 = np.prod( prime_factors[:n] )
n2 = np.prod( prime_factors[n:] )
assert n1 * n2 == num_imgs
aspect_ratios.append( [ n1, n2, np.abs( img_size[0]/img_size[1] - ( n1/n2 ) ) ] )
# print( aspect_ratios )
n1_final, n2_final = tuple( aspect_ratios[ np.argmin( [ elem[2] for elem in aspect_ratios ] ) ] )[:2]
return n1_final, n2_final
def create_plots( output_tensor, title, fontsize=24 ):
# temp = output_tensor.detach().numpy()
# mn, mx = temp.min(), temp.max()
img_list = [ output_tensor[0][n].detach().numpy() for n in range( output_tensor.shape[1] ) ]
fig = plt.figure()
M, N = get_best_layout( len( img_list ), img_list[0].shape )
ax = fig.subplots( M, N )
for N0, img in enumerate( img_list ):
m = N0//N
n = N0%N
im = ax[m,n].imshow( img, cmap='gray' )
ax[m,n].axis( 'off' )
# im.set_clim( [ mn, mx ] )
plt.suptitle( title, fontsize=fontsize )
# plt.subplots_adjust( hspace=0.01, wspace=0.01 )
plt.tight_layout()
img_buf = io.BytesIO()
plt.savefig(img_buf, format='png')
im = Image.open(img_buf)
return im
def classify_image( img ):
pred, idx, probs = learn.predict( img )
# print( 'This is a %s'%pred )
model = learn.model.eval()
rgb_img = np.float32( np.array( img ) ) / 255
input_tensor = preprocess_image(
rgb_img,
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)
im1 = create_plots( model[0][:3]( input_tensor ), title='Inferred features at model[0][:3]' )
im2 = create_plots( model[0][:5]( input_tensor ), title='Inferred features at model[0][:5]' )
im3 = create_plots( model[0][:7]( input_tensor ), title='Inferred features at model[0][:7]' )
return ( dict( zip( categories, map( float, probs ) ) ), im1, im2, im3 )
# %% four-way-classifier.ipynb 4
learn = load_learner( 'simple-image-classifier.pkl' )
categories = [ 'bird', 'forest', 'otter', 'snake' ]
model = learn.model.eval()
# %% four-way-classifier.ipynb 5
description='''
A simple 4-way classifier that categorizes images as 'snake', 'bird', 'otter' or 'forest'.
Refined from a pre-trained ResNet18 model downloaded from HuggingFace.
The actual classification for each test image actually takes a very short time; the delay in displaying results is due to
the extra step of plotting the intermediate activation maps and inferred features in `matplotlib`.
**DISCLAIMER**: the images here are merely for demonstration purposes. I don't own any of them and I'm not making money from them.
'''
# with gr.Blocks() as layout:
image = gr.components.Image()
label = [ gr.components.Label(), gr.components.Image(), gr.components.Image(), gr.components.Image() ]
examples = glob.glob( './*.jpg' )
# with gr.Row():
interf = gr.Interface(
title='Simple 4-way image classifier',
description=description,
fn=classify_image,
inputs=image,
outputs=label,
examples=examples,
allow_flagging='manual'
)
interf.launch( inline=True )