trying to use pyt
Browse files- app.py +80 -30
- requirements.txt +2 -2
app.py
CHANGED
|
@@ -3,12 +3,20 @@ from matplotlib import cm
|
|
| 3 |
import matplotlib.pyplot as plt
|
| 4 |
from mpl_toolkits.axes_grid1 import make_axes_locatable
|
| 5 |
import numpy as np
|
| 6 |
-
import onnxruntime as ort
|
| 7 |
from PIL import Image
|
| 8 |
from scipy import special
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
|
| 10 |
-
#
|
| 11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12 |
|
| 13 |
# plotting a prameters
|
| 14 |
labels = 20
|
|
@@ -20,6 +28,24 @@ lw = 3
|
|
| 20 |
ps = 200
|
| 21 |
cmap = 'magma'
|
| 22 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
def normalize_array(x: list):
|
| 24 |
|
| 25 |
'''Makes array between 0 and 1'''
|
|
@@ -28,42 +54,56 @@ def normalize_array(x: list):
|
|
| 28 |
|
| 29 |
return (x - np.min(x)) / np.max(x - np.min(x))
|
| 30 |
|
| 31 |
-
def load_model(model: str, activation: bool=True):
|
| 32 |
|
| 33 |
-
|
| 34 |
-
|
| 35 |
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
|
| 46 |
-
|
| 47 |
|
| 48 |
-
def get_activations(
|
| 49 |
-
layer=None, vmax=2.5, sub_mean=True
|
|
|
|
| 50 |
|
| 51 |
'''Gets activations for a given input image'''
|
| 52 |
|
| 53 |
# run model
|
| 54 |
-
input_name = intermediate_model.get_inputs()[0].name
|
| 55 |
-
outputs = intermediate_model.run(None, {input_name: image})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
|
| 57 |
# get activations
|
| 58 |
-
output_1 = outputs[1]
|
| 59 |
-
output_2 = outputs[2]
|
| 60 |
|
| 61 |
# get prediction
|
| 62 |
-
output = outputs[0][0]
|
| 63 |
output = special.softmax(output)
|
| 64 |
|
| 65 |
# sum over velocity channels
|
| 66 |
-
|
|
|
|
|
|
|
|
|
|
| 67 |
in_image = normalize_array(in_image)
|
| 68 |
|
| 69 |
if layer is None:
|
|
@@ -134,7 +174,7 @@ def plot_activations(activation_1: list, activation_2: list, origin='lower'):
|
|
| 134 |
return fig
|
| 135 |
|
| 136 |
|
| 137 |
-
def predict_and_analyze(model_name, num_channels, dim, image):
|
| 138 |
|
| 139 |
'''
|
| 140 |
Loads a model with activations, passes through image and shows activations
|
|
@@ -153,16 +193,23 @@ def predict_and_analyze(model_name, num_channels, dim, image):
|
|
| 153 |
if len(image.shape) != 4:
|
| 154 |
image = image[np.newaxis, :, :, :]
|
| 155 |
|
|
|
|
|
|
|
| 156 |
assert image.shape == (1, num_channels, W, W), "Data is the wrong shape"
|
| 157 |
|
| 158 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 159 |
|
| 160 |
print("Loading model")
|
| 161 |
-
model = load_model(model_name, activation=True)
|
|
|
|
| 162 |
print("Model loaded")
|
| 163 |
|
| 164 |
print("Looking at activations")
|
| 165 |
-
output, input_image, activation_1, activation_2 = get_activations(model, image, sub_mean=True)
|
| 166 |
print("Activations and predictions finished")
|
| 167 |
|
| 168 |
if output[0] < output[1]:
|
|
@@ -185,13 +232,13 @@ def predict_and_analyze(model_name, num_channels, dim, image):
|
|
| 185 |
input_fig = plot_input(input_image, origin=origin)
|
| 186 |
|
| 187 |
# plot mean subtracted activations
|
| 188 |
-
fig1 = plot_activations(activation_1, activation_2, origin=origin)
|
| 189 |
|
| 190 |
# plot raw activations
|
| 191 |
-
_, _, activation_1, activation_2 = get_activations(model, image, sub_mean=False)
|
| 192 |
activation_1 = normalize_array(activation_1)
|
| 193 |
activation_2 = normalize_array(activation_2)
|
| 194 |
-
fig2 = plot_activations(activation_1, activation_2, origin=origin)
|
| 195 |
|
| 196 |
print("Sending to Hugging Face")
|
| 197 |
|
|
@@ -214,6 +261,9 @@ if __name__ == "__main__":
|
|
| 214 |
value="600",
|
| 215 |
label="Image Dimensions",
|
| 216 |
show_label=True),
|
|
|
|
|
|
|
|
|
|
| 217 |
gr.File(label="Input Data", show_label=True)],
|
| 218 |
outputs=[gr.Textbox(lines=1, label="Prediction", show_label=True),
|
| 219 |
# gr.Image(label="Input Image", show_label=True),
|
|
|
|
| 3 |
import matplotlib.pyplot as plt
|
| 4 |
from mpl_toolkits.axes_grid1 import make_axes_locatable
|
| 5 |
import numpy as np
|
| 6 |
+
# import onnxruntime as ort
|
| 7 |
from PIL import Image
|
| 8 |
from scipy import special
|
| 9 |
+
import sys
|
| 10 |
+
from types import SimpleNamespace
|
| 11 |
+
from transformers import AutoModel
|
| 12 |
+
import torch
|
| 13 |
|
| 14 |
+
# sys.path.insert(1, "../")
|
| 15 |
+
# from utils import model_utils, train_utils, data_utils, run_utils
|
| 16 |
+
# from model_utils import jason_regnet_maker, jason_efficientnet_maker
|
| 17 |
+
|
| 18 |
+
model_path = 'chlab/'
|
| 19 |
+
# model_path = './models/'
|
| 20 |
|
| 21 |
# plotting a prameters
|
| 22 |
labels = 20
|
|
|
|
| 28 |
ps = 200
|
| 29 |
cmap = 'magma'
|
| 30 |
|
| 31 |
+
effnet_61_hparams = {
|
| 32 |
+
"num_classes": 2,
|
| 33 |
+
"gamma": 0.032606396652426956,
|
| 34 |
+
"lr": 0.008692971067922545,
|
| 35 |
+
"weight_decay": 0.00008348389688708425,
|
| 36 |
+
"batch_size": 23,
|
| 37 |
+
"num_channels": 61,
|
| 38 |
+
"stochastic_depth_prob": 0.003581930052432713,
|
| 39 |
+
"dropout": 0.027804120950575217,
|
| 40 |
+
"width_mult": 1.060782511229692,
|
| 41 |
+
"depth_mult": 0.7752918857163054,
|
| 42 |
+
}
|
| 43 |
+
effnet_61_config = SimpleNamespace(**effnet_61_hparams)
|
| 44 |
+
|
| 45 |
+
# which layers to look at
|
| 46 |
+
activation_indices = {'efficientnet': [0, 3]}
|
| 47 |
+
|
| 48 |
+
|
| 49 |
def normalize_array(x: list):
|
| 50 |
|
| 51 |
'''Makes array between 0 and 1'''
|
|
|
|
| 54 |
|
| 55 |
return (x - np.min(x)) / np.max(x - np.min(x))
|
| 56 |
|
| 57 |
+
# def load_model(model: str, activation: bool=True):
|
| 58 |
|
| 59 |
+
# if activation:
|
| 60 |
+
# model += '_w_activation'
|
| 61 |
|
| 62 |
+
# # set options for onnx runtime
|
| 63 |
+
# options = ort.SessionOptions()
|
| 64 |
+
# options.intra_op_num_threads = 1
|
| 65 |
+
# options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL
|
| 66 |
+
# provider = "CPUExecutionProvider"
|
| 67 |
|
| 68 |
+
# # start session
|
| 69 |
+
# ort_session = ort.InferenceSession(model_path + '%s.onnx' % (model), options, providers=[provider])
|
| 70 |
+
# # ort_session = ORTModel.load_model(model_path + '%s.onnx' % (model))
|
| 71 |
|
| 72 |
+
# return ort_session
|
| 73 |
|
| 74 |
+
def get_activations(model, image: list, model_name: str,
|
| 75 |
+
layer=None, vmax=2.5, sub_mean=True,
|
| 76 |
+
channel: int=0):
|
| 77 |
|
| 78 |
'''Gets activations for a given input image'''
|
| 79 |
|
| 80 |
# run model
|
| 81 |
+
# input_name = intermediate_model.get_inputs()[0].name
|
| 82 |
+
# outputs = intermediate_model.run(None, {input_name: image})
|
| 83 |
+
|
| 84 |
+
|
| 85 |
+
layer_outputs = {}
|
| 86 |
+
for i in range(len(model.model.features)):
|
| 87 |
+
image = model.model.features[i](image)
|
| 88 |
+
layer_outputs[i] = image
|
| 89 |
+
print(i, layer_outputs[i].shape)
|
| 90 |
+
output = model.model(image).detach().cpu().numpy()
|
| 91 |
+
output_1 = activation_indices[model_name].detach().cpu().numpy()
|
| 92 |
+
output_2 = activation_indices[model_name].detach().cpu().numpy()
|
| 93 |
|
| 94 |
# get activations
|
| 95 |
+
# output_1 = outputs[1]
|
| 96 |
+
# output_2 = outputs[2]
|
| 97 |
|
| 98 |
# get prediction
|
| 99 |
+
# output = outputs[0][0]
|
| 100 |
output = special.softmax(output)
|
| 101 |
|
| 102 |
# sum over velocity channels
|
| 103 |
+
if channel == 0:
|
| 104 |
+
in_image = np.sum(image[0, :, :, :], axis=0)
|
| 105 |
+
else:
|
| 106 |
+
image[0, int(channel-1), :, :]
|
| 107 |
in_image = normalize_array(in_image)
|
| 108 |
|
| 109 |
if layer is None:
|
|
|
|
| 174 |
return fig
|
| 175 |
|
| 176 |
|
| 177 |
+
def predict_and_analyze(model_name, num_channels, dim, input_channel, image):
|
| 178 |
|
| 179 |
'''
|
| 180 |
Loads a model with activations, passes through image and shows activations
|
|
|
|
| 193 |
if len(image.shape) != 4:
|
| 194 |
image = image[np.newaxis, :, :, :]
|
| 195 |
|
| 196 |
+
image = torch.from_numpy(image)
|
| 197 |
+
|
| 198 |
assert image.shape == (1, num_channels, W, W), "Data is the wrong shape"
|
| 199 |
|
| 200 |
+
# pipeline = pipeline(task="image-classification", model=model_path + "%s_%i_.pyt" % (model_name, num_channels))
|
| 201 |
+
|
| 202 |
+
# model_name += '_%i' % (num_channels)
|
| 203 |
+
|
| 204 |
+
model_loading_name = model_path + "%s_%i_planet_detection" % (model_name, num_channels)
|
| 205 |
|
| 206 |
print("Loading model")
|
| 207 |
+
# model = load_model(model_name, activation=True)
|
| 208 |
+
model = AutoModel.from_pretrained(model_loading_name)
|
| 209 |
print("Model loaded")
|
| 210 |
|
| 211 |
print("Looking at activations")
|
| 212 |
+
output, input_image, activation_1, activation_2 = get_activations(model, image, model_name, sub_mean=True)
|
| 213 |
print("Activations and predictions finished")
|
| 214 |
|
| 215 |
if output[0] < output[1]:
|
|
|
|
| 232 |
input_fig = plot_input(input_image, origin=origin)
|
| 233 |
|
| 234 |
# plot mean subtracted activations
|
| 235 |
+
fig1 = plot_activations(activation_1, activation_2, model_name, origin=origin)
|
| 236 |
|
| 237 |
# plot raw activations
|
| 238 |
+
_, _, activation_1, activation_2 = get_activations(model, image, model_name, sub_mean=False)
|
| 239 |
activation_1 = normalize_array(activation_1)
|
| 240 |
activation_2 = normalize_array(activation_2)
|
| 241 |
+
fig2 = plot_activations(activation_1, activation_2, model_name, origin=origin)
|
| 242 |
|
| 243 |
print("Sending to Hugging Face")
|
| 244 |
|
|
|
|
| 261 |
value="600",
|
| 262 |
label="Image Dimensions",
|
| 263 |
show_label=True),
|
| 264 |
+
gr.Number(value=0.,
|
| 265 |
+
label="Input Channel to show (0 = sum over all)",
|
| 266 |
+
show_label=True),
|
| 267 |
gr.File(label="Input Data", show_label=True)],
|
| 268 |
outputs=[gr.Textbox(lines=1, label="Prediction", show_label=True),
|
| 269 |
# gr.Image(label="Input Image", show_label=True),
|
requirements.txt
CHANGED
|
@@ -2,5 +2,5 @@ torch
|
|
| 2 |
numpy
|
| 3 |
matplotlib
|
| 4 |
scipy
|
| 5 |
-
|
| 6 |
-
|
|
|
|
| 2 |
numpy
|
| 3 |
matplotlib
|
| 4 |
scipy
|
| 5 |
+
Pillow
|
| 6 |
+
transformers
|