Spaces:
Running
on
Zero
Running
on
Zero
update color and tsne metric
Browse files
app.py
CHANGED
|
@@ -30,7 +30,8 @@ import threading
|
|
| 30 |
|
| 31 |
from ncut_pytorch.backbone import extract_features, load_model
|
| 32 |
from ncut_pytorch.backbone import MODEL_DICT, LAYER_DICT, RES_DICT
|
| 33 |
-
from ncut_pytorch import NCUT
|
|
|
|
| 34 |
|
| 35 |
DATASET_TUPS = [
|
| 36 |
# (name, num_classes)
|
|
@@ -66,6 +67,7 @@ def compute_ncut(
|
|
| 66 |
knn_ncut=10,
|
| 67 |
knn_tsne=10,
|
| 68 |
embedding_method="UMAP",
|
|
|
|
| 69 |
num_sample_tsne=300,
|
| 70 |
perplexity=150,
|
| 71 |
n_neighbors=150,
|
|
@@ -100,6 +102,7 @@ def compute_ncut(
|
|
| 100 |
_, rgb = eigenvector_to_rgb(
|
| 101 |
eigvecs,
|
| 102 |
method=embedding_method,
|
|
|
|
| 103 |
num_sample=num_sample_tsne,
|
| 104 |
perplexity=perplexity,
|
| 105 |
n_neighbors=n_neighbors,
|
|
@@ -123,14 +126,20 @@ def dont_use_too_much_green(image_rgb):
|
|
| 123 |
return image_rgb
|
| 124 |
|
| 125 |
|
| 126 |
-
def to_pil_images(images, target_size=
|
| 127 |
size = images[0].shape[1]
|
| 128 |
multiplier = target_size // size
|
| 129 |
res = int(size * multiplier)
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 134 |
|
| 135 |
|
| 136 |
|
|
@@ -221,6 +230,7 @@ def ncut_run(
|
|
| 221 |
num_sample_ncut=10000,
|
| 222 |
knn_ncut=10,
|
| 223 |
embedding_method="UMAP",
|
|
|
|
| 224 |
num_sample_tsne=1000,
|
| 225 |
knn_tsne=10,
|
| 226 |
perplexity=500,
|
|
@@ -304,6 +314,7 @@ def ncut_run(
|
|
| 304 |
knn_tsne=knn_tsne,
|
| 305 |
num_sample_tsne=num_sample_tsne,
|
| 306 |
embedding_method=embedding_method,
|
|
|
|
| 307 |
perplexity=perplexity,
|
| 308 |
n_neighbors=n_neighbors,
|
| 309 |
min_dist=min_dist,
|
|
@@ -333,6 +344,7 @@ def ncut_run(
|
|
| 333 |
knn_tsne=10,
|
| 334 |
num_sample_tsne=300,
|
| 335 |
embedding_method=embedding_method,
|
|
|
|
| 336 |
perplexity=perplexity,
|
| 337 |
n_neighbors=n_neighbors,
|
| 338 |
min_dist=min_dist,
|
|
@@ -351,6 +363,7 @@ def ncut_run(
|
|
| 351 |
knn_tsne=knn_tsne,
|
| 352 |
num_sample_tsne=num_sample_tsne,
|
| 353 |
embedding_method=embedding_method,
|
|
|
|
| 354 |
perplexity=perplexity,
|
| 355 |
n_neighbors=n_neighbors,
|
| 356 |
min_dist=min_dist,
|
|
@@ -378,7 +391,7 @@ def ncut_run(
|
|
| 378 |
galleries = []
|
| 379 |
for i_prompt in range(len(lisa_prompts)):
|
| 380 |
_rgb = rgb[i_prompt]
|
| 381 |
-
galleries.append(to_pil_images(_rgb
|
| 382 |
return *galleries, logging_str
|
| 383 |
|
| 384 |
rgb = dont_use_too_much_green(rgb)
|
|
@@ -584,6 +597,7 @@ def run_fn(
|
|
| 584 |
num_sample_ncut=10000,
|
| 585 |
knn_ncut=10,
|
| 586 |
embedding_method="UMAP",
|
|
|
|
| 587 |
num_sample_tsne=1000,
|
| 588 |
knn_tsne=10,
|
| 589 |
perplexity=500,
|
|
@@ -699,6 +713,7 @@ def run_fn(
|
|
| 699 |
"num_sample_ncut": num_sample_ncut,
|
| 700 |
"knn_ncut": knn_ncut,
|
| 701 |
"embedding_method": embedding_method,
|
|
|
|
| 702 |
"num_sample_tsne": num_sample_tsne,
|
| 703 |
"knn_tsne": knn_tsne,
|
| 704 |
"perplexity": perplexity,
|
|
@@ -882,9 +897,61 @@ def make_dataset_images_section(advanced=False, is_random=False):
|
|
| 882 |
|
| 883 |
return dataset_dropdown, num_images_slider, random_seed_slider, load_images_button
|
| 884 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 885 |
def make_output_images_section():
|
| 886 |
gr.Markdown('### Output Images')
|
| 887 |
-
output_gallery = gr.Gallery(value=[], label="NCUT Embedding", show_label=False, elem_id="ncut", columns=[3], rows=[1], object_fit="contain", height="auto", show_share_button=True)
|
|
|
|
| 888 |
return output_gallery
|
| 889 |
|
| 890 |
def make_parameters_section(is_lisa=False):
|
|
@@ -951,6 +1018,7 @@ def make_parameters_section(is_lisa=False):
|
|
| 951 |
sampling_method_dropdown = gr.Dropdown(["fps", "random"], label="NCUT: Sampling method", value="fps", elem_id="sampling_method", info="Nyström approximation")
|
| 952 |
knn_ncut_slider = gr.Slider(1, 100, step=1, label="NCUT: KNN", value=10, elem_id="knn_ncut", info="Nyström approximation")
|
| 953 |
embedding_method_dropdown = gr.Dropdown(["tsne_3d", "umap_3d", "umap_shpere", "tsne_2d", "umap_2d"], label="Coloring method", value="tsne_3d", elem_id="embedding_method")
|
|
|
|
| 954 |
num_sample_tsne_slider = gr.Slider(100, 10000, step=100, label="t-SNE/UMAP: num_sample", value=300, elem_id="num_sample_tsne", info="Nyström approximation")
|
| 955 |
knn_tsne_slider = gr.Slider(1, 100, step=1, label="t-SNE/UMAP: KNN", value=10, elem_id="knn_tsne", info="Nyström approximation")
|
| 956 |
perplexity_slider = gr.Slider(10, 1000, step=10, label="t-SNE: perplexity", value=150, elem_id="perplexity")
|
|
@@ -958,7 +1026,7 @@ def make_parameters_section(is_lisa=False):
|
|
| 958 |
min_dist_slider = gr.Slider(0.1, 1, step=0.1, label="UMAP: min_dist", value=0.1, elem_id="min_dist")
|
| 959 |
return [model_dropdown, layer_slider, node_type_dropdown, num_eig_slider,
|
| 960 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 961 |
-
embedding_method_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 962 |
perplexity_slider, n_neighbors_slider, min_dist_slider,
|
| 963 |
sampling_method_dropdown, positive_prompt, negative_prompt]
|
| 964 |
|
|
@@ -980,7 +1048,7 @@ with demo:
|
|
| 980 |
[
|
| 981 |
model_dropdown, layer_slider, node_type_dropdown, num_eig_slider,
|
| 982 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 983 |
-
embedding_method_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 984 |
perplexity_slider, n_neighbors_slider, min_dist_slider,
|
| 985 |
sampling_method_dropdown, positive_prompt, negative_prompt
|
| 986 |
] = make_parameters_section()
|
|
@@ -999,7 +1067,7 @@ with demo:
|
|
| 999 |
positive_prompt, negative_prompt,
|
| 1000 |
false_placeholder, no_prompt, no_prompt, no_prompt,
|
| 1001 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1002 |
-
embedding_method_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1003 |
perplexity_slider, n_neighbors_slider, min_dist_slider, sampling_method_dropdown
|
| 1004 |
],
|
| 1005 |
outputs=[output_gallery, logging_text],
|
|
@@ -1039,7 +1107,7 @@ with demo:
|
|
| 1039 |
[
|
| 1040 |
model_dropdown, layer_slider, node_type_dropdown, num_eig_slider,
|
| 1041 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1042 |
-
embedding_method_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1043 |
perplexity_slider, n_neighbors_slider, min_dist_slider,
|
| 1044 |
sampling_method_dropdown, positive_prompt, negative_prompt
|
| 1045 |
] = make_parameters_section()
|
|
@@ -1062,7 +1130,7 @@ with demo:
|
|
| 1062 |
positive_prompt, negative_prompt,
|
| 1063 |
false_placeholder, no_prompt, no_prompt, no_prompt,
|
| 1064 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1065 |
-
embedding_method_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1066 |
perplexity_slider, n_neighbors_slider, min_dist_slider, sampling_method_dropdown,
|
| 1067 |
old_school_ncut_checkbox
|
| 1068 |
],
|
|
@@ -1079,13 +1147,16 @@ with demo:
|
|
| 1079 |
with gr.Row():
|
| 1080 |
with gr.Column(scale=5, min_width=200):
|
| 1081 |
gr.Markdown('### Output (Recursion #1)')
|
| 1082 |
-
l1_gallery = gr.Gallery(value=[], label="Recursion #1", show_label=False, elem_id="ncut_l1", columns=[3], rows=[5], object_fit="contain", height="auto", show_fullscreen_button=True)
|
|
|
|
| 1083 |
with gr.Column(scale=5, min_width=200):
|
| 1084 |
gr.Markdown('### Output (Recursion #2)')
|
| 1085 |
-
l2_gallery = gr.Gallery(value=[], label="Recursion #2", show_label=False, elem_id="ncut_l2", columns=[3], rows=[5], object_fit="contain", height="auto", show_fullscreen_button=True)
|
|
|
|
| 1086 |
with gr.Column(scale=5, min_width=200):
|
| 1087 |
gr.Markdown('### Output (Recursion #3)')
|
| 1088 |
-
l3_gallery = gr.Gallery(value=[], label="Recursion #3", show_label=False, elem_id="ncut_l3", columns=[3], rows=[5], object_fit="contain", height="auto", show_fullscreen_button=True)
|
|
|
|
| 1089 |
with gr.Row():
|
| 1090 |
with gr.Column(scale=5, min_width=200):
|
| 1091 |
input_gallery, submit_button, clear_images_button = make_input_images_section()
|
|
@@ -1105,7 +1176,7 @@ with demo:
|
|
| 1105 |
[
|
| 1106 |
model_dropdown, layer_slider, node_type_dropdown, num_eig_slider,
|
| 1107 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1108 |
-
embedding_method_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1109 |
perplexity_slider, n_neighbors_slider, min_dist_slider,
|
| 1110 |
sampling_method_dropdown, positive_prompt, negative_prompt
|
| 1111 |
] = make_parameters_section()
|
|
@@ -1136,7 +1207,7 @@ with demo:
|
|
| 1136 |
positive_prompt, negative_prompt,
|
| 1137 |
false_placeholder, no_prompt, no_prompt, no_prompt,
|
| 1138 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1139 |
-
embedding_method_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1140 |
perplexity_slider, n_neighbors_slider, min_dist_slider, sampling_method_dropdown,
|
| 1141 |
false_placeholder, number_placeholder, true_placeholder,
|
| 1142 |
l2_num_eig_slider, l3_num_eig_slider, metric_dropdown,
|
|
@@ -1156,7 +1227,7 @@ with demo:
|
|
| 1156 |
[
|
| 1157 |
model_dropdown, layer_slider, node_type_dropdown, num_eig_slider,
|
| 1158 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1159 |
-
embedding_method_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1160 |
perplexity_slider, n_neighbors_slider, min_dist_slider,
|
| 1161 |
sampling_method_dropdown, positive_prompt, negative_prompt
|
| 1162 |
] = make_parameters_section()
|
|
@@ -1179,7 +1250,7 @@ with demo:
|
|
| 1179 |
positive_prompt, negative_prompt,
|
| 1180 |
false_placeholder, no_prompt, no_prompt, no_prompt,
|
| 1181 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1182 |
-
embedding_method_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1183 |
perplexity_slider, n_neighbors_slider, min_dist_slider, sampling_method_dropdown,
|
| 1184 |
place_holder_false, max_frame_number
|
| 1185 |
],
|
|
@@ -1204,15 +1275,15 @@ with demo:
|
|
| 1204 |
with gr.Row():
|
| 1205 |
with gr.Column(scale=5, min_width=200):
|
| 1206 |
gr.Markdown('### Output (Prompt #1)')
|
| 1207 |
-
l1_gallery = gr.Gallery(value=[], label="Prompt #1", show_label=False, elem_id="ncut_p1", columns=[3], rows=[5], object_fit="contain", height="auto", show_fullscreen_button=True)
|
| 1208 |
prompt1 = gr.Textbox(label="Input Prompt #1", elem_id="prompt1", value="where is the person, include the clothes, don't include the guitar and chair", lines=3)
|
| 1209 |
with gr.Column(scale=5, min_width=200):
|
| 1210 |
gr.Markdown('### Output (Prompt #2)')
|
| 1211 |
-
l2_gallery = gr.Gallery(value=[], label="Prompt #2", show_label=False, elem_id="ncut_p2", columns=[3], rows=[5], object_fit="contain", height="auto", show_fullscreen_button=True)
|
| 1212 |
prompt2 = gr.Textbox(label="Input Prompt #2", elem_id="prompt2", value="where is the Gibson Les Pual guitar", lines=3)
|
| 1213 |
with gr.Column(scale=5, min_width=200):
|
| 1214 |
gr.Markdown('### Output (Prompt #3)')
|
| 1215 |
-
l3_gallery = gr.Gallery(value=[], label="Prompt #3", show_label=False, elem_id="ncut_p3", columns=[3], rows=[5], object_fit="contain", height="auto", show_fullscreen_button=True)
|
| 1216 |
prompt3 = gr.Textbox(label="Input Prompt #3", elem_id="prompt3", value="where is the floor", lines=3)
|
| 1217 |
|
| 1218 |
with gr.Row():
|
|
@@ -1225,7 +1296,7 @@ with demo:
|
|
| 1225 |
[
|
| 1226 |
model_dropdown, layer_slider, node_type_dropdown, num_eig_slider,
|
| 1227 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1228 |
-
embedding_method_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1229 |
perplexity_slider, n_neighbors_slider, min_dist_slider,
|
| 1230 |
sampling_method_dropdown, positive_prompt, negative_prompt
|
| 1231 |
] = make_parameters_section(is_lisa=True)
|
|
@@ -1240,7 +1311,7 @@ with demo:
|
|
| 1240 |
positive_prompt, negative_prompt,
|
| 1241 |
true_placeholder, prompt1, prompt2, prompt3,
|
| 1242 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1243 |
-
embedding_method_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1244 |
perplexity_slider, n_neighbors_slider, min_dist_slider, sampling_method_dropdown
|
| 1245 |
],
|
| 1246 |
outputs=galleries + [logging_text],
|
|
@@ -1273,7 +1344,7 @@ with demo:
|
|
| 1273 |
[
|
| 1274 |
model_dropdown, layer_slider, node_type_dropdown, num_eig_slider,
|
| 1275 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1276 |
-
embedding_method_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1277 |
perplexity_slider, n_neighbors_slider, min_dist_slider,
|
| 1278 |
sampling_method_dropdown, positive_prompt, negative_prompt
|
| 1279 |
] = make_parameters_section()
|
|
@@ -1309,7 +1380,7 @@ with demo:
|
|
| 1309 |
positive_prompt, negative_prompt,
|
| 1310 |
false_placeholder, no_prompt, no_prompt, no_prompt,
|
| 1311 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1312 |
-
embedding_method_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1313 |
perplexity_slider, n_neighbors_slider, min_dist_slider, sampling_method_dropdown
|
| 1314 |
],
|
| 1315 |
# outputs=galleries + [logging_text],
|
|
@@ -1320,12 +1391,13 @@ with demo:
|
|
| 1320 |
def add_one_model(i_model=1):
|
| 1321 |
with gr.Column(scale=5, min_width=200) as col:
|
| 1322 |
gr.Markdown(f'### Output Images')
|
| 1323 |
-
output_gallery = gr.Gallery(value=[], label="NCUT Embedding", show_label=False, elem_id=f"ncut{i_model}", columns=[3], rows=[1], object_fit="contain", height="auto", show_fullscreen_button=True)
|
| 1324 |
submit_button = gr.Button("🔴 RUN", elem_id=f"submit_button{i_model}", variant='primary')
|
|
|
|
| 1325 |
[
|
| 1326 |
model_dropdown, layer_slider, node_type_dropdown, num_eig_slider,
|
| 1327 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1328 |
-
embedding_method_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1329 |
perplexity_slider, n_neighbors_slider, min_dist_slider,
|
| 1330 |
sampling_method_dropdown, positive_prompt, negative_prompt
|
| 1331 |
] = make_parameters_section()
|
|
@@ -1341,7 +1413,7 @@ with demo:
|
|
| 1341 |
positive_prompt, negative_prompt,
|
| 1342 |
false_placeholder, no_prompt, no_prompt, no_prompt,
|
| 1343 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1344 |
-
embedding_method_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1345 |
perplexity_slider, n_neighbors_slider, min_dist_slider, sampling_method_dropdown
|
| 1346 |
],
|
| 1347 |
outputs=[output_gallery, logging_text]
|
|
@@ -1390,14 +1462,18 @@ with demo:
|
|
| 1390 |
|
| 1391 |
|
| 1392 |
with gr.Tab('📄About'):
|
| 1393 |
-
gr.Markdown("
|
|
|
|
| 1394 |
gr.Markdown("---")
|
| 1395 |
gr.Markdown("**Normalized Cuts**, aka. spectral clustering, is a graphical method to analyze data grouping in the affinity eigenvector space. It has been widely used for unsupervised segmentation in the 2000s.")
|
|
|
|
| 1396 |
gr.Markdown("---")
|
| 1397 |
-
gr.Markdown("
|
| 1398 |
gr.Markdown("- **Nyström** Normalized Cut, is a new approximation algorithm developed for large-scale graph cuts, a large-graph of million nodes can be processed in under 10s (cpu) or 2s (gpu).")
|
| 1399 |
gr.Markdown("- **spectral-tSNE** visualization, a new method to visualize the high-dimensional eigenvector space with 3D RGB cube. Color is aligned across images, color infers distance in representation.")
|
| 1400 |
-
|
|
|
|
|
|
|
| 1401 |
|
| 1402 |
with gr.Row():
|
| 1403 |
with gr.Column():
|
|
|
|
| 30 |
|
| 31 |
from ncut_pytorch.backbone import extract_features, load_model
|
| 32 |
from ncut_pytorch.backbone import MODEL_DICT, LAYER_DICT, RES_DICT
|
| 33 |
+
from ncut_pytorch import NCUT
|
| 34 |
+
from ncut_pytorch import eigenvector_to_rgb, rotate_rgb_cube
|
| 35 |
|
| 36 |
DATASET_TUPS = [
|
| 37 |
# (name, num_classes)
|
|
|
|
| 67 |
knn_ncut=10,
|
| 68 |
knn_tsne=10,
|
| 69 |
embedding_method="UMAP",
|
| 70 |
+
embedding_metric='euclidean',
|
| 71 |
num_sample_tsne=300,
|
| 72 |
perplexity=150,
|
| 73 |
n_neighbors=150,
|
|
|
|
| 102 |
_, rgb = eigenvector_to_rgb(
|
| 103 |
eigvecs,
|
| 104 |
method=embedding_method,
|
| 105 |
+
metric=embedding_metric,
|
| 106 |
num_sample=num_sample_tsne,
|
| 107 |
perplexity=perplexity,
|
| 108 |
n_neighbors=n_neighbors,
|
|
|
|
| 126 |
return image_rgb
|
| 127 |
|
| 128 |
|
| 129 |
+
def to_pil_images(images, target_size=512, resize=True):
|
| 130 |
size = images[0].shape[1]
|
| 131 |
multiplier = target_size // size
|
| 132 |
res = int(size * multiplier)
|
| 133 |
+
pil_images = [
|
| 134 |
+
Image.fromarray((image * 255).cpu().numpy().astype(np.uint8))
|
| 135 |
+
for image in images
|
| 136 |
+
]
|
| 137 |
+
if resize:
|
| 138 |
+
pil_images = [
|
| 139 |
+
image.resize((res, res), Image.Resampling.NEAREST)
|
| 140 |
+
for image in pil_images
|
| 141 |
+
]
|
| 142 |
+
return pil_images
|
| 143 |
|
| 144 |
|
| 145 |
|
|
|
|
| 230 |
num_sample_ncut=10000,
|
| 231 |
knn_ncut=10,
|
| 232 |
embedding_method="UMAP",
|
| 233 |
+
embedding_metric='euclidean',
|
| 234 |
num_sample_tsne=1000,
|
| 235 |
knn_tsne=10,
|
| 236 |
perplexity=500,
|
|
|
|
| 314 |
knn_tsne=knn_tsne,
|
| 315 |
num_sample_tsne=num_sample_tsne,
|
| 316 |
embedding_method=embedding_method,
|
| 317 |
+
embedding_metric=embedding_metric,
|
| 318 |
perplexity=perplexity,
|
| 319 |
n_neighbors=n_neighbors,
|
| 320 |
min_dist=min_dist,
|
|
|
|
| 344 |
knn_tsne=10,
|
| 345 |
num_sample_tsne=300,
|
| 346 |
embedding_method=embedding_method,
|
| 347 |
+
embedding_metric=embedding_metric,
|
| 348 |
perplexity=perplexity,
|
| 349 |
n_neighbors=n_neighbors,
|
| 350 |
min_dist=min_dist,
|
|
|
|
| 363 |
knn_tsne=knn_tsne,
|
| 364 |
num_sample_tsne=num_sample_tsne,
|
| 365 |
embedding_method=embedding_method,
|
| 366 |
+
embedding_metric=embedding_metric,
|
| 367 |
perplexity=perplexity,
|
| 368 |
n_neighbors=n_neighbors,
|
| 369 |
min_dist=min_dist,
|
|
|
|
| 391 |
galleries = []
|
| 392 |
for i_prompt in range(len(lisa_prompts)):
|
| 393 |
_rgb = rgb[i_prompt]
|
| 394 |
+
galleries.append(to_pil_images(_rgb))
|
| 395 |
return *galleries, logging_str
|
| 396 |
|
| 397 |
rgb = dont_use_too_much_green(rgb)
|
|
|
|
| 597 |
num_sample_ncut=10000,
|
| 598 |
knn_ncut=10,
|
| 599 |
embedding_method="UMAP",
|
| 600 |
+
embedding_metric='euclidean',
|
| 601 |
num_sample_tsne=1000,
|
| 602 |
knn_tsne=10,
|
| 603 |
perplexity=500,
|
|
|
|
| 713 |
"num_sample_ncut": num_sample_ncut,
|
| 714 |
"knn_ncut": knn_ncut,
|
| 715 |
"embedding_method": embedding_method,
|
| 716 |
+
"embedding_metric": embedding_metric,
|
| 717 |
"num_sample_tsne": num_sample_tsne,
|
| 718 |
"knn_tsne": knn_tsne,
|
| 719 |
"perplexity": perplexity,
|
|
|
|
| 897 |
|
| 898 |
return dataset_dropdown, num_images_slider, random_seed_slider, load_images_button
|
| 899 |
|
| 900 |
+
|
| 901 |
+
def random_rotate_rgb_gallery(images):
|
| 902 |
+
if images is None or len(images) == 0:
|
| 903 |
+
gr.Warning("No images selected.")
|
| 904 |
+
return []
|
| 905 |
+
# read webp images
|
| 906 |
+
images = [Image.open(image[0]).convert("RGB") for image in images]
|
| 907 |
+
images = [np.array(image).astype(np.float32) for image in images]
|
| 908 |
+
images = np.stack(images)
|
| 909 |
+
images = torch.tensor(images) / 255
|
| 910 |
+
position = np.random.choice([1, 2, 4, 5, 6])
|
| 911 |
+
images = rotate_rgb_cube(images, position)
|
| 912 |
+
images = to_pil_images(images, resize=False)
|
| 913 |
+
return images
|
| 914 |
+
|
| 915 |
+
def sequence_rotate_rgb_gallery(images):
|
| 916 |
+
if images is None or len(images) == 0:
|
| 917 |
+
gr.Warning("No images selected.")
|
| 918 |
+
return []
|
| 919 |
+
# read webp images
|
| 920 |
+
images = [Image.open(image[0]).convert("RGB") for image in images]
|
| 921 |
+
images = [np.array(image).astype(np.float32) for image in images]
|
| 922 |
+
images = np.stack(images)
|
| 923 |
+
images = torch.tensor(images) / 255
|
| 924 |
+
rotation_matrix = torch.tensor([[0, 1, 0], [0, 0, 1], [1, 0, 0]]).float()
|
| 925 |
+
images = images @ rotation_matrix
|
| 926 |
+
images = to_pil_images(images, resize=False)
|
| 927 |
+
return images
|
| 928 |
+
|
| 929 |
+
def flip_rgb_gallery(images, axis=0):
|
| 930 |
+
if images is None or len(images) == 0:
|
| 931 |
+
gr.Warning("No images selected.")
|
| 932 |
+
return []
|
| 933 |
+
# read webp images
|
| 934 |
+
images = [Image.open(image[0]).convert("RGB") for image in images]
|
| 935 |
+
images = [np.array(image).astype(np.float32) for image in images]
|
| 936 |
+
images = np.stack(images)
|
| 937 |
+
images = torch.tensor(images) / 255
|
| 938 |
+
images = 1 - images
|
| 939 |
+
images = to_pil_images(images, resize=False)
|
| 940 |
+
return images
|
| 941 |
+
|
| 942 |
+
def add_output_images_buttons(output_gallery):
|
| 943 |
+
with gr.Row():
|
| 944 |
+
rotate_button = gr.Button("🔄 Rotate", elem_id="rotate_button", variant='secondary')
|
| 945 |
+
rotate_button.click(sequence_rotate_rgb_gallery, inputs=[output_gallery], outputs=[output_gallery])
|
| 946 |
+
flip_button = gr.Button("🔃 Flip", elem_id="flip_button", variant='secondary')
|
| 947 |
+
flip_button.click(flip_rgb_gallery, inputs=[output_gallery], outputs=[output_gallery])
|
| 948 |
+
return rotate_button, flip_button
|
| 949 |
+
|
| 950 |
+
|
| 951 |
def make_output_images_section():
|
| 952 |
gr.Markdown('### Output Images')
|
| 953 |
+
output_gallery = gr.Gallery(format='png', value=[], label="NCUT Embedding", show_label=False, elem_id="ncut", columns=[3], rows=[1], object_fit="contain", height="auto", show_share_button=True)
|
| 954 |
+
add_output_images_buttons(output_gallery)
|
| 955 |
return output_gallery
|
| 956 |
|
| 957 |
def make_parameters_section(is_lisa=False):
|
|
|
|
| 1018 |
sampling_method_dropdown = gr.Dropdown(["fps", "random"], label="NCUT: Sampling method", value="fps", elem_id="sampling_method", info="Nyström approximation")
|
| 1019 |
knn_ncut_slider = gr.Slider(1, 100, step=1, label="NCUT: KNN", value=10, elem_id="knn_ncut", info="Nyström approximation")
|
| 1020 |
embedding_method_dropdown = gr.Dropdown(["tsne_3d", "umap_3d", "umap_shpere", "tsne_2d", "umap_2d"], label="Coloring method", value="tsne_3d", elem_id="embedding_method")
|
| 1021 |
+
embedding_metric_dropdown = gr.Dropdown(["euclidean", "cosine"], label="t-SNE/UMAP metric", value="euclidean", elem_id="embedding_metric")
|
| 1022 |
num_sample_tsne_slider = gr.Slider(100, 10000, step=100, label="t-SNE/UMAP: num_sample", value=300, elem_id="num_sample_tsne", info="Nyström approximation")
|
| 1023 |
knn_tsne_slider = gr.Slider(1, 100, step=1, label="t-SNE/UMAP: KNN", value=10, elem_id="knn_tsne", info="Nyström approximation")
|
| 1024 |
perplexity_slider = gr.Slider(10, 1000, step=10, label="t-SNE: perplexity", value=150, elem_id="perplexity")
|
|
|
|
| 1026 |
min_dist_slider = gr.Slider(0.1, 1, step=0.1, label="UMAP: min_dist", value=0.1, elem_id="min_dist")
|
| 1027 |
return [model_dropdown, layer_slider, node_type_dropdown, num_eig_slider,
|
| 1028 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1029 |
+
embedding_method_dropdown, embedding_metric_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1030 |
perplexity_slider, n_neighbors_slider, min_dist_slider,
|
| 1031 |
sampling_method_dropdown, positive_prompt, negative_prompt]
|
| 1032 |
|
|
|
|
| 1048 |
[
|
| 1049 |
model_dropdown, layer_slider, node_type_dropdown, num_eig_slider,
|
| 1050 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1051 |
+
embedding_method_dropdown, embedding_metric_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1052 |
perplexity_slider, n_neighbors_slider, min_dist_slider,
|
| 1053 |
sampling_method_dropdown, positive_prompt, negative_prompt
|
| 1054 |
] = make_parameters_section()
|
|
|
|
| 1067 |
positive_prompt, negative_prompt,
|
| 1068 |
false_placeholder, no_prompt, no_prompt, no_prompt,
|
| 1069 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1070 |
+
embedding_method_dropdown, embedding_metric_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1071 |
perplexity_slider, n_neighbors_slider, min_dist_slider, sampling_method_dropdown
|
| 1072 |
],
|
| 1073 |
outputs=[output_gallery, logging_text],
|
|
|
|
| 1107 |
[
|
| 1108 |
model_dropdown, layer_slider, node_type_dropdown, num_eig_slider,
|
| 1109 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1110 |
+
embedding_method_dropdown, embedding_metric_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1111 |
perplexity_slider, n_neighbors_slider, min_dist_slider,
|
| 1112 |
sampling_method_dropdown, positive_prompt, negative_prompt
|
| 1113 |
] = make_parameters_section()
|
|
|
|
| 1130 |
positive_prompt, negative_prompt,
|
| 1131 |
false_placeholder, no_prompt, no_prompt, no_prompt,
|
| 1132 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1133 |
+
embedding_method_dropdown, embedding_metric_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1134 |
perplexity_slider, n_neighbors_slider, min_dist_slider, sampling_method_dropdown,
|
| 1135 |
old_school_ncut_checkbox
|
| 1136 |
],
|
|
|
|
| 1147 |
with gr.Row():
|
| 1148 |
with gr.Column(scale=5, min_width=200):
|
| 1149 |
gr.Markdown('### Output (Recursion #1)')
|
| 1150 |
+
l1_gallery = gr.Gallery(format='png', value=[], label="Recursion #1", show_label=False, elem_id="ncut_l1", columns=[3], rows=[5], object_fit="contain", height="auto", show_fullscreen_button=True)
|
| 1151 |
+
add_output_images_buttons(l1_gallery)
|
| 1152 |
with gr.Column(scale=5, min_width=200):
|
| 1153 |
gr.Markdown('### Output (Recursion #2)')
|
| 1154 |
+
l2_gallery = gr.Gallery(format='png', value=[], label="Recursion #2", show_label=False, elem_id="ncut_l2", columns=[3], rows=[5], object_fit="contain", height="auto", show_fullscreen_button=True)
|
| 1155 |
+
add_output_images_buttons(l2_gallery)
|
| 1156 |
with gr.Column(scale=5, min_width=200):
|
| 1157 |
gr.Markdown('### Output (Recursion #3)')
|
| 1158 |
+
l3_gallery = gr.Gallery(format='png', value=[], label="Recursion #3", show_label=False, elem_id="ncut_l3", columns=[3], rows=[5], object_fit="contain", height="auto", show_fullscreen_button=True)
|
| 1159 |
+
add_output_images_buttons(l3_gallery)
|
| 1160 |
with gr.Row():
|
| 1161 |
with gr.Column(scale=5, min_width=200):
|
| 1162 |
input_gallery, submit_button, clear_images_button = make_input_images_section()
|
|
|
|
| 1176 |
[
|
| 1177 |
model_dropdown, layer_slider, node_type_dropdown, num_eig_slider,
|
| 1178 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1179 |
+
embedding_method_dropdown, embedding_metric_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1180 |
perplexity_slider, n_neighbors_slider, min_dist_slider,
|
| 1181 |
sampling_method_dropdown, positive_prompt, negative_prompt
|
| 1182 |
] = make_parameters_section()
|
|
|
|
| 1207 |
positive_prompt, negative_prompt,
|
| 1208 |
false_placeholder, no_prompt, no_prompt, no_prompt,
|
| 1209 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1210 |
+
embedding_method_dropdown, embedding_metric_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1211 |
perplexity_slider, n_neighbors_slider, min_dist_slider, sampling_method_dropdown,
|
| 1212 |
false_placeholder, number_placeholder, true_placeholder,
|
| 1213 |
l2_num_eig_slider, l3_num_eig_slider, metric_dropdown,
|
|
|
|
| 1227 |
[
|
| 1228 |
model_dropdown, layer_slider, node_type_dropdown, num_eig_slider,
|
| 1229 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1230 |
+
embedding_method_dropdown, embedding_metric_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1231 |
perplexity_slider, n_neighbors_slider, min_dist_slider,
|
| 1232 |
sampling_method_dropdown, positive_prompt, negative_prompt
|
| 1233 |
] = make_parameters_section()
|
|
|
|
| 1250 |
positive_prompt, negative_prompt,
|
| 1251 |
false_placeholder, no_prompt, no_prompt, no_prompt,
|
| 1252 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1253 |
+
embedding_method_dropdown, embedding_metric_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1254 |
perplexity_slider, n_neighbors_slider, min_dist_slider, sampling_method_dropdown,
|
| 1255 |
place_holder_false, max_frame_number
|
| 1256 |
],
|
|
|
|
| 1275 |
with gr.Row():
|
| 1276 |
with gr.Column(scale=5, min_width=200):
|
| 1277 |
gr.Markdown('### Output (Prompt #1)')
|
| 1278 |
+
l1_gallery = gr.Gallery(format='png', value=[], label="Prompt #1", show_label=False, elem_id="ncut_p1", columns=[3], rows=[5], object_fit="contain", height="auto", show_fullscreen_button=True)
|
| 1279 |
prompt1 = gr.Textbox(label="Input Prompt #1", elem_id="prompt1", value="where is the person, include the clothes, don't include the guitar and chair", lines=3)
|
| 1280 |
with gr.Column(scale=5, min_width=200):
|
| 1281 |
gr.Markdown('### Output (Prompt #2)')
|
| 1282 |
+
l2_gallery = gr.Gallery(format='png', value=[], label="Prompt #2", show_label=False, elem_id="ncut_p2", columns=[3], rows=[5], object_fit="contain", height="auto", show_fullscreen_button=True)
|
| 1283 |
prompt2 = gr.Textbox(label="Input Prompt #2", elem_id="prompt2", value="where is the Gibson Les Pual guitar", lines=3)
|
| 1284 |
with gr.Column(scale=5, min_width=200):
|
| 1285 |
gr.Markdown('### Output (Prompt #3)')
|
| 1286 |
+
l3_gallery = gr.Gallery(format='png', value=[], label="Prompt #3", show_label=False, elem_id="ncut_p3", columns=[3], rows=[5], object_fit="contain", height="auto", show_fullscreen_button=True)
|
| 1287 |
prompt3 = gr.Textbox(label="Input Prompt #3", elem_id="prompt3", value="where is the floor", lines=3)
|
| 1288 |
|
| 1289 |
with gr.Row():
|
|
|
|
| 1296 |
[
|
| 1297 |
model_dropdown, layer_slider, node_type_dropdown, num_eig_slider,
|
| 1298 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1299 |
+
embedding_method_dropdown, embedding_metric_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1300 |
perplexity_slider, n_neighbors_slider, min_dist_slider,
|
| 1301 |
sampling_method_dropdown, positive_prompt, negative_prompt
|
| 1302 |
] = make_parameters_section(is_lisa=True)
|
|
|
|
| 1311 |
positive_prompt, negative_prompt,
|
| 1312 |
true_placeholder, prompt1, prompt2, prompt3,
|
| 1313 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1314 |
+
embedding_method_dropdown, embedding_metric_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1315 |
perplexity_slider, n_neighbors_slider, min_dist_slider, sampling_method_dropdown
|
| 1316 |
],
|
| 1317 |
outputs=galleries + [logging_text],
|
|
|
|
| 1344 |
[
|
| 1345 |
model_dropdown, layer_slider, node_type_dropdown, num_eig_slider,
|
| 1346 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1347 |
+
embedding_method_dropdown, embedding_metric_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1348 |
perplexity_slider, n_neighbors_slider, min_dist_slider,
|
| 1349 |
sampling_method_dropdown, positive_prompt, negative_prompt
|
| 1350 |
] = make_parameters_section()
|
|
|
|
| 1380 |
positive_prompt, negative_prompt,
|
| 1381 |
false_placeholder, no_prompt, no_prompt, no_prompt,
|
| 1382 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1383 |
+
embedding_method_dropdown, embedding_metric_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1384 |
perplexity_slider, n_neighbors_slider, min_dist_slider, sampling_method_dropdown
|
| 1385 |
],
|
| 1386 |
# outputs=galleries + [logging_text],
|
|
|
|
| 1391 |
def add_one_model(i_model=1):
|
| 1392 |
with gr.Column(scale=5, min_width=200) as col:
|
| 1393 |
gr.Markdown(f'### Output Images')
|
| 1394 |
+
output_gallery = gr.Gallery(format='png', value=[], label="NCUT Embedding", show_label=False, elem_id=f"ncut{i_model}", columns=[3], rows=[1], object_fit="contain", height="auto", show_fullscreen_button=True)
|
| 1395 |
submit_button = gr.Button("🔴 RUN", elem_id=f"submit_button{i_model}", variant='primary')
|
| 1396 |
+
add_output_images_buttons(output_gallery)
|
| 1397 |
[
|
| 1398 |
model_dropdown, layer_slider, node_type_dropdown, num_eig_slider,
|
| 1399 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1400 |
+
embedding_method_dropdown, embedding_metric_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1401 |
perplexity_slider, n_neighbors_slider, min_dist_slider,
|
| 1402 |
sampling_method_dropdown, positive_prompt, negative_prompt
|
| 1403 |
] = make_parameters_section()
|
|
|
|
| 1413 |
positive_prompt, negative_prompt,
|
| 1414 |
false_placeholder, no_prompt, no_prompt, no_prompt,
|
| 1415 |
affinity_focal_gamma_slider, num_sample_ncut_slider, knn_ncut_slider,
|
| 1416 |
+
embedding_method_dropdown, embedding_metric_dropdown, num_sample_tsne_slider, knn_tsne_slider,
|
| 1417 |
perplexity_slider, n_neighbors_slider, min_dist_slider, sampling_method_dropdown
|
| 1418 |
],
|
| 1419 |
outputs=[output_gallery, logging_text]
|
|
|
|
| 1462 |
|
| 1463 |
|
| 1464 |
with gr.Tab('📄About'):
|
| 1465 |
+
gr.Markdown("**This demo is for the Python package `ncut-pytorch`, please visit the [Documentation](https://ncut-pytorch.readthedocs.io/)**")
|
| 1466 |
+
gr.Markdown("**All the models and functions used for this demo are in the Python package `ncut-pytorch`**")
|
| 1467 |
gr.Markdown("---")
|
| 1468 |
gr.Markdown("**Normalized Cuts**, aka. spectral clustering, is a graphical method to analyze data grouping in the affinity eigenvector space. It has been widely used for unsupervised segmentation in the 2000s.")
|
| 1469 |
+
gr.Markdown("*Normalized Cuts and Image Segmentation, Jianbo Shi and Jitendra Malik, 2000*")
|
| 1470 |
gr.Markdown("---")
|
| 1471 |
+
gr.Markdown("**We have improved NCut, with some advanced features:**")
|
| 1472 |
gr.Markdown("- **Nyström** Normalized Cut, is a new approximation algorithm developed for large-scale graph cuts, a large-graph of million nodes can be processed in under 10s (cpu) or 2s (gpu).")
|
| 1473 |
gr.Markdown("- **spectral-tSNE** visualization, a new method to visualize the high-dimensional eigenvector space with 3D RGB cube. Color is aligned across images, color infers distance in representation.")
|
| 1474 |
+
gr.Markdown("*paper in prep, Yang 2024*")
|
| 1475 |
+
gr.Markdown("*AlignedCut: Visual Concepts Discovery on Brain-Guided Universal Feature Space, Huzheng Yang, James Gee\*, and Jianbo Shi\*, 2024*")
|
| 1476 |
+
|
| 1477 |
|
| 1478 |
with gr.Row():
|
| 1479 |
with gr.Column():
|