Spaces:
Runtime error
Runtime error
updating wb to textiles
Browse files- data/CLIP_vecs_vases.pkl +0 -3
- data/annotated_files/seeds0000-100000.pkl +0 -3
- data/annotated_files/seeds0000-50000.pkl +0 -3
- data/annotated_files/sim_seeds0000-100000.csv +0 -3
- data/annotated_files/sim_seeds0000-50000.csv +0 -3
- data/model_files/network-snapshot-010600.pkl +0 -3
- data/old/ImageNet_metadata.csv +0 -3
- data/old/activation/convnext_activation.json +0 -3
- data/old/activation/mobilenet_activation.json +0 -3
- data/old/activation/resnet_activation.json +0 -3
- data/old/dot_architectures/convnext_architecture.dot +0 -3
- data/old/layer_infos/convnext_layer_infos.json +0 -3
- data/old/layer_infos/mobilenet_layer_infos.json +0 -3
- data/old/layer_infos/resnet_layer_infos.json +0 -3
- data/old/preprocessed_image_net/val_data_0.pkl +0 -3
- data/old/preprocessed_image_net/val_data_1.pkl +0 -3
- data/old/preprocessed_image_net/val_data_2.pkl +0 -3
- data/old/preprocessed_image_net/val_data_3.pkl +0 -3
- data/old/preprocessed_image_net/val_data_4.pkl +0 -3
- data/{CLIP_vecs.pkl → stored_vectors/scores_colors_hsv.csv} +2 -2
- data/vase_annotated_files/seeds0000-20000.pkl +0 -3
- data/vase_annotated_files/sim_Fabric_seeds0000-20000.csv +0 -3
- data/vase_annotated_files/sim_Provenance_seeds0000-20000.csv +0 -3
- data/vase_annotated_files/sim_Shape Name_seeds0000-20000.csv +0 -3
- data/vase_annotated_files/sim_Technique_seeds0000-20000.csv +0 -3
- data/vase_model_files/network-snapshot-003800.pkl +0 -3
- pages/1_Omniart_Disentanglement.py +0 -202
- pages/{5_Textiles_Disentanglement.py → 1_Textiles_Disentanglement.py} +4 -4
- pages/{2_Concepts_comparison.py → 2_Colours_comparison.py} +0 -0
- pages/3_Oxford_Vases_Disentanglement.py +0 -178
- pages/4_Vase_Qualities_Comparison copy.py +0 -268
data/CLIP_vecs_vases.pkl
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:c6299cd65f0635d6077788b135520ee8e88063930c63db458e643d77cba7b6ee
|
| 3 |
-
size 995715
|
|
|
|
|
|
|
|
|
|
|
|
data/annotated_files/seeds0000-100000.pkl
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:7b3a4fd155fa86df0953ad1cb660d50729189606de307fcee09fd893ba047228
|
| 3 |
-
size 420351795
|
|
|
|
|
|
|
|
|
|
|
|
data/annotated_files/seeds0000-50000.pkl
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:cd1bd97b8ff508b1d4a7ef43323530368ace65b35d12d84a914913f541187298
|
| 3 |
-
size 314939226
|
|
|
|
|
|
|
|
|
|
|
|
data/annotated_files/sim_seeds0000-100000.csv
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:6e0b08d729f87f827d3d88327b33ff22d8413cb7aa7057c0c4ccd384d72a2c21
|
| 3 |
-
size 21090135
|
|
|
|
|
|
|
|
|
|
|
|
data/annotated_files/sim_seeds0000-50000.csv
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:da82633e4296ae78ce9e3e208fae374ae8983137566101060aadd11ffd3b0ff7
|
| 3 |
-
size 50535430
|
|
|
|
|
|
|
|
|
|
|
|
data/model_files/network-snapshot-010600.pkl
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:9a46e8aecd50191b82632b5de7bf3b9e219a59564c54994dd203f016b7a8270e
|
| 3 |
-
size 357344749
|
|
|
|
|
|
|
|
|
|
|
|
data/old/ImageNet_metadata.csv
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:e53b0fc17cd5c8811ca08b7ff908cd2bbd625147686ef8bc020cb85a5a4546e5
|
| 3 |
-
size 3027633
|
|
|
|
|
|
|
|
|
|
|
|
data/old/activation/convnext_activation.json
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:0354b28bcca4e3673888124740e3d82882cbf38af8cd3007f48a7a5db983f487
|
| 3 |
-
size 33350177
|
|
|
|
|
|
|
|
|
|
|
|
data/old/activation/mobilenet_activation.json
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:5abc76e9318fadee18f35bb54e90201bf28699cf75140b5d2482d42243fad302
|
| 3 |
-
size 13564581
|
|
|
|
|
|
|
|
|
|
|
|
data/old/activation/resnet_activation.json
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:668bea355a5504d74f79d20d02954040ad572f50455361d7d17125c7c8b1561c
|
| 3 |
-
size 23362905
|
|
|
|
|
|
|
|
|
|
|
|
data/old/dot_architectures/convnext_architecture.dot
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:41a258a40a93615638ae504770c14e44836c934badbe48f18148f5a750514ac9
|
| 3 |
-
size 9108
|
|
|
|
|
|
|
|
|
|
|
|
data/old/layer_infos/convnext_layer_infos.json
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:3e82ea48865493107b97f37da58e370f0eead5677bf10f25f237f10970aedb6f
|
| 3 |
-
size 1678
|
|
|
|
|
|
|
|
|
|
|
|
data/old/layer_infos/mobilenet_layer_infos.json
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:a11df5f0b23040d11ce817658a989c8faf19faa06a8cbad727b635bac824e917
|
| 3 |
-
size 3578
|
|
|
|
|
|
|
|
|
|
|
|
data/old/layer_infos/resnet_layer_infos.json
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:21e1787382f1e1c206b81d2c4fe207fb6d41f4cf186d5afc32fc056dd21e10d6
|
| 3 |
-
size 5155
|
|
|
|
|
|
|
|
|
|
|
|
data/old/preprocessed_image_net/val_data_0.pkl
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:2698bdc240555e2a46a40936df87275bc5852142d30e921ae0dad9289b0f576f
|
| 3 |
-
size 906108480
|
|
|
|
|
|
|
|
|
|
|
|
data/old/preprocessed_image_net/val_data_1.pkl
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:21780d77e212695dbee84d6d2ad17a5a520bc1634f68e1c8fd120f069ad76da1
|
| 3 |
-
size 907109023
|
|
|
|
|
|
|
|
|
|
|
|
data/old/preprocessed_image_net/val_data_2.pkl
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:2cfc83b78420baa1b2c3a8da92e7fba1f33443d506f483ecff13cdba2035ab3c
|
| 3 |
-
size 907435149
|
|
|
|
|
|
|
|
|
|
|
|
data/old/preprocessed_image_net/val_data_3.pkl
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:2f5e2c7cb4d6bae17fbd062a0b46f2cee457ad466b725f7bdf0f8426069cafee
|
| 3 |
-
size 906089333
|
|
|
|
|
|
|
|
|
|
|
|
data/old/preprocessed_image_net/val_data_4.pkl
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:4ed53c87ec8b9945db31f910eb44b7e3092324643de25ea53a99fc29137df854
|
| 3 |
-
size 905439763
|
|
|
|
|
|
|
|
|
|
|
|
data/{CLIP_vecs.pkl → stored_vectors/scores_colors_hsv.csv}
RENAMED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:93f5789a80465ca7b21713819bc444d72239fa1b7ae56adf69e3323e0f3bedd1
|
| 3 |
+
size 974247
|
data/vase_annotated_files/seeds0000-20000.pkl
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:e790910bf45c0d5a84e74c9011b88012f59d0fc27b19987c890b891c57ab739c
|
| 3 |
-
size 125913423
|
|
|
|
|
|
|
|
|
|
|
|
data/vase_annotated_files/sim_Fabric_seeds0000-20000.csv
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:20fa48320e20998aad5665610083843705608a5f06ff081e4395ee4b5ac9cba3
|
| 3 |
-
size 9731011
|
|
|
|
|
|
|
|
|
|
|
|
data/vase_annotated_files/sim_Provenance_seeds0000-20000.csv
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:a421ffd119eee312249c9fbd05ac65460849e71f538d05fad223cb55423f315f
|
| 3 |
-
size 18066428
|
|
|
|
|
|
|
|
|
|
|
|
data/vase_annotated_files/sim_Shape Name_seeds0000-20000.csv
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:e258361e0db7c208ae67654c08ed5b900df10980e82e84bcddd3de89428f679a
|
| 3 |
-
size 30853761
|
|
|
|
|
|
|
|
|
|
|
|
data/vase_annotated_files/sim_Technique_seeds0000-20000.csv
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:e3d3425e15d76d47a8829783cadbd7072698083df199617a8423d5ccb9d88714
|
| 3 |
-
size 2484876
|
|
|
|
|
|
|
|
|
|
|
|
data/vase_model_files/network-snapshot-003800.pkl
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:42be0a24e7021dc66a9353c3a904494bb8e64b62e00e535ad3b03ad18238b0d2
|
| 3 |
-
size 357349976
|
|
|
|
|
|
|
|
|
|
|
|
pages/1_Omniart_Disentanglement.py
DELETED
|
@@ -1,202 +0,0 @@
|
|
| 1 |
-
import streamlit as st
|
| 2 |
-
import pickle
|
| 3 |
-
import pandas as pd
|
| 4 |
-
import numpy as np
|
| 5 |
-
import random
|
| 6 |
-
import torch
|
| 7 |
-
|
| 8 |
-
from matplotlib.backends.backend_agg import RendererAgg
|
| 9 |
-
|
| 10 |
-
from backend.disentangle_concepts import *
|
| 11 |
-
import torch_utils
|
| 12 |
-
import dnnlib
|
| 13 |
-
import legacy
|
| 14 |
-
|
| 15 |
-
_lock = RendererAgg.lock
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
st.set_page_config(layout='wide')
|
| 19 |
-
BACKGROUND_COLOR = '#bcd0e7'
|
| 20 |
-
SECONDARY_COLOR = '#bce7db'
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
st.title('Disentanglement studies')
|
| 24 |
-
st.write('> **What concepts can be disentangled in the latent spae of a model?**')
|
| 25 |
-
st.write("""Explanation on the functionalities to come.""")
|
| 26 |
-
|
| 27 |
-
instruction_text = """Instruction to input:
|
| 28 |
-
1. Choosing concept:
|
| 29 |
-
2. Choosing image: Users can choose a specific image by entering **Image ID** and hit the _Choose the defined image_ button or can generate an image randomly by hitting the _Generate a random image_ button.
|
| 30 |
-
3. Choosing epsilon: **Epsilon** is the lambda amount of translation along the disentangled concept axis. A negative epsilon changes the image in the direction of the concept, a positive one pushes the image away from the concept.
|
| 31 |
-
"""
|
| 32 |
-
st.write("To use the functionality below, users need to input the **concept** to disentangle, an **image** id and the **epsilon** of variation along the disentangled axis.")
|
| 33 |
-
with st.expander("See more instruction", expanded=False):
|
| 34 |
-
st.write(instruction_text)
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
annotations_file = './data/annotated_files/seeds0000-50000.pkl'
|
| 38 |
-
with open(annotations_file, 'rb') as f:
|
| 39 |
-
annotations = pickle.load(f)
|
| 40 |
-
|
| 41 |
-
ann_df = pd.read_csv('./data/annotated_files/sim_seeds0000-50000.csv')
|
| 42 |
-
concepts = './data/concepts.txt'
|
| 43 |
-
|
| 44 |
-
with open(concepts) as f:
|
| 45 |
-
labels = [line.strip() for line in f.readlines()]
|
| 46 |
-
|
| 47 |
-
if 'image_id' not in st.session_state:
|
| 48 |
-
st.session_state.image_id = 0
|
| 49 |
-
if 'projection' not in st.session_state:
|
| 50 |
-
st.session_state.projection = False
|
| 51 |
-
if 'concept_id' not in st.session_state:
|
| 52 |
-
st.session_state.concept_id = 'Abstract'
|
| 53 |
-
if 'space_id' not in st.session_state:
|
| 54 |
-
st.session_state.space_id = 'Z'
|
| 55 |
-
|
| 56 |
-
# def on_change_random_input():
|
| 57 |
-
# st.session_state.image_id = st.session_state.image_id
|
| 58 |
-
|
| 59 |
-
# ----------------------------- INPUT ----------------------------------
|
| 60 |
-
st.header('Input')
|
| 61 |
-
input_col_1, input_col_2, input_col_3 = st.columns(3)
|
| 62 |
-
# --------------------------- INPUT column 1 ---------------------------
|
| 63 |
-
with input_col_1:
|
| 64 |
-
with st.form('text_form'):
|
| 65 |
-
|
| 66 |
-
# image_id = st.number_input('Image ID: ', format='%d', step=1)
|
| 67 |
-
st.write('**Choose a concept to disentangle**')
|
| 68 |
-
# chosen_text_id_input = st.empty()
|
| 69 |
-
# concept_id = chosen_text_id_input.text_input('Concept:', value=st.session_state.concept_id)
|
| 70 |
-
concept_id = st.selectbox('Concept:', tuple(labels))
|
| 71 |
-
|
| 72 |
-
st.write('**Choose a latent space to disentangle**')
|
| 73 |
-
# chosen_text_id_input = st.empty()
|
| 74 |
-
# concept_id = chosen_text_id_input.text_input('Concept:', value=st.session_state.concept_id)
|
| 75 |
-
space_id = st.selectbox('Space:', tuple(['Z', 'W']))
|
| 76 |
-
|
| 77 |
-
choose_text_button = st.form_submit_button('Choose the defined concept and space to disentangle')
|
| 78 |
-
# random_text = st.form_submit_button('Select a random concept')
|
| 79 |
-
|
| 80 |
-
# if random_text:
|
| 81 |
-
# concept_id = random.choice(labels)
|
| 82 |
-
# st.session_state.concept_id = concept_id
|
| 83 |
-
# chosen_text_id_input.text_input('Concept:', value=st.session_state.concept_id)
|
| 84 |
-
|
| 85 |
-
if choose_text_button:
|
| 86 |
-
concept_id = str(concept_id)
|
| 87 |
-
st.session_state.concept_id = concept_id
|
| 88 |
-
space_id = str(space_id)
|
| 89 |
-
st.session_state.space_id = space_id
|
| 90 |
-
# st.write(image_id, st.session_state.image_id)
|
| 91 |
-
|
| 92 |
-
# ---------------------------- SET UP OUTPUT ------------------------------
|
| 93 |
-
epsilon_container = st.empty()
|
| 94 |
-
st.header('Output')
|
| 95 |
-
st.subheader('Concept vector')
|
| 96 |
-
|
| 97 |
-
# perform attack container
|
| 98 |
-
# header_col_1, header_col_2, header_col_3, header_col_4, header_col_5 = st.columns([1,1,1,1,1])
|
| 99 |
-
# output_col_1, output_col_2, output_col_3, output_col_4, output_col_5 = st.columns([1,1,1,1,1])
|
| 100 |
-
header_col_1, header_col_2 = st.columns([5,1])
|
| 101 |
-
output_col_1, output_col_2 = st.columns([5,1])
|
| 102 |
-
|
| 103 |
-
st.subheader('Derivations along the concept vector')
|
| 104 |
-
|
| 105 |
-
# prediction error container
|
| 106 |
-
error_container = st.empty()
|
| 107 |
-
smoothgrad_header_container = st.empty()
|
| 108 |
-
|
| 109 |
-
# smoothgrad container
|
| 110 |
-
smooth_head_1, smooth_head_2, smooth_head_3, smooth_head_4, smooth_head_5 = st.columns([1,1,1,1,1])
|
| 111 |
-
smoothgrad_col_1, smoothgrad_col_2, smoothgrad_col_3, smoothgrad_col_4, smoothgrad_col_5 = st.columns([1,1,1,1,1])
|
| 112 |
-
|
| 113 |
-
# ---------------------------- DISPLAY COL 1 ROW 1 ------------------------------
|
| 114 |
-
with output_col_1:
|
| 115 |
-
separation_vector, number_important_features, imp_nodes, performance = get_separation_space(concept_id, annotations, ann_df, latent_space=st.session_state.space_id)
|
| 116 |
-
# st.write(f'Class ID {input_id} - {input_label}: {pred_prob*100:.3f}% confidence')
|
| 117 |
-
st.write('Concept vector', separation_vector)
|
| 118 |
-
header_col_1.write(f'Concept {concept_id} - Space {st.session_state.space_id} - Number of relevant nodes: {number_important_features} - Val classification performance: {performance}')# - Nodes {",".join(list(imp_nodes))}')
|
| 119 |
-
|
| 120 |
-
# ----------------------------- INPUT column 2 & 3 ----------------------------
|
| 121 |
-
with input_col_2:
|
| 122 |
-
with st.form('image_form'):
|
| 123 |
-
|
| 124 |
-
# image_id = st.number_input('Image ID: ', format='%d', step=1)
|
| 125 |
-
st.write('**Choose or generate a random image to test the disentanglement**')
|
| 126 |
-
chosen_image_id_input = st.empty()
|
| 127 |
-
image_id = chosen_image_id_input.number_input('Image ID:', format='%d', step=1, value=st.session_state.image_id)
|
| 128 |
-
|
| 129 |
-
choose_image_button = st.form_submit_button('Choose the defined image')
|
| 130 |
-
random_id = st.form_submit_button('Generate a random image')
|
| 131 |
-
projection_id = st.form_submit_button('Generate an image on the boudary')
|
| 132 |
-
|
| 133 |
-
if random_id or projection_id:
|
| 134 |
-
image_id = random.randint(0, 50000)
|
| 135 |
-
st.session_state.image_id = image_id
|
| 136 |
-
chosen_image_id_input.number_input('Image ID:', format='%d', step=1, value=st.session_state.image_id)
|
| 137 |
-
st.session_state.projection = False
|
| 138 |
-
|
| 139 |
-
if projection_id:
|
| 140 |
-
st.session_state.projection = True
|
| 141 |
-
|
| 142 |
-
if choose_image_button:
|
| 143 |
-
image_id = int(image_id)
|
| 144 |
-
st.session_state.image_id = int(image_id)
|
| 145 |
-
# st.write(image_id, st.session_state.image_id)
|
| 146 |
-
|
| 147 |
-
with input_col_3:
|
| 148 |
-
with st.form('Variate along the disentangled concept'):
|
| 149 |
-
st.write('**Set range of change**')
|
| 150 |
-
chosen_epsilon_input = st.empty()
|
| 151 |
-
epsilon = chosen_epsilon_input.number_input('Lambda:', min_value=1, step=1)
|
| 152 |
-
epsilon_button = st.form_submit_button('Choose the defined lambda')
|
| 153 |
-
st.write('**Select hierarchical levels to manipulate**')
|
| 154 |
-
layers = st.multiselect('Layers:', tuple(range(14)))
|
| 155 |
-
if len(layers) == 0:
|
| 156 |
-
layers = None
|
| 157 |
-
print(layers)
|
| 158 |
-
layers_button = st.form_submit_button('Choose the defined layers')
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
# ---------------------------- DISPLAY COL 2 ROW 1 ------------------------------
|
| 162 |
-
|
| 163 |
-
#model = torch.load('./data/model_files/pytorch_model.bin', map_location=torch.device('cpu'))
|
| 164 |
-
with dnnlib.util.open_url('./data/model_files/network-snapshot-010600.pkl') as f:
|
| 165 |
-
model = legacy.load_network_pkl(f)['G_ema'].to('cpu') # type: ignore
|
| 166 |
-
|
| 167 |
-
if st.session_state.space_id == 'Z':
|
| 168 |
-
original_image_vec = annotations['z_vectors'][st.session_state.image_id]
|
| 169 |
-
else:
|
| 170 |
-
original_image_vec = annotations['w_vectors'][st.session_state.image_id]
|
| 171 |
-
|
| 172 |
-
if st.session_state.projection:
|
| 173 |
-
original_image_vec = original_image_vec - np.dot(original_image_vec, separation_vector.T) * separation_vector
|
| 174 |
-
print(original_image_vec.shape)
|
| 175 |
-
|
| 176 |
-
img = generate_original_image(original_image_vec, model, latent_space=st.session_state.space_id)
|
| 177 |
-
# input_image = original_image_dict['image']
|
| 178 |
-
# input_label = original_image_dict['label']
|
| 179 |
-
# input_id = original_image_dict['id']
|
| 180 |
-
|
| 181 |
-
with smoothgrad_col_3:
|
| 182 |
-
st.image(img)
|
| 183 |
-
smooth_head_3.write(f'Base image')
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
images, lambdas = regenerate_images(model, original_image_vec, separation_vector, min_epsilon=-(int(epsilon)), max_epsilon=int(epsilon), latent_space=st.session_state.space_id, layers=layers)
|
| 187 |
-
|
| 188 |
-
with smoothgrad_col_1:
|
| 189 |
-
st.image(images[0])
|
| 190 |
-
smooth_head_1.write(f'Change of {np.round(lambdas[0], 2)}')
|
| 191 |
-
|
| 192 |
-
with smoothgrad_col_2:
|
| 193 |
-
st.image(images[1])
|
| 194 |
-
smooth_head_2.write(f'Change of {np.round(lambdas[1], 2)}')
|
| 195 |
-
|
| 196 |
-
with smoothgrad_col_4:
|
| 197 |
-
st.image(images[3])
|
| 198 |
-
smooth_head_4.write(f'Change of {np.round(lambdas[3], 2)}')
|
| 199 |
-
|
| 200 |
-
with smoothgrad_col_5:
|
| 201 |
-
st.image(images[4])
|
| 202 |
-
smooth_head_5.write(f'Change of {np.round(lambdas[4], 2)}')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pages/{5_Textiles_Disentanglement.py → 1_Textiles_Disentanglement.py}
RENAMED
|
@@ -23,18 +23,18 @@ SECONDARY_COLOR = '#bce7db'
|
|
| 23 |
st.title('Disentanglement studies on the Textile Dataset')
|
| 24 |
st.markdown(
|
| 25 |
"""
|
| 26 |
-
This is a demo of the Disentanglement studies on the [
|
| 27 |
""",
|
| 28 |
unsafe_allow_html=False,)
|
| 29 |
|
| 30 |
-
annotations_file = './data/
|
| 31 |
with open(annotations_file, 'rb') as f:
|
| 32 |
annotations = pickle.load(f)
|
| 33 |
|
| 34 |
-
|
| 35 |
if 'image_id' not in st.session_state:
|
| 36 |
st.session_state.image_id = 0
|
| 37 |
-
if '
|
| 38 |
st.session_state.concept_ids =['AMPHORA']
|
| 39 |
if 'space_id' not in st.session_state:
|
| 40 |
st.session_state.space_id = 'W'
|
|
|
|
| 23 |
st.title('Disentanglement studies on the Textile Dataset')
|
| 24 |
st.markdown(
|
| 25 |
"""
|
| 26 |
+
This is a demo of the Disentanglement studies on the [iMET Textiles Dataset](https://www.metmuseum.org/art/collection/search/85531).
|
| 27 |
""",
|
| 28 |
unsafe_allow_html=False,)
|
| 29 |
|
| 30 |
+
annotations_file = './data/textile_annotated_files/seeds0000-100000_S.pkl'
|
| 31 |
with open(annotations_file, 'rb') as f:
|
| 32 |
annotations = pickle.load(f)
|
| 33 |
|
| 34 |
+
COLORS_LIST = []
|
| 35 |
if 'image_id' not in st.session_state:
|
| 36 |
st.session_state.image_id = 0
|
| 37 |
+
if 'color_ids' not in st.session_state:
|
| 38 |
st.session_state.concept_ids =['AMPHORA']
|
| 39 |
if 'space_id' not in st.session_state:
|
| 40 |
st.session_state.space_id = 'W'
|
pages/{2_Concepts_comparison.py → 2_Colours_comparison.py}
RENAMED
|
File without changes
|
pages/3_Oxford_Vases_Disentanglement.py
DELETED
|
@@ -1,178 +0,0 @@
|
|
| 1 |
-
import streamlit as st
|
| 2 |
-
import pickle
|
| 3 |
-
import pandas as pd
|
| 4 |
-
import numpy as np
|
| 5 |
-
import random
|
| 6 |
-
import torch
|
| 7 |
-
|
| 8 |
-
from matplotlib.backends.backend_agg import RendererAgg
|
| 9 |
-
|
| 10 |
-
from backend.disentangle_concepts import *
|
| 11 |
-
import torch_utils
|
| 12 |
-
import dnnlib
|
| 13 |
-
import legacy
|
| 14 |
-
|
| 15 |
-
_lock = RendererAgg.lock
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
st.set_page_config(layout='wide')
|
| 19 |
-
BACKGROUND_COLOR = '#bcd0e7'
|
| 20 |
-
SECONDARY_COLOR = '#bce7db'
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
st.title('Disentanglement studies on the Oxford Vases Dataset')
|
| 24 |
-
st.markdown(
|
| 25 |
-
"""
|
| 26 |
-
This is a demo of the Disentanglement studies on the [Oxford Vases Dataset](https://www.robots.ox.ac.uk/~vgg/data/oxbuildings/).
|
| 27 |
-
""",
|
| 28 |
-
unsafe_allow_html=False,)
|
| 29 |
-
|
| 30 |
-
annotations_file = './data/vase_annotated_files/seeds0000-20000.pkl'
|
| 31 |
-
with open(annotations_file, 'rb') as f:
|
| 32 |
-
annotations = pickle.load(f)
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
if 'image_id' not in st.session_state:
|
| 36 |
-
st.session_state.image_id = 0
|
| 37 |
-
if 'concept_ids' not in st.session_state:
|
| 38 |
-
st.session_state.concept_ids =['AMPHORA']
|
| 39 |
-
if 'space_id' not in st.session_state:
|
| 40 |
-
st.session_state.space_id = 'W'
|
| 41 |
-
|
| 42 |
-
# def on_change_random_input():
|
| 43 |
-
# st.session_state.image_id = st.session_state.image_id
|
| 44 |
-
|
| 45 |
-
# ----------------------------- INPUT ----------------------------------
|
| 46 |
-
st.header('Input')
|
| 47 |
-
input_col_1, input_col_2, input_col_3 = st.columns(3)
|
| 48 |
-
# --------------------------- INPUT column 1 ---------------------------
|
| 49 |
-
with input_col_1:
|
| 50 |
-
with st.form('text_form'):
|
| 51 |
-
|
| 52 |
-
# image_id = st.number_input('Image ID: ', format='%d', step=1)
|
| 53 |
-
st.write('**Choose two options to disentangle**')
|
| 54 |
-
type_col = st.selectbox('Concept category:', tuple(['Provenance', 'Shape Name', 'Fabric', 'Technique']))
|
| 55 |
-
|
| 56 |
-
ann_df = pd.read_csv(f'./data/vase_annotated_files/sim_{type_col}_seeds0000-20000.csv')
|
| 57 |
-
labels = list(ann_df.columns)
|
| 58 |
-
labels.remove('ID')
|
| 59 |
-
labels.remove('Unnamed: 0')
|
| 60 |
-
|
| 61 |
-
concept_ids = st.multiselect('Concepts:', tuple(labels), max_selections=2, default=[labels[2], labels[3]])
|
| 62 |
-
|
| 63 |
-
st.write('**Choose a latent space to disentangle**')
|
| 64 |
-
space_id = st.selectbox('Space:', tuple(['W', 'Z']))
|
| 65 |
-
|
| 66 |
-
choose_text_button = st.form_submit_button('Choose the defined concept and space to disentangle')
|
| 67 |
-
|
| 68 |
-
if choose_text_button:
|
| 69 |
-
concept_ids = list(concept_ids)
|
| 70 |
-
st.session_state.concept_ids = concept_ids
|
| 71 |
-
space_id = str(space_id)
|
| 72 |
-
st.session_state.space_id = space_id
|
| 73 |
-
# st.write(image_id, st.session_state.image_id)
|
| 74 |
-
|
| 75 |
-
# ---------------------------- SET UP OUTPUT ------------------------------
|
| 76 |
-
epsilon_container = st.empty()
|
| 77 |
-
st.header('Output')
|
| 78 |
-
st.subheader('Concept vector')
|
| 79 |
-
|
| 80 |
-
# perform attack container
|
| 81 |
-
# header_col_1, header_col_2, header_col_3, header_col_4, header_col_5 = st.columns([1,1,1,1,1])
|
| 82 |
-
# output_col_1, output_col_2, output_col_3, output_col_4, output_col_5 = st.columns([1,1,1,1,1])
|
| 83 |
-
header_col_1, header_col_2 = st.columns([5,1])
|
| 84 |
-
output_col_1, output_col_2 = st.columns([5,1])
|
| 85 |
-
|
| 86 |
-
st.subheader('Derivations along the concept vector')
|
| 87 |
-
|
| 88 |
-
# prediction error container
|
| 89 |
-
error_container = st.empty()
|
| 90 |
-
smoothgrad_header_container = st.empty()
|
| 91 |
-
|
| 92 |
-
# smoothgrad container
|
| 93 |
-
smooth_head_1, smooth_head_2, smooth_head_3, smooth_head_4, smooth_head_5 = st.columns([1,1,1,1,1])
|
| 94 |
-
smoothgrad_col_1, smoothgrad_col_2, smoothgrad_col_3, smoothgrad_col_4, smoothgrad_col_5 = st.columns([1,1,1,1,1])
|
| 95 |
-
|
| 96 |
-
# ---------------------------- DISPLAY COL 1 ROW 1 ------------------------------
|
| 97 |
-
with output_col_1:
|
| 98 |
-
separation_vector, number_important_features, imp_nodes, performance = get_separation_space(concept_ids, annotations, ann_df, latent_space=st.session_state.space_id, samples=150)
|
| 99 |
-
# st.write(f'Class ID {input_id} - {input_label}: {pred_prob*100:.3f}% confidence')
|
| 100 |
-
st.write('Concept vector', separation_vector)
|
| 101 |
-
header_col_1.write(f'Concept {st.session_state.concept_ids} - Space {st.session_state.space_id} - Number of relevant nodes: {number_important_features} - Val classification performance: {performance}')# - Nodes {",".join(list(imp_nodes))}')
|
| 102 |
-
|
| 103 |
-
# ----------------------------- INPUT column 2 & 3 ----------------------------
|
| 104 |
-
with input_col_2:
|
| 105 |
-
with st.form('image_form'):
|
| 106 |
-
|
| 107 |
-
# image_id = st.number_input('Image ID: ', format='%d', step=1)
|
| 108 |
-
st.write('**Choose or generate a random image to test the disentanglement**')
|
| 109 |
-
chosen_image_id_input = st.empty()
|
| 110 |
-
image_id = chosen_image_id_input.number_input('Image ID:', format='%d', step=1, value=st.session_state.image_id)
|
| 111 |
-
|
| 112 |
-
choose_image_button = st.form_submit_button('Choose the defined image')
|
| 113 |
-
random_id = st.form_submit_button('Generate a random image')
|
| 114 |
-
|
| 115 |
-
if random_id:
|
| 116 |
-
image_id = random.randint(0, 20000)
|
| 117 |
-
st.session_state.image_id = image_id
|
| 118 |
-
chosen_image_id_input.number_input('Image ID:', format='%d', step=1, value=st.session_state.image_id)
|
| 119 |
-
|
| 120 |
-
if choose_image_button:
|
| 121 |
-
image_id = int(image_id)
|
| 122 |
-
st.session_state.image_id = int(image_id)
|
| 123 |
-
# st.write(image_id, st.session_state.image_id)
|
| 124 |
-
|
| 125 |
-
with input_col_3:
|
| 126 |
-
with st.form('Variate along the disentangled concept'):
|
| 127 |
-
st.write('**Set range of change**')
|
| 128 |
-
chosen_epsilon_input = st.empty()
|
| 129 |
-
epsilon = chosen_epsilon_input.number_input('Lambda:', min_value=1, step=1)
|
| 130 |
-
epsilon_button = st.form_submit_button('Choose the defined lambda')
|
| 131 |
-
st.write('**Select hierarchical levels to manipulate**')
|
| 132 |
-
layers = st.multiselect('Layers:', tuple(range(14)))
|
| 133 |
-
if len(layers) == 0:
|
| 134 |
-
layers = None
|
| 135 |
-
print(layers)
|
| 136 |
-
layers_button = st.form_submit_button('Choose the defined layers')
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
# ---------------------------- DISPLAY COL 2 ROW 1 ------------------------------
|
| 140 |
-
|
| 141 |
-
#model = torch.load('./data/model_files/pytorch_model.bin', map_location=torch.device('cpu'))
|
| 142 |
-
with dnnlib.util.open_url('./data/vase_model_files/network-snapshot-003800.pkl') as f:
|
| 143 |
-
model = legacy.load_network_pkl(f)['G_ema'].to('cpu') # type: ignore
|
| 144 |
-
|
| 145 |
-
if st.session_state.space_id == 'Z':
|
| 146 |
-
original_image_vec = annotations['z_vectors'][st.session_state.image_id]
|
| 147 |
-
else:
|
| 148 |
-
original_image_vec = annotations['w_vectors'][st.session_state.image_id]
|
| 149 |
-
|
| 150 |
-
img = generate_original_image(original_image_vec, model, latent_space=st.session_state.space_id)
|
| 151 |
-
|
| 152 |
-
top_pred = ann_df.loc[st.session_state.image_id, labels].astype(float).idxmax()
|
| 153 |
-
# input_image = original_image_dict['image']
|
| 154 |
-
# input_label = original_image_dict['label']
|
| 155 |
-
# input_id = original_image_dict['id']
|
| 156 |
-
|
| 157 |
-
with smoothgrad_col_3:
|
| 158 |
-
st.image(img)
|
| 159 |
-
smooth_head_3.write(f'Base image, predicted as {top_pred}')
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
images, lambdas = regenerate_images(model, original_image_vec, separation_vector, min_epsilon=-(int(epsilon)), max_epsilon=int(epsilon), latent_space=st.session_state.space_id, layers=layers)
|
| 163 |
-
|
| 164 |
-
with smoothgrad_col_1:
|
| 165 |
-
st.image(images[0])
|
| 166 |
-
smooth_head_1.write(f'Change of {np.round(lambdas[0], 2)}')
|
| 167 |
-
|
| 168 |
-
with smoothgrad_col_2:
|
| 169 |
-
st.image(images[1])
|
| 170 |
-
smooth_head_2.write(f'Change of {np.round(lambdas[1], 2)}')
|
| 171 |
-
|
| 172 |
-
with smoothgrad_col_4:
|
| 173 |
-
st.image(images[3])
|
| 174 |
-
smooth_head_4.write(f'Change of {np.round(lambdas[3], 2)}')
|
| 175 |
-
|
| 176 |
-
with smoothgrad_col_5:
|
| 177 |
-
st.image(images[4])
|
| 178 |
-
smooth_head_5.write(f'Change of {np.round(lambdas[4], 2)}')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pages/4_Vase_Qualities_Comparison copy.py
DELETED
|
@@ -1,268 +0,0 @@
|
|
| 1 |
-
import streamlit as st
|
| 2 |
-
import streamlit.components.v1 as components
|
| 3 |
-
|
| 4 |
-
import dnnlib
|
| 5 |
-
import legacy
|
| 6 |
-
|
| 7 |
-
import pickle
|
| 8 |
-
import pandas as pd
|
| 9 |
-
import numpy as np
|
| 10 |
-
from pyvis.network import Network
|
| 11 |
-
|
| 12 |
-
import random
|
| 13 |
-
from sklearn.metrics.pairwise import cosine_similarity
|
| 14 |
-
|
| 15 |
-
from matplotlib.backends.backend_agg import RendererAgg
|
| 16 |
-
|
| 17 |
-
from backend.disentangle_concepts import *
|
| 18 |
-
|
| 19 |
-
_lock = RendererAgg.lock
|
| 20 |
-
|
| 21 |
-
HIGHTLIGHT_COLOR = '#e7bcc5'
|
| 22 |
-
st.set_page_config(layout='wide')
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
st.title('Comparison among concept vectors')
|
| 26 |
-
st.write('> **How do the concept vectors relate to each other?**')
|
| 27 |
-
st.write('> **What is their join impact on the image?**')
|
| 28 |
-
st.write("""Description to write""")
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
annotations_file = './data/vase_annotated_files/seeds0000-20000.pkl'
|
| 32 |
-
with open(annotations_file, 'rb') as f:
|
| 33 |
-
annotations = pickle.load(f)
|
| 34 |
-
|
| 35 |
-
if 'image_id' not in st.session_state:
|
| 36 |
-
st.session_state.image_id = 0
|
| 37 |
-
if 'concept_ids' not in st.session_state:
|
| 38 |
-
st.session_state.concept_ids = ['Provenance ADRIA']
|
| 39 |
-
if 'space_id' not in st.session_state:
|
| 40 |
-
st.session_state.space_id = 'Z'
|
| 41 |
-
if 'type_col' not in st.session_state:
|
| 42 |
-
st.session_state.type_col = 'Provenance'
|
| 43 |
-
|
| 44 |
-
# def on_change_random_input():
|
| 45 |
-
# st.session_state.image_id = st.session_state.image_id
|
| 46 |
-
|
| 47 |
-
# ----------------------------- INPUT ----------------------------------
|
| 48 |
-
st.header('Input')
|
| 49 |
-
input_col_1, input_col_2, input_col_3 = st.columns(3)
|
| 50 |
-
# --------------------------- INPUT column 1 ---------------------------
|
| 51 |
-
with input_col_1:
|
| 52 |
-
with st.form('text_form'):
|
| 53 |
-
|
| 54 |
-
# image_id = st.number_input('Image ID: ', format='%d', step=1)
|
| 55 |
-
st.write('**Choose two options to disentangle**')
|
| 56 |
-
type_col = st.selectbox('Concept category:', tuple(['Provenance', 'Shape Name', 'Fabric', 'Technique']))
|
| 57 |
-
|
| 58 |
-
ann_df = pd.read_csv(f'./data/vase_annotated_files/sim_{type_col}_seeds0000-20000.csv')
|
| 59 |
-
labels = list(ann_df.columns)
|
| 60 |
-
labels.remove('ID')
|
| 61 |
-
labels.remove('Unnamed: 0')
|
| 62 |
-
|
| 63 |
-
concept_ids = st.multiselect('Concepts:', tuple(labels), default=[labels[2], labels[3]])
|
| 64 |
-
|
| 65 |
-
st.write('**Choose a latent space to disentangle**')
|
| 66 |
-
# chosen_text_id_input = st.empty()
|
| 67 |
-
# concept_id = chosen_text_id_input.text_input('Concept:', value=st.session_state.concept_id)
|
| 68 |
-
space_id = st.selectbox('Space:', tuple(['Z', 'W']))
|
| 69 |
-
|
| 70 |
-
choose_text_button = st.form_submit_button('Choose the defined concept and space to disentangle')
|
| 71 |
-
|
| 72 |
-
if choose_text_button:
|
| 73 |
-
st.session_state.concept_ids = list(concept_ids)
|
| 74 |
-
space_id = str(space_id)
|
| 75 |
-
st.session_state.space_id = space_id
|
| 76 |
-
st.session_state.type_col = type_col
|
| 77 |
-
# st.write(image_id, st.session_state.image_id)
|
| 78 |
-
|
| 79 |
-
# ---------------------------- SET UP OUTPUT ------------------------------
|
| 80 |
-
epsilon_container = st.empty()
|
| 81 |
-
st.header('Output')
|
| 82 |
-
st.subheader('Concept vector')
|
| 83 |
-
|
| 84 |
-
# perform attack container
|
| 85 |
-
# header_col_1, header_col_2, header_col_3, header_col_4, header_col_5 = st.columns([1,1,1,1,1])
|
| 86 |
-
# output_col_1, output_col_2, output_col_3, output_col_4, output_col_5 = st.columns([1,1,1,1,1])
|
| 87 |
-
header_col_1, header_col_2 = st.columns([1,1])
|
| 88 |
-
output_col_1, output_col_2 = st.columns([1,1])
|
| 89 |
-
|
| 90 |
-
st.subheader('Derivations along the concept vector')
|
| 91 |
-
|
| 92 |
-
# prediction error container
|
| 93 |
-
error_container = st.empty()
|
| 94 |
-
smoothgrad_header_container = st.empty()
|
| 95 |
-
|
| 96 |
-
# smoothgrad container
|
| 97 |
-
smooth_head_1, smooth_head_2, smooth_head_3, smooth_head_4, smooth_head_5 = st.columns([1,1,1,1,1])
|
| 98 |
-
smoothgrad_col_1, smoothgrad_col_2, smoothgrad_col_3, smoothgrad_col_4, smoothgrad_col_5 = st.columns([1,1,1,1,1])
|
| 99 |
-
|
| 100 |
-
# ---------------------------- DISPLAY COL 1 ROW 1 ------------------------------
|
| 101 |
-
with output_col_1:
|
| 102 |
-
vectors, nodes_in_common, performances = get_concepts_vectors(concept_ids, annotations, ann_df, latent_space=space_id)
|
| 103 |
-
header_col_1.write(f'Concepts {", ".join(concept_ids)} - Latent space {space_id} - Relevant nodes in common: {nodes_in_common} - Performance of the concept vectors: {performances}')# - Nodes {",".join(list(imp_nodes))}')
|
| 104 |
-
|
| 105 |
-
edges = []
|
| 106 |
-
for i in range(len(concept_ids)):
|
| 107 |
-
for j in range(len(concept_ids)):
|
| 108 |
-
if i != j:
|
| 109 |
-
print(f'Similarity between {concept_ids[i]} and {concept_ids[j]}')
|
| 110 |
-
similarity = cosine_similarity(vectors[i,:].reshape(1, -1), vectors[j,:].reshape(1, -1))
|
| 111 |
-
print(np.round(similarity[0][0], 3))
|
| 112 |
-
edges.append((concept_ids[i], concept_ids[j], np.round(similarity[0][0], 3)))
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
net = Network(height="750px", width="100%",)
|
| 116 |
-
for e in edges:
|
| 117 |
-
src = e[0]
|
| 118 |
-
dst = e[1]
|
| 119 |
-
w = e[2]
|
| 120 |
-
|
| 121 |
-
net.add_node(src, src, title=src)
|
| 122 |
-
net.add_node(dst, dst, title=dst)
|
| 123 |
-
net.add_edge(src, dst, value=w, title=src + ' to ' + dst + ' similarity ' +str(w))
|
| 124 |
-
|
| 125 |
-
# Generate network with specific layout settings
|
| 126 |
-
net.repulsion(
|
| 127 |
-
node_distance=420,
|
| 128 |
-
central_gravity=0.33,
|
| 129 |
-
spring_length=110,
|
| 130 |
-
spring_strength=0.10,
|
| 131 |
-
damping=0.95
|
| 132 |
-
)
|
| 133 |
-
|
| 134 |
-
# Save and read graph as HTML file (on Streamlit Sharing)
|
| 135 |
-
try:
|
| 136 |
-
path = '/tmp'
|
| 137 |
-
net.save_graph(f'{path}/pyvis_graph.html')
|
| 138 |
-
HtmlFile = open(f'{path}/pyvis_graph.html', 'r', encoding='utf-8')
|
| 139 |
-
|
| 140 |
-
# Save and read graph as HTML file (locally)
|
| 141 |
-
except:
|
| 142 |
-
path = '/html_files'
|
| 143 |
-
net.save_graph(f'{path}/pyvis_graph.html')
|
| 144 |
-
HtmlFile = open(f'{path}/pyvis_graph.html', 'r', encoding='utf-8')
|
| 145 |
-
|
| 146 |
-
# Load HTML file in HTML component for display on Streamlit page
|
| 147 |
-
components.html(HtmlFile.read(), height=435)
|
| 148 |
-
|
| 149 |
-
with output_col_2:
|
| 150 |
-
with open('data/CLIP_vecs_vases.pkl', 'rb') as f:
|
| 151 |
-
vectors_CLIP = pickle.load(f)
|
| 152 |
-
|
| 153 |
-
# st.write(f'Class ID {input_id} - {input_label}: {pred_prob*100:.3f}% confidence')
|
| 154 |
-
#st.write('Concept vector', separation_vector)
|
| 155 |
-
header_col_2.write(f'Concepts {", ".join(concept_ids)} - Latent space CLIP')# - Nodes {",".join(list(imp_nodes))}')
|
| 156 |
-
|
| 157 |
-
edges_clip = []
|
| 158 |
-
for c1 in concept_ids:
|
| 159 |
-
for c2 in concept_ids:
|
| 160 |
-
if c1 != c2:
|
| 161 |
-
|
| 162 |
-
print(f'Similarity between {c1} and {c2}')
|
| 163 |
-
similarity = cosine_similarity(vectors_CLIP[st.session_state.type_col + ' ' + c1].reshape(1, -1), vectors_CLIP[st.session_state.type_col + ' ' + c2].reshape(1, -1))
|
| 164 |
-
print(np.round(similarity[0][0], 3))
|
| 165 |
-
edges_clip.append((c1, c2, np.round(float(np.round(similarity[0][0], 3)), 3)))
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
net_clip = Network(height="750px", width="100%",)
|
| 169 |
-
for e in edges_clip:
|
| 170 |
-
src = e[0]
|
| 171 |
-
dst = e[1]
|
| 172 |
-
w = e[2]
|
| 173 |
-
|
| 174 |
-
net_clip.add_node(src, src, title=src)
|
| 175 |
-
net_clip.add_node(dst, dst, title=dst)
|
| 176 |
-
net_clip.add_edge(src, dst, value=w, title=src + ' to ' + dst + ' similarity ' +str(w))
|
| 177 |
-
|
| 178 |
-
# Generate network with specific layout settings
|
| 179 |
-
net_clip.repulsion(
|
| 180 |
-
node_distance=420,
|
| 181 |
-
central_gravity=0.33,
|
| 182 |
-
spring_length=110,
|
| 183 |
-
spring_strength=0.10,
|
| 184 |
-
damping=0.95
|
| 185 |
-
)
|
| 186 |
-
|
| 187 |
-
# Save and read graph as HTML file (on Streamlit Sharing)
|
| 188 |
-
try:
|
| 189 |
-
path = '/tmp'
|
| 190 |
-
net_clip.save_graph(f'{path}/pyvis_graph_clip.html')
|
| 191 |
-
HtmlFile = open(f'{path}/pyvis_graph_clip.html', 'r', encoding='utf-8')
|
| 192 |
-
|
| 193 |
-
# Save and read graph as HTML file (locally)
|
| 194 |
-
except:
|
| 195 |
-
path = '/html_files'
|
| 196 |
-
net_clip.save_graph(f'{path}/pyvis_graph_clip.html')
|
| 197 |
-
HtmlFile = open(f'{path}/pyvis_graph_clip.html', 'r', encoding='utf-8')
|
| 198 |
-
|
| 199 |
-
# Load HTML file in HTML component for display on Streamlit page
|
| 200 |
-
components.html(HtmlFile.read(), height=435)
|
| 201 |
-
|
| 202 |
-
# ----------------------------- INPUT column 2 & 3 ----------------------------
|
| 203 |
-
with input_col_2:
|
| 204 |
-
with st.form('image_form'):
|
| 205 |
-
|
| 206 |
-
# image_id = st.number_input('Image ID: ', format='%d', step=1)
|
| 207 |
-
st.write('**Choose or generate a random image to test the disentanglement**')
|
| 208 |
-
chosen_image_id_input = st.empty()
|
| 209 |
-
image_id = chosen_image_id_input.number_input('Image ID:', format='%d', step=1, value=st.session_state.image_id)
|
| 210 |
-
|
| 211 |
-
choose_image_button = st.form_submit_button('Choose the defined image')
|
| 212 |
-
random_id = st.form_submit_button('Generate a random image')
|
| 213 |
-
|
| 214 |
-
if random_id:
|
| 215 |
-
image_id = random.randint(0, 50000)
|
| 216 |
-
st.session_state.image_id = image_id
|
| 217 |
-
chosen_image_id_input.number_input('Image ID:', format='%d', step=1, value=st.session_state.image_id)
|
| 218 |
-
|
| 219 |
-
if choose_image_button:
|
| 220 |
-
image_id = int(image_id)
|
| 221 |
-
st.session_state.image_id = int(image_id)
|
| 222 |
-
# st.write(image_id, st.session_state.image_id)
|
| 223 |
-
|
| 224 |
-
with input_col_3:
|
| 225 |
-
with st.form('Variate along the disentangled concepts'):
|
| 226 |
-
st.write('**Set range of change**')
|
| 227 |
-
chosen_epsilon_input = st.empty()
|
| 228 |
-
epsilon = chosen_epsilon_input.number_input('Epsilon:', min_value=1, step=1)
|
| 229 |
-
epsilon_button = st.form_submit_button('Choose the defined epsilon')
|
| 230 |
-
|
| 231 |
-
# # ---------------------------- DISPLAY COL 2 ROW 1 ------------------------------
|
| 232 |
-
|
| 233 |
-
|
| 234 |
-
with dnnlib.util.open_url('./data/vase_model_files/network-snapshot-003800.pkl') as f:
|
| 235 |
-
model = legacy.load_network_pkl(f)['G_ema'].to('cpu') # type: ignore
|
| 236 |
-
|
| 237 |
-
if st.session_state.space_id == 'Z':
|
| 238 |
-
original_image_vec = annotations['z_vectors'][st.session_state.image_id]
|
| 239 |
-
else:
|
| 240 |
-
original_image_vec = annotations['w_vectors'][st.session_state.image_id]
|
| 241 |
-
|
| 242 |
-
img = generate_original_image(original_image_vec, model, latent_space=st.session_state.space_id)
|
| 243 |
-
# input_image = original_image_dict['image']
|
| 244 |
-
# input_label = original_image_dict['label']
|
| 245 |
-
# input_id = original_image_dict['id']
|
| 246 |
-
|
| 247 |
-
with smoothgrad_col_3:
|
| 248 |
-
st.image(img)
|
| 249 |
-
smooth_head_3.write(f'Base image')
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
images, lambdas = generate_joint_effect(model, original_image_vec, vectors, min_epsilon=-(int(epsilon)), max_epsilon=int(epsilon), latent_space=st.session_state.space_id)
|
| 253 |
-
|
| 254 |
-
with smoothgrad_col_1:
|
| 255 |
-
st.image(images[0])
|
| 256 |
-
smooth_head_1.write(f'Change of {np.round(lambdas[0], 2)}')
|
| 257 |
-
|
| 258 |
-
with smoothgrad_col_2:
|
| 259 |
-
st.image(images[1])
|
| 260 |
-
smooth_head_2.write(f'Change of {np.round(lambdas[1], 2)}')
|
| 261 |
-
|
| 262 |
-
with smoothgrad_col_4:
|
| 263 |
-
st.image(images[3])
|
| 264 |
-
smooth_head_4.write(f'Change of {np.round(lambdas[3], 2)}')
|
| 265 |
-
|
| 266 |
-
with smoothgrad_col_5:
|
| 267 |
-
st.image(images[4])
|
| 268 |
-
smooth_head_5.write(f'Change of {np.round(lambdas[4], 2)}')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|