Commit 329f6a82 authored by Darshan Prabhu's avatar Darshan Prabhu

Initial Commit

parents
File added
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
"""
Django settings for project project.
Generated by 'django-admin startproject' using Django 2.2.
For more information on this file, see
https://docs.djangoproject.com/en/2.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.2/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '783akcsgqs_0x9ja_e66j7e(y$oymi_lx20s511$1y93-bu_08'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'visualization',
'django_drf_filepond',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'project.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'project.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
STATIC_URL = '/static/'
DJANGO_DRF_FILEPOND_UPLOAD_TMP = os.path.join(BASE_DIR, 'visualization/static/temp-image-uploads')
DJANGO_DRF_FILEPOND_FILE_STORE_PATH = os.path.join(BASE_DIR, 'visualization/static/image-uploads')
\ No newline at end of file
"""project URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
from django.conf.urls import url
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('visualization.urls')),
url(r'^fp/', include('django_drf_filepond.urls')),
]
"""
WSGI config for project project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
application = get_wsgi_application()
absl-py==0.11.0
astunparse==1.6.3
cached-property==1.5.2
cachetools==4.1.1
certifi==2020.11.8
chardet==3.0.4
cycler==0.10.0
Django==2.2
django-drf-filepond==0.3.0
django-storages==1.10.1
djangorestframework==3.12.2
gast==0.3.3
google-auth==1.23.0
google-auth-oauthlib==0.4.2
google-pasta==0.2.0
grpcio==1.34.0
h5py==2.10.0
idna==2.10
importlib-metadata==3.1.1
Keras==2.4.3
Keras-Preprocessing==1.1.2
kiwisolver==1.3.1
Markdown==3.3.3
matplotlib==3.3.3
numpy==1.18.5
oauthlib==3.1.0
opencv-python==4.4.0.46
opt-einsum==3.3.0
Pillow==8.0.1
protobuf==3.14.0
pyasn1==0.4.8
pyasn1-modules==0.2.8
pyparsing==2.4.7
python-dateutil==2.8.1
pytz==2020.4
PyYAML==5.3.1
requests==2.25.0
requests-oauthlib==1.3.0
rsa==4.6
scipy==1.5.4
shortuuid==1.0.1
six==1.15.0
sqlparse==0.4.1
tensorboard==2.4.0
tensorboard-plugin-wit==1.7.0
tensorflow==2.3.1
tensorflow-estimator==2.3.0
termcolor==1.1.0
urllib3==1.26.2
Werkzeug==1.0.1
wrapt==1.12.1
zipp==3.4.0
from django.contrib import admin
# Register your models here.
from django.apps import AppConfig
class VisualizationConfig(AppConfig):
name = 'visualization'
'''Collection of mappings used throughout the project.
``Color Choices``: A list of colors that can be used to get color variations .
'''
color_choices = (
'teal',
'brown',
'red',
'violet',
'olive',
'grey',
'purple',
'orange',
'primary'
'inverted yellow',
'inverted olive',
'inverted violet',
'inverted green',
'inverted red'
)
\ No newline at end of file
import os
from keras.models import Model
from matplotlib import pyplot as plt
def generate_visualizations(model,input_image,root_dir):
try:
os.mkdir(root_dir)
except OSError as error:
pass
no_conv_layers = 1
plt.axis('off')
plt.imshow(input_image)
plt.savefig(os.path.join(root_dir,'input.jpg'),transparent=True)
for layer in model.layers:
if 'conv' in layer.name:
try:
os.mkdir(os.path.join(root_dir,'conv{}'.format(no_conv_layers)))
except OSError as error:
pass
op = Model(inputs=model.inputs,outputs=model.layers[no_conv_layers-1].output)
# Output images
pred = op.predict(input_image[np.newaxis,...,np.newaxis])
index = 0
count = pred.shape[-1]
while count != index:
plt.imshow(pred[0,:,:,index])
plt.savefig(os.path.join(root_dir,'conv{}'.format(no_conv_layers),'{}.jpg'.format(index+1)),transparent=True)
index += 1
# Save weights
weights,bias = layer.get_weights()
file = open(os.path.join(root_dir,'meta.txt'), "a")
file.write('{}\n{}\n{}\n'.format(weights.shape[0],weights.shape[2],weights.shape[3]))
file.close()
min_val,max_val = weights.min(), weights.max()
weights = (weights - min_val)/(max_val-min_val+1e-8)
depth = weights.shape[2]
dimensions = (100,100)
for index in range(weights.shape[-1]):
weight = weights[:,:,:,index]
for channel in range(depth):
final_image = cv.resize(weight[:,:,channel], dimensions, interpolation = cv.INTER_AREA)
plt.imshow(final_image,cmap='gray')
plt.savefig(os.path.join(root_dir,'conv{}'.format(no_conv_layers),'{}-{}.jpg'.format(index+1,channel+1)),transparent=True)
no_conv_layers += 1
from django.db import models
# Create your models here.
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Neural Network Visualization{% endblock %}</title>
<script
src="https://code.jquery.com/jquery-3.5.1.min.js"
integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.7/semantic.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.7/semantic.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/components/icon.min.css" integrity="sha512-8Tb+T7SKUFQWOPIQCaLDWWe1K/SY8hvHl7brOH8Nz5z1VT8fnf8B+9neoUzmFY3OzkWMMs3OjrwZALgB1oXFBg==" crossorigin="anonymous" />
{% block imports %}
{% endblock %}
<style type="text/css">
.conv-card{
background-color: floralwhite !important;
}
{% block styling %}
{% endblock %}
</style>
</head>
<body>
<!-- Menu -->
<div class="ui attached stackable inverted menu">
<div class="ui container">
<a class="item">MODEL VISUALIZATION</a>
<a class="item" href='#'>
<i class="home icon"></i> Home
</a>
<a class="item" href="{% url 'vggInput' %}">
<i class="camera retro icon"></i> VGG Input
</a>
<div class="ui simple dropdown item">
Visualizations
<i class="dropdown icon"></i>
<div class="menu">
<a class="item" href="{% url 'mnist' %}"><i class="list ol icon"></i> Mnist</a>
<a class="item" href="{% url 'flower' %}"><i class="image outline icon"></i> Flower </a>
<a class="item" href="{% url 'catDog' %}"><i class="cat icon"></i><i class="dog icon"></i> Cat-Dog </a>
<a class="item" href="{% url 'vgg' %}"><i class="photo video icon"></i> VGG</a>
</div>
</div>
</div>
</div>
<!-- Content -->
<div class="ui container" style="width: 80%;padding-top: 5em;">
{% block content %}
{% endblock %}
</div>
<!-- Modals -->
<div class="modals">
{% block modals %}
{% endblock %}
</div>
<script type="text/javascript">
{% block scripts %}
{% endblock %}
</script>
</body>
</html>
\ No newline at end of file
{% extends "base.html" %}
{% load static %}
{% load custom_tags %}
{% block title %}{{ model_name }} Visualization{% endblock %}
{% block styling %}
.padded-label{
margin-left: 5.2em !important;
margin-top:-1em !important;
}
.resizing-image{
width: 70% !important;
height: auto !important;
}
{% endblock %}
{% block content %}
<h1 class="ui" style="text-align:center;">CAT-DOG HIDDEN LAYER VISUALIZATION</h1>
{% for class in images %}
<div class="ui fluid card">
<div class="content">
<div class="header">Class Type: {{ class.class_type }}</div>
</div>
<div class="content">
<div class="ui middle aligned center aligned grid">
<div class="four wide column">
<div class="ui header">Input Image</div>
<div class="ui raised teal card" style="margin: 2em auto;">
<div class="image">
<img src="{% static class.images.input %}" style="height:15em;">
</div>
<div class="content">
<div class="header">
Input.jpg
</div>
</div>
<div class="extra content">
<span class="">
Cat-Dog Input
</span>
</div>
</div>
</div>
<div class="eight wide column">
<div class="ui two column grid">
{% for conv_layer in class.images.convolution %}
<div class="column">
<div class="ui raised card">
<div class="content conv-card">
<div class="header">Convolution Layer {{ forloop.counter }}</div>
</div>
<div class="content">
<div class="ui mini statistics" style="margin: 0px auto;padding: 1em 0;">
<div class="brown statistic" style="padding-left: 1em;">
<div class="value">
{{ conv_layer.kernel_size }} x {{ conv_layer.kernel_size }}
</div>
<div class="label">
Kernel Size
</div>
</div>
<div class="brown statistic">
<div class="value">
<i class="layer group icon"></i> {{ conv_layer.current_depth }}
</div>
<div class="label">
Count
</div>
</div>
</div>
<h4 class="ui sub header" style="margin-top: 0;">Visuals</h4>
<div class="ui small feed">
<div class="event">
<div class="content" style="text-align: center;">
<div class="ui buttons">
<button class="ui teal button" onclick="open_modal('weights-{{ class.class_type }}-conv{{ forloop.counter }}')">Weights</button>
<div class="or"></div>
<button class="ui secondary button" onclick="open_modal('outputs-{{ class.class_type }}-conv{{ forloop.counter }}')">Outputs</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="ui fullscreen modal weights-{{ class.class_type }}-conv{{ forloop.counter }}">
<i class="close icon"></i>
<div class="header">Weights of Convolution {{ forloop.counter }}</div>
<div class="scrolling content">
{% for weight in conv_layer.weights %}
<div class="ui segment fluid card">
<a class="left aligned floating ui {% get_table_color forloop.counter0 %} ribbon label">Kernel {{ forloop.counter }}</a>
<div class="content">
<div class="ui four column grid">
{% for link in weight %}
<div class="column">
<div class="ui fluid image">
<img src="{% static link %}" class="resizing-image">
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="ui large modal outputs-{{ class.class_type }}-conv{{ forloop.counter }}">
<i class="close icon"></i>
<div class="header">Outputs of Convolution {{ forloop.counter }}</div>
<div class="scrolling content">
<div class="ui three column grid">
{% for output in conv_layer.outputs %}
<div class="column">
<div class="ui fluid image">
<a class="ui {% get_table_color forloop.counter0 %} ribbon label padded-label"> Kernel {{ forloop.counter }}</a>
<img src="{% static output %}" class="resizing-image">
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="four wide column">
<div class="ui header">Output Image</div>
<div class="ui raised teal card" style="margin: 2em auto;">
<div class="image">
<img src="{% static class.images.output %}" style="height:13em;">
</div>
<div class="content">
<div class="header">
Output.jpg
</div>
</div>
<div class="extra content">
<span class="">
Cat-Dog Output
</span>
</div>
</div>
</div>
</div>
</div>
</div>
{% endfor %}
{% endblock %}
{% block scripts %}
function open_modal(class_name){
$('.'+class_name).modal('show');
}
{% endblock %}
\ No newline at end of file
{% extends "base.html" %}
{% load static %}
{% load custom_tags %}
{% block title %}{{ model_name }} Visualization{% endblock %}
{% block styling %}
.padded-label{
margin-left: 5.2em !important;
margin-top:-1em !important;
}
.resizing-image{
width: 70% !important;
height: auto !important;
}
{% endblock %}
{% block content %}
<h1 class="ui" style="text-align:center;">FLOWER HIDDEN LAYER VISUALIZATION</h1>
{% for class in images %}
<div class="ui fluid card">
<div class="content">
<div class="header">Class Type: {{ class.class_type }}</div>
</div>
<div class="content">
<div class="ui middle aligned center aligned grid">
<div class="four wide column">
<div class="ui header">Input Image</div>
<div class="ui raised teal card" style="margin: 2em auto;">
<div class="image">
<img src="{% static class.images.input %}" style="height:15em;">
</div>
<div class="content">
<div class="header">
Input.jpg
</div>
</div>
<div class="extra content">
<span class="">
Flower Input
</span>
</div>
</div>
</div>
<div class="eight wide column">
<div class="ui two column grid">
{% for conv_layer in class.images.convolution %}
<div class="column">
<div class="ui raised card">
<div class="content conv-card">
<div class="header">Convolution Layer {{ forloop.counter }}</div>
</div>
<div class="content">
<div class="ui mini statistics" style="margin: 0px auto;padding: 1em 0;">
<div class="brown statistic" style="padding-left: 1em;">
<div class="value">
{{ conv_layer.kernel_size }} x {{ conv_layer.kernel_size }}
</div>
<div class="label">
Kernel Size
</div>
</div>
<div class="brown statistic">
<div class="value">
<i class="layer group icon"></i> {{ conv_layer.current_depth }}
</div>
<div class="label">
Count
</div>
</div>
</div>
<h4 class="ui sub header" style="margin-top: 0;">Visuals</h4>
<div class="ui small feed">
<div class="event">
<div class="content" style="text-align: center;">
<div class="ui buttons">
<button class="ui teal button" onclick="open_modal('weights-{{ class.class_type }}-conv{{ forloop.counter }}')">Weights</button>
<div class="or"></div>
<button class="ui secondary button" onclick="open_modal('outputs-{{ class.class_type }}-conv{{ forloop.counter }}')">Outputs</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="ui fullscreen modal weights-{{ class.class_type }}-conv{{ forloop.counter }}">
<i class="close icon"></i>
<div class="header">Weights of Convolution {{ forloop.counter }}</div>
<div class="scrolling content">
{% for weight in conv_layer.weights %}
<div class="ui segment fluid card">
<a class="left aligned floating ui {% get_table_color forloop.counter0 %} ribbon label">Kernel {{ forloop.counter }}</a>
<div class="content">
<div class="ui four column grid">
{% for link in weight %}
<div class="column">
<div class="ui fluid image">
<img src="{% static link %}" class="resizing-image">
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="ui large modal outputs-{{ class.class_type }}-conv{{ forloop.counter }}">
<i class="close icon"></i>
<div class="header">Outputs of Convolution {{ forloop.counter }}</div>
<div class="scrolling content">
<div class="ui three column grid">
{% for output in conv_layer.outputs %}
<div class="column">
<div class="ui fluid image">
<a class="ui {% get_table_color forloop.counter0 %} ribbon label padded-label"> Kernel {{ forloop.counter }}</a>
<img src="{% static output %}" class="resizing-image">
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="four wide column">
<div class="ui header">Output Image</div>
<div class="ui raised teal card" style="margin: 2em auto;">
<div class="image">
<img src="{% static class.images.output %}" style="height:13em;">
</div>
<div class="content">
<div class="header">
Output.jpg
</div>
</div>
<div class="extra content">
<span class="">
Flower Output
</span>
</div>
</div>
</div>
</div>
</div>
</div>
{% endfor %}
{% endblock %}
{% block scripts %}
function open_modal(class_name){
$('.'+class_name).modal('show');
}
{% endblock %}
\ No newline at end of file
{% extends "base.html" %}
{% load static %}
{% block title %}Hidden Layer Visualizations{% endblock %}
{% block content %}
<h1 style="text-align: center;">Available Models</h1>
<div class="ui segment">
<div class="ui four column grid">
<div class="column">
<div class="ui fluid inverted card">
<div class="image">
<img src="{% static 'mnist.png' %}" style="height: 15em;">
</div>
<div class="content">
<a class="header">Mnist Visualization</a>
<div class="meta">
By: <a>Darshan Prabhu</a>
</div>
<div class="description">
Mnist dataset is the set of handwritten digits. The model comprises of 2 convolution layers.
</div>
</div>
<div class="extra content">
<div class="content" style="text-align: center;">
<a class="ui teal button" href="{% url 'mnist' %}">View</a>
</div>
</div>
</div>
</div>
<div class="column">
<div class="ui fluid inverted card">
<div class="image">
<img src="{% static 'flower.png' %}" style="height: 15em;">
</div>
<div class="content">
<a class="header">Flower Visualization</a>
<div class="meta">
By: <a>Priyesh Jain</a>
</div>
<div class="description">
Flower dataset is collection of images of 5 different flowers. The model contains 5 convolution layers.
</div>
</div>
<div class="extra content">
<div class="content" style="text-align: center;">
<a class="ui teal button" href="{% url 'flower' %}">View</a>
</div>
</div>
</div>
</div>
<div class="column">
<div class="ui fluid inverted card">
<div class="image">
<img src="{% static 'cat_dog.png' %}" style="height: 15em;">
</div>
<div class="content">
<a class="header">Cat-Dog Visualization</a>
<div class="meta">
By: <a>Aditya Singh</a>
</div>
<div class="description">
Cat-Dog dataset is a binary classification task. It comprises of 4 convolution layers.
</div>
</div>
<div class="extra content">
<div class="content" style="text-align: center;">
<a class="ui teal button" href="{% url 'catDog' %}">View</a>
</div>
</div>
</div>
</div>
<div class="column">
<div class="ui fluid inverted card">
<div class="image">
<img src="{% static 'vgg.png' %}" style="height: 15em;">
</div>
<div class="content">
<a class="header">Vgg Feature Visualization</a>
<div class="meta">
By: <a>Piyush Sharma</a>
</div>
<div class="description">
VGG19 is a pretrained model widely used for feature extraction. The model contains 16 convolution layers.
</div>
</div>
<div class="extra content">
<div class="content" style="text-align: center;">
<a class="ui brown button" href="{% url 'vggInput' %}">Update Image</a>
<a class="ui teal button" href="{% url 'vgg' %}">View</a>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
\ No newline at end of file
{% extends "base.html" %}
{% load static %}
{% load custom_tags %}
{% block title %}{{ model_name }} Visualization{% endblock %}
{% block styling %}
.padded-label{
margin-left: 5.2em !important;
margin-top:-1em !important;
}
.resizing-image{
width: 70% !important;
height: auto !important;
}
{% endblock %}
{% block content %}
<h1 class="ui" style="text-align:center;">MNIST HIDDEN LAYER VISUALIZATION</h1>
{% for class in images %}
<div class="ui fluid card">
<div class="content">
<div class="header">Class Type: {{ class.class_type }}</div>
</div>
<div class="content">
<div class="ui middle aligned center aligned grid">
<div class="four wide column">
<div class="ui header">Input Image</div>
<div class="ui raised teal card" style="margin: 2em auto;">
<div class="image">
<img src="{% static class.images.input %}" style="height:15em;">
</div>
<div class="content">
<div class="header">
Input.jpg
</div>
</div>
<div class="extra content">
<span class="">
Mnist Input
</span>
</div>
</div>
</div>
<div class="eight wide column">
<div class="ui two column grid">
{% for conv_layer in class.images.convolution %}
<div class="column">
<div class="ui raised card">
<div class="content conv-card">
<div class="header">Convolution Layer {{ forloop.counter }}</div>
</div>
<div class="content">
<div class="ui mini statistics" style="margin: 0px auto;padding: 1em 0;">
<div class="brown statistic" style="padding-left: 1em;">
<div class="value">
{{ conv_layer.kernel_size }} x {{ conv_layer.kernel_size }}
</div>
<div class="label">
Kernel Size
</div>
</div>
<div class="brown statistic">
<div class="value">
<i class="layer group icon"></i> {{ conv_layer.current_depth }}
</div>
<div class="label">
Count
</div>
</div>
</div>
<h4 class="ui sub header" style="margin-top: 0;">Visuals</h4>
<div class="ui small feed">
<div class="event">
<div class="content" style="text-align: center;">
<div class="ui buttons">
<button class="ui teal button" onclick="open_modal('weights-{{ class.class_type }}-conv{{ forloop.counter }}')">Weights</button>
<div class="or"></div>
<button class="ui secondary button" onclick="open_modal('outputs-{{ class.class_type }}-conv{{ forloop.counter }}')">Outputs</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="ui fullscreen modal weights-{{ class.class_type }}-conv{{ forloop.counter }}">
<i class="close icon"></i>
<div class="header">Weights of Convolution {{ forloop.counter }}</div>
<div class="scrolling content">
{% for weight in conv_layer.weights %}
<div class="ui segment fluid card">
<a class="left aligned floating ui {% get_table_color forloop.counter0 %} ribbon label">Kernel {{ forloop.counter }}</a>
<div class="content">
<div class="ui four column grid">
{% for link in weight %}
<div class="column">
<div class="ui fluid image">
<img src="{% static link %}" class="resizing-image">
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="ui large modal outputs-{{ class.class_type }}-conv{{ forloop.counter }}">
<i class="close icon"></i>
<div class="header">Outputs of Convolution {{ forloop.counter }}</div>
<div class="scrolling content">
<div class="ui three column grid">
{% for output in conv_layer.outputs %}
<div class="column">
<div class="ui fluid image">
<a class="ui {% get_table_color forloop.counter0 %} ribbon label padded-label"> Kernel {{ forloop.counter }}</a>
<img src="{% static output %}" class="resizing-image">
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="four wide column">
<div class="ui header">Output Image</div>
<div class="ui raised teal card" style="margin: 2em auto;">
<div class="image">
<img src="{% static class.images.output %}" style="height:13em;">
</div>
<div class="content">
<div class="header">
Output.jpg
</div>
</div>
<div class="extra content">
<span class="">
Mnist Output
</span>
</div>
</div>
</div>
</div>
</div>
</div>
{% endfor %}
{% endblock %}
{% block scripts %}
function open_modal(class_name){
$('.'+class_name).modal('show');
}
{% endblock %}
\ No newline at end of file
{% extends "base.html" %}
{% load static %}
{% load custom_tags %}
{% block title %}{{ model_name }} Visualization{% endblock %}
{% block styling %}
.padded-label{
margin-left: 4.4em !important;
margin-top:-1em !important;
}
.resizing-image{
width: 70% !important;
height: auto !important;
}
{% endblock %}
{% block content %}
<h1 class="ui" style="text-align:center;">VGG HIDDEN LAYER VISUALIZATION</h1>
{% for class in images %}
<div class="ui fluid card">
<div class="content">
<div class="header">VGG Feature Extraction</div>
</div>
<div class="content">
<div class="ui middle aligned center aligned grid">
<div class="four wide column">
<div class="ui header">Input Image</div>
<div class="ui raised teal card" style="margin: 2em auto;">
<div class="image">
<img src="{% static class.images.input %}" style="height:15em;">
</div>
<div class="content">
<div class="header">
Input.jpg
</div>
</div>
<div class="extra content">
<span class="">
VGG Input
</span>
</div>
</div>
</div>
<div class="eight wide column">
<div class="ui two column grid">
{% for conv_layer in class.images.convolution %}
<div class="column">
<div class="ui raised card">
<div class="content conv-card">
<div class="header">Convolution Layer {{ forloop.counter }}</div>
</div>
<div class="content">
<div class="ui mini statistics" style="margin: 0px auto;padding: 1em 0;">
<div class="brown statistic" style="padding-left: 1em;">
<div class="value">
{{ conv_layer.kernel_size }} x {{ conv_layer.kernel_size }}
</div>
<div class="label">
Kernel Size
</div>
</div>
<div class="brown statistic">
<div class="value">
<i class="layer group icon"></i> {{ conv_layer.current_depth }}
</div>
<div class="label">
Count
</div>
</div>
</div>
<h4 class="ui sub header" style="margin-top: 0;">Visuals</h4>
<div class="ui small feed">
<div class="event">
<div class="content" style="text-align: center;">
<div class="ui buttons">
<button class="ui teal button" onclick="open_modal('weights-{{ class.class_type }}-conv{{ forloop.counter }}')">Weights</button>
<div class="or"></div>
<button class="ui secondary button" onclick="open_modal('outputs-{{ class.class_type }}-conv{{ forloop.counter }}')">Outputs</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="ui fullscreen modal weights-{{ class.class_type }}-conv{{ forloop.counter }}">
<i class="close icon"></i>
<div class="header">Weights of Convolution {{ forloop.counter }}</div>
<div class="scrolling content">
{% for weight in conv_layer.weights %}
<div class="ui segment fluid card">
<a class="left aligned floating ui {% get_table_color forloop.counter0 %} ribbon label">Kernel {{ forloop.counter }}</a>
<div class="content">
<div class="ui four column grid">
{% for link in weight %}
<div class="column">
<div class="ui fluid image">
<img src="{% static link %}" class="resizing-image">
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="ui large modal outputs-{{ class.class_type }}-conv{{ forloop.counter }}">
<i class="close icon"></i>
<div class="header">Outputs of Convolution {{ forloop.counter }}</div>
<div class="scrolling content">
<div class="ui three column grid">
{% for output in conv_layer.outputs %}
<div class="column">
<div class="ui fluid image">
<a class="ui {% get_table_color forloop.counter0 %} ribbon label padded-label"> Kernel {{ forloop.counter }}</a>
<img src="{% static output %}" class="resizing-image">
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="four wide column">
<div class="ui header">Output Image</div>
<div class="ui raised teal card" style="margin: 2em auto;">
<div class="image">
<img src="{% static class.images.output %}" style="height:13em;">
</div>
<div class="extra content">
<span class="">
VGG Output
</span>
</div>
</div>
</div>
</div>
</div>
</div>
{% endfor %}
{% endblock %}
{% block scripts %}
function open_modal(class_name){
$('.'+class_name).modal('show');
}
{% endblock %}
\ No newline at end of file
{% extends "base.html" %}
{% block title %}Vgg Input Upload {% endblock %}
{% block imports %}
<link href="https://unpkg.com/filepond/dist/filepond.css" rel="stylesheet">
<link href="https://unpkg.com/filepond-plugin-image-preview/dist/filepond-plugin-image-preview.css" rel="stylesheet">
<script src="https://unpkg.com/filepond/dist/filepond.js"></script>
<script src="https://unpkg.com/filepond-plugin-image-preview/dist/filepond-plugin-image-preview.js"></script>
<script src="https://unpkg.com/filepond-plugin-file-validate-type/dist/filepond-plugin-file-validate-type.js"></script>
{% endblock %}
{% block content %}
<h1 class="ui" style="text-align:center;">Input Image for VGG19</h1>
<form method="POST">
{% csrf_token %}
<input type="file" name="filepond">
<div style="text-align:center;">
<button class="ui left labeled large icon button secondary" onclick="edit_student_detail()">
<i class="file upload icon"></i>
Upload
</button>
</div>
</form>
{% endblock %}
{% block scripts %}
FilePond.registerPlugin(
FilePondPluginImagePreview,
FilePondPluginFileValidateType,
);
FilePond.setOptions({
imagePreviewHeight : 650,
acceptedFileTypes: ['image/*'],
server: {
url: 'http://127.0.0.1:8000/fp',
process: '/process/',
patch: '/patch/',
revert: '/revert/',
fetch: '/fetch/?target=',
load: '/load/?id='
}
});
window.pond = FilePond.create( document.querySelector('input[type="file"]') ,
{
maxFiles: 1,
} );
{% if messages %}
{% for message in messages %}
$('body')
.toast({
class: "error",
title: "Error uploading FIle",
displayTime: 5000,
closeIcon: true,
position: "top center",
showIcon: "exclamation",
message: "{{ message }}",
});
{% endfor %}
{% endif %}
{% endblock %}
\ No newline at end of file
from django import template
from ..choices import color_choices
import random
from datetime import datetime, timezone
register = template.Library()
# Function to get particular element from a list
@register.filter
def index(indexable, i):
'''
Input:
indexable: Array type date
i: index
Output:
element at index i in indexable
'''
return indexable[i]
# Function to get color for priority tables to guide
@register.simple_tag
def get_table_color(index):
'''
Input:
index: Index of the table'
Output:
Random color choice
'''
index = index % len(color_choices)
return color_choices[index]
# Function to get random color
@register.simple_tag
def get_random_color(index):
'''
Input:
index: Index
Output:
Random color choice
'''
return random.choice(color_choices)
\ No newline at end of file
from django.test import TestCase
# Create your tests here.
from django.urls import path, include
from .views import mnistVisualView, vgguploadView, vggVisualView, flowerVisualView, homeView, catDogVisualView
urlpatterns = [
path('',homeView.as_view(),name='home'),
path('mnist',mnistVisualView.as_view(),name='mnist'),
path('vggInput',vgguploadView.as_view(),name='vggInput'),
path('vgg',vggVisualView.as_view(),name='vgg'),
path('flower',flowerVisualView.as_view(),name='flower'),
path('catDog',catDogVisualView.as_view(),name='catDog')
]
from keras.applications.vgg19 import VGG19
from keras.applications.vgg19 import preprocess_input
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.models import Model
from matplotlib import pyplot as plt
import os
import numpy as np
from matplotlib import pyplot as plt
import cv2 as cv
def vgg_visualization(inputImage,rootDir):
model = VGG19()
image = load_img(inputImage,target_size=(224,224))
image = img_to_array(image)
image = image.reshape((1,image.shape[0],image.shape[1],image.shape[2]))
image = preprocess_input(image)
generate_visualizations(model,image,rootDir)
def generate_visualizations(model,input_image,root_dir):
try:
os.mkdir(root_dir)
except OSError as error:
pass
no_conv_layers = 1
plt.axis('off')
for layer in model.layers:
if 'conv' in layer.name:
try:
os.mkdir(os.path.join(root_dir,'conv{}'.format(no_conv_layers)))
except OSError as error:
pass
op = Model(inputs=model.inputs,outputs=model.layers[no_conv_layers-1].output)
# Output images
pred = op.predict(input_image)
index = 0
count = pred.shape[-1]
max_count = 8
max_depth = 4
while count != index and index<=max_count:
plt.imshow(pred[0,:,:,index])
plt.savefig(os.path.join(root_dir,'conv{}'.format(no_conv_layers),'{}.jpg'.format(index+1)),transparent=True)
index += 1
# Save weights
weights,bias = layer.get_weights()
file = open(os.path.join(root_dir,'meta.txt'), "a")
file.write('{}\n{}\n{}\n'.format(weights.shape[0],weights.shape[2],weights.shape[3]))
file.close()
min_val,max_val = weights.min(), weights.max()
weights = (weights - min_val)/(max_val-min_val+1e-8)
depth = weights.shape[2]
dimensions = (100,100)
for index in range(weights.shape[-1]):
if index>max_count:
break
weight = weights[:,:,:,index]
for channel in range(depth):
if channel > max_depth:
break
final_image = cv.resize(weight[:,:,channel], dimensions, interpolation = cv.INTER_AREA)
plt.imshow(final_image,cmap='gray')
plt.savefig(os.path.join(root_dir,'conv{}'.format(no_conv_layers),'{}-{}.jpg'.format(index+1,channel+1)),transparent=True)
no_conv_layers += 1
#vgg_visualization('bird.jpg','vggImages')
from django.shortcuts import render
from django.views import View
from django.views.generic.base import TemplateView
from django.urls import reverse
from django.contrib import messages
from django_drf_filepond.models import TemporaryUpload
import os
import shutil
#from .vggModel import vgg_visualization
# Create your views here.
class homeView(TemplateView):
template_name = 'home.html'
class mnistVisualView(TemplateView):
template_name = 'mnist.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
image_context = load_images('mnist')
context.update(image_context)
return context
class vggVisualView(TemplateView):
template_name = 'vgg.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
image_context = load_images('vgg19')
context.update(image_context)
return context
class flowerVisualView(TemplateView):
template_name = 'flower.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
image_context = load_images('flower')
context.update(image_context)
return context
class catDogVisualView(TemplateView):
template_name = 'catDog.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
image_context = load_images('catDog')
context.update(image_context)
return context
class vgguploadView(View):
def get(self,request,*args,**kwargs):
return render(request,'vggUpload.html')
def post(self,request,*args,**kwargs):
upload_id = request.POST.get('filepond')
if upload_id !="":
uploaded_file = TemporaryUpload.objects.get(upload_id=upload_id)
prefix_path = os.path.join(os.getcwd(),'visualization','static')
source = os.path.join(prefix_path,'temp-image-uploads',upload_id,uploaded_file.file_id)
destination = os.path.join(prefix_path,'visualization','vgg19','example','input.jpg')
shutil.move(source,destination)
os.rmdir(os.path.join(prefix_path,'temp-image-uploads',upload_id))
uploaded_file.delete()
#vgg_visualization(destination,os.path.join(prefix_path,'visualization','vgg19','example'))
else:
messages.error(request,'You have not selected any input image')
return render(request,'vggUpload.html')
# Helper codes
def load_images(model_type):
context = {'model_name':model_type.capitalize()}
context['images'] = []
root_dir = os.path.join(os.getcwd(),'visualization','static','visualization',model_type)
static_path = os.path.join('visualization',model_type)
for class_type in os.listdir(root_dir):
meta_data = open(os.path.join(root_dir,class_type,'meta.txt'),'r').readlines()
line_no = 0
images = dict()
images['input'] = os.path.join(static_path,class_type,'input.jpg')
images['output'] = os.path.join(static_path,class_type,'output.jpg')
image_dir = os.path.join(root_dir,class_type)
conv_dict = []
for conv in os.listdir(image_dir):
conv_dir = os.path.join(image_dir,conv)
if os.path.isdir(conv_dir):
t = dict()
t['kernel_size'] = meta_data[line_no]
t['prev_input_depth'] = meta_data[line_no+1]
t['current_depth'] = meta_data[line_no+2]
line_no += 3
t['weights'] = []
outputs = list(filter(lambda x: '-' not in x,os.listdir(conv_dir)))
t['outputs'] = sorted(outputs,key = key_outputs)
t['outputs'] = [os.path.join(static_path,class_type,conv,img) for img in t['outputs']]
for i in range(len(outputs)):
a = list(filter(lambda x: '-' in x,os.listdir(conv_dir)))
a = list(filter(lambda x: x.startswith(str(i+1)),a))
t['weights'].append(sorted(a,key=key_weights))
t['weights'][-1] = [os.path.join(static_path,class_type,conv,img) for img in t['weights'][-1]]
conv_dict.append(t)
images['convolution'] = conv_dict
context['images'].append({'class_type':class_type,'images':images})
return context
def key_outputs(x):
return int(x.split('.')[0])
def key_weights(x):
return int(x.split('.')[0].split('-')[1])
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment