Spaces:
Runtime error
Runtime error
vote interface
Browse files- app.py +6 -3
- src/explore_interface.py +0 -74
- src/label_interface.py +75 -20
- src/sample_interface.py +187 -0
- src/vote_interface.py +49 -0
app.py
CHANGED
@@ -5,19 +5,22 @@ Main Gradio module.
|
|
5 |
import gradio as gr
|
6 |
|
7 |
from src import (
|
8 |
-
explore_interface,
|
9 |
label_interface,
|
|
|
|
|
10 |
)
|
11 |
|
12 |
|
13 |
demo = gr.TabbedInterface(
|
14 |
[
|
15 |
-
explore_interface.interface,
|
16 |
label_interface.interface,
|
|
|
|
|
17 |
],
|
18 |
[
|
19 |
-
"Explore",
|
20 |
"Label",
|
|
|
|
|
21 |
],
|
22 |
title="Explore & Label Concepts",
|
23 |
analytics_enabled=True,
|
|
|
5 |
import gradio as gr
|
6 |
|
7 |
from src import (
|
|
|
8 |
label_interface,
|
9 |
+
sample_interface,
|
10 |
+
vote_interface,
|
11 |
)
|
12 |
|
13 |
|
14 |
demo = gr.TabbedInterface(
|
15 |
[
|
|
|
16 |
label_interface.interface,
|
17 |
+
sample_interface.interface,
|
18 |
+
vote_interface.interface,
|
19 |
],
|
20 |
[
|
|
|
21 |
"Label",
|
22 |
+
"Sample",
|
23 |
+
"Vote",
|
24 |
],
|
25 |
title="Explore & Label Concepts",
|
26 |
analytics_enabled=True,
|
src/explore_interface.py
DELETED
@@ -1,74 +0,0 @@
|
|
1 |
-
"""Interface to explore images and labels.
|
2 |
-
"""
|
3 |
-
|
4 |
-
import random
|
5 |
-
|
6 |
-
import gradio as gr
|
7 |
-
|
8 |
-
from src import global_variables
|
9 |
-
from src.constants import CONCEPTS, ASSETS_FOLDER, DATASET_NAME
|
10 |
-
|
11 |
-
def get_next_image(
|
12 |
-
split: str,
|
13 |
-
concepts: list,
|
14 |
-
current_metadata: dict,
|
15 |
-
selected_concepts: list,
|
16 |
-
):
|
17 |
-
if concepts != selected_concepts:
|
18 |
-
for split, values in global_variables.all_metadata.items():
|
19 |
-
current_metadata[split] = [x for x in values if all([c in x["concepts"] for c in concepts])]
|
20 |
-
selected_concepts = concepts
|
21 |
-
try:
|
22 |
-
if split == "all":
|
23 |
-
sample = random.choice(
|
24 |
-
current_metadata["train"] + current_metadata["validation"] + current_metadata["test"]
|
25 |
-
)
|
26 |
-
else:
|
27 |
-
sample = random.choice(current_metadata[split])
|
28 |
-
image_path = f"{ASSETS_FOLDER}/{DATASET_NAME}/data/{split}/{sample['file_name']}"
|
29 |
-
return image_path, sample["class"], sample["concepts"], current_metadata, selected_concepts
|
30 |
-
except IndexError:
|
31 |
-
gr.Warning("No image found for the selected filter.")
|
32 |
-
return None, None, None, current_metadata, selected_concepts
|
33 |
-
|
34 |
-
with gr.Blocks() as interface:
|
35 |
-
with gr.Row():
|
36 |
-
with gr.Column():
|
37 |
-
with gr.Group():
|
38 |
-
gr.Markdown(
|
39 |
-
"## # Image Selection",
|
40 |
-
)
|
41 |
-
split = gr.Radio(
|
42 |
-
label="Split",
|
43 |
-
choices=["train", "validation", "test", "all"],
|
44 |
-
value="train",
|
45 |
-
)
|
46 |
-
concepts = gr.Dropdown(
|
47 |
-
label="Concepts",
|
48 |
-
multiselect=True,
|
49 |
-
choices=CONCEPTS,
|
50 |
-
)
|
51 |
-
button = gr.Button(
|
52 |
-
value="Next",
|
53 |
-
)
|
54 |
-
with gr.Group():
|
55 |
-
gr.Markdown(
|
56 |
-
"## # Image Info",
|
57 |
-
)
|
58 |
-
im_class = gr.Textbox(
|
59 |
-
label="Class",
|
60 |
-
)
|
61 |
-
im_concepts = gr.JSON(
|
62 |
-
label="Concepts",
|
63 |
-
)
|
64 |
-
with gr.Column():
|
65 |
-
image = gr.Image(
|
66 |
-
label="Image",
|
67 |
-
)
|
68 |
-
current_metadata = gr.State(global_variables.all_metadata)
|
69 |
-
selected_concepts = gr.State([])
|
70 |
-
button.click(
|
71 |
-
get_next_image,
|
72 |
-
outputs=[image, im_class, im_concepts, current_metadata, selected_concepts],
|
73 |
-
inputs=[split, concepts, current_metadata, selected_concepts]
|
74 |
-
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/label_interface.py
CHANGED
@@ -12,11 +12,18 @@ from src.constants import CONCEPTS, ASSETS_FOLDER, DATASET_NAME
|
|
12 |
|
13 |
def get_next_image(
|
14 |
split: str,
|
|
|
|
|
|
|
15 |
profile: gr.OAuthProfile
|
16 |
):
|
17 |
username = profile.username
|
|
|
|
|
|
|
|
|
18 |
try:
|
19 |
-
sample_idx = random.choice(
|
20 |
sample = global_variables.all_metadata[split][sample_idx]
|
21 |
image_path = f"{ASSETS_FOLDER}/{DATASET_NAME}/data/{split}/{sample['file_name']}"
|
22 |
try:
|
@@ -25,37 +32,56 @@ def get_next_image(
|
|
25 |
except KeyError:
|
26 |
voted_concepts = []
|
27 |
|
28 |
-
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
except IndexError:
|
30 |
gr.Warning("No image found for the selected filter.")
|
31 |
-
return None, None, None
|
32 |
|
33 |
def submit_label(
|
34 |
voted_concepts: list,
|
35 |
current_image: Optional[str],
|
|
|
|
|
|
|
|
|
36 |
profile: gr.OAuthProfile
|
37 |
):
|
38 |
username = profile.username
|
39 |
if current_image is None:
|
40 |
gr.Warning("No image selected.")
|
41 |
-
return None, None, None
|
42 |
-
|
43 |
idx = int(idx)
|
44 |
-
global_variables.get_metadata(
|
45 |
-
if "votes" not in global_variables.all_metadata[
|
46 |
-
global_variables.all_metadata[
|
47 |
-
global_variables.all_metadata[
|
48 |
vote_sum = {c: 0 for c in CONCEPTS}
|
49 |
concepts = {}
|
50 |
for c in CONCEPTS:
|
51 |
-
for vote in global_variables.all_metadata[
|
52 |
if c not in vote:
|
53 |
continue
|
54 |
vote_sum[c] += 2 * vote[c] - 1
|
55 |
concepts[c] = vote_sum[c] > 0 if vote_sum[c] != 0 else None
|
56 |
-
global_variables.all_metadata[
|
57 |
-
global_variables.save_metadata(
|
58 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
59 |
|
60 |
|
61 |
with gr.Blocks() as interface:
|
@@ -67,14 +93,20 @@ with gr.Blocks() as interface:
|
|
67 |
)
|
68 |
split = gr.Radio(
|
69 |
label="Split",
|
70 |
-
choices=["train", "validation", "test"
|
71 |
value="train",
|
72 |
)
|
|
|
|
|
|
|
|
|
|
|
73 |
with gr.Group():
|
74 |
voted_concepts = gr.CheckboxGroup(
|
75 |
-
label="Concepts",
|
76 |
choices=CONCEPTS,
|
77 |
)
|
|
|
78 |
with gr.Row():
|
79 |
next_button = gr.Button(
|
80 |
value="Next",
|
@@ -83,19 +115,42 @@ with gr.Blocks() as interface:
|
|
83 |
submit_button = gr.Button(
|
84 |
value="Submit",
|
85 |
)
|
86 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
87 |
with gr.Column():
|
88 |
image = gr.Image(
|
89 |
label="Image",
|
90 |
)
|
91 |
current_image = gr.State(None)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
92 |
next_button.click(
|
93 |
get_next_image,
|
94 |
-
inputs=[split],
|
95 |
-
outputs=
|
96 |
)
|
97 |
submit_button.click(
|
98 |
submit_label,
|
99 |
-
inputs=[voted_concepts, current_image],
|
100 |
-
outputs=
|
101 |
)
|
|
|
12 |
|
13 |
def get_next_image(
|
14 |
split: str,
|
15 |
+
concepts: list,
|
16 |
+
filtered_indices: dict,
|
17 |
+
selected_concepts: list,
|
18 |
profile: gr.OAuthProfile
|
19 |
):
|
20 |
username = profile.username
|
21 |
+
if concepts != selected_concepts:
|
22 |
+
for key, values in global_variables.all_metadata.items():
|
23 |
+
filtered_indices[key] = [i for i in range(len(values)) if all([values[i]["concepts"].get(c, False) for c in concepts])]
|
24 |
+
selected_concepts = concepts
|
25 |
try:
|
26 |
+
sample_idx = random.choice(filtered_indices[split])
|
27 |
sample = global_variables.all_metadata[split][sample_idx]
|
28 |
image_path = f"{ASSETS_FOLDER}/{DATASET_NAME}/data/{split}/{sample['file_name']}"
|
29 |
try:
|
|
|
32 |
except KeyError:
|
33 |
voted_concepts = []
|
34 |
|
35 |
+
return (
|
36 |
+
image_path,
|
37 |
+
voted_concepts,
|
38 |
+
f"{split}:{sample_idx}",
|
39 |
+
sample["class"],
|
40 |
+
sample["concepts"],
|
41 |
+
filtered_indices,
|
42 |
+
selected_concepts,
|
43 |
+
)
|
44 |
except IndexError:
|
45 |
gr.Warning("No image found for the selected filter.")
|
46 |
+
return None, None, None, None, None, filtered_indices, selected_concepts
|
47 |
|
48 |
def submit_label(
|
49 |
voted_concepts: list,
|
50 |
current_image: Optional[str],
|
51 |
+
split,
|
52 |
+
concepts,
|
53 |
+
filtered_indices,
|
54 |
+
selected_concepts,
|
55 |
profile: gr.OAuthProfile
|
56 |
):
|
57 |
username = profile.username
|
58 |
if current_image is None:
|
59 |
gr.Warning("No image selected.")
|
60 |
+
return None, None, None, None, None, filtered_indices, selected_concepts
|
61 |
+
current_split, idx = current_image.split(":")
|
62 |
idx = int(idx)
|
63 |
+
global_variables.get_metadata(current_split)
|
64 |
+
if "votes" not in global_variables.all_metadata[current_split][idx]:
|
65 |
+
global_variables.all_metadata[current_split][idx]["votes"] = {}
|
66 |
+
global_variables.all_metadata[current_split][idx]["votes"][username] = {c: c in voted_concepts for c in CONCEPTS}
|
67 |
vote_sum = {c: 0 for c in CONCEPTS}
|
68 |
concepts = {}
|
69 |
for c in CONCEPTS:
|
70 |
+
for vote in global_variables.all_metadata[current_split][idx]["votes"].values():
|
71 |
if c not in vote:
|
72 |
continue
|
73 |
vote_sum[c] += 2 * vote[c] - 1
|
74 |
concepts[c] = vote_sum[c] > 0 if vote_sum[c] != 0 else None
|
75 |
+
global_variables.all_metadata[current_split][idx]["concepts"] = concepts
|
76 |
+
global_variables.save_metadata(current_split)
|
77 |
+
gr.Info("Submit success")
|
78 |
+
return get_next_image(
|
79 |
+
split,
|
80 |
+
concepts,
|
81 |
+
filtered_indices,
|
82 |
+
selected_concepts,
|
83 |
+
profile
|
84 |
+
)
|
85 |
|
86 |
|
87 |
with gr.Blocks() as interface:
|
|
|
93 |
)
|
94 |
split = gr.Radio(
|
95 |
label="Split",
|
96 |
+
choices=["train", "validation", "test"],
|
97 |
value="train",
|
98 |
)
|
99 |
+
concepts = gr.Dropdown(
|
100 |
+
label="Concepts",
|
101 |
+
multiselect=True,
|
102 |
+
choices=CONCEPTS,
|
103 |
+
)
|
104 |
with gr.Group():
|
105 |
voted_concepts = gr.CheckboxGroup(
|
106 |
+
label="Voted Concepts",
|
107 |
choices=CONCEPTS,
|
108 |
)
|
109 |
+
|
110 |
with gr.Row():
|
111 |
next_button = gr.Button(
|
112 |
value="Next",
|
|
|
115 |
submit_button = gr.Button(
|
116 |
value="Submit",
|
117 |
)
|
118 |
+
with gr.Group():
|
119 |
+
gr.Markdown(
|
120 |
+
"## # Image Info",
|
121 |
+
)
|
122 |
+
im_class = gr.Textbox(
|
123 |
+
label="Class",
|
124 |
+
)
|
125 |
+
im_concepts = gr.JSON(
|
126 |
+
label="Concepts",
|
127 |
+
)
|
128 |
with gr.Column():
|
129 |
image = gr.Image(
|
130 |
label="Image",
|
131 |
)
|
132 |
current_image = gr.State(None)
|
133 |
+
filtered_indices = gr.State({
|
134 |
+
split: list(range(len(global_variables.all_metadata[split])))
|
135 |
+
for split in global_variables.all_metadata
|
136 |
+
})
|
137 |
+
selected_concepts = gr.State([])
|
138 |
+
common_output = [
|
139 |
+
image,
|
140 |
+
voted_concepts,
|
141 |
+
current_image,
|
142 |
+
im_class,
|
143 |
+
im_concepts,
|
144 |
+
filtered_indices,
|
145 |
+
selected_concepts
|
146 |
+
]
|
147 |
next_button.click(
|
148 |
get_next_image,
|
149 |
+
inputs=[split, concepts, filtered_indices, selected_concepts],
|
150 |
+
outputs=common_output
|
151 |
)
|
152 |
submit_button.click(
|
153 |
submit_label,
|
154 |
+
inputs=[voted_concepts, current_image, split, concepts, filtered_indices, selected_concepts],
|
155 |
+
outputs=common_output
|
156 |
)
|
src/sample_interface.py
ADDED
@@ -0,0 +1,187 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Interface for labeling concepts in images.
|
2 |
+
"""
|
3 |
+
|
4 |
+
from typing import Optional
|
5 |
+
|
6 |
+
import gradio as gr
|
7 |
+
|
8 |
+
from src import global_variables
|
9 |
+
from src.constants import CONCEPTS, ASSETS_FOLDER, DATASET_NAME
|
10 |
+
|
11 |
+
def get_image(
|
12 |
+
step: int,
|
13 |
+
split: str,
|
14 |
+
index: str,
|
15 |
+
filtered_indices: dict,
|
16 |
+
profile: gr.OAuthProfile
|
17 |
+
):
|
18 |
+
username = profile.username
|
19 |
+
try:
|
20 |
+
int_index = int(index)
|
21 |
+
except:
|
22 |
+
gr.Warning("Error parsing index using 0")
|
23 |
+
int_index = 0
|
24 |
+
sample_idx = int_index + step
|
25 |
+
if sample_idx < 0:
|
26 |
+
gr.Warning("No previous image.")
|
27 |
+
sample_idx = 0
|
28 |
+
if sample_idx >= len(global_variables.all_metadata[split]):
|
29 |
+
gr.Warning("No next image.")
|
30 |
+
sample_idx = len(global_variables.all_metadata[split]) - 1
|
31 |
+
sample = global_variables.all_metadata[split][sample_idx]
|
32 |
+
image_path = f"{ASSETS_FOLDER}/{DATASET_NAME}/data/{split}/{sample['file_name']}"
|
33 |
+
try:
|
34 |
+
username_votes = sample["votes"][username]
|
35 |
+
voted_concepts = [c for c in CONCEPTS if username_votes.get(c, False)]
|
36 |
+
except KeyError:
|
37 |
+
voted_concepts = []
|
38 |
+
|
39 |
+
return (
|
40 |
+
image_path,
|
41 |
+
voted_concepts,
|
42 |
+
f"{split}:{sample_idx}",
|
43 |
+
sample["class"],
|
44 |
+
sample["concepts"],
|
45 |
+
str(sample_idx),
|
46 |
+
filtered_indices,
|
47 |
+
)
|
48 |
+
|
49 |
+
def make_get_image(step):
|
50 |
+
def f(
|
51 |
+
split: str,
|
52 |
+
index: str,
|
53 |
+
filtered_indices: dict,
|
54 |
+
profile: gr.OAuthProfile
|
55 |
+
):
|
56 |
+
return get_image(step, split, index, filtered_indices, profile)
|
57 |
+
return f
|
58 |
+
|
59 |
+
get_next_image = make_get_image(1)
|
60 |
+
get_prev_image = make_get_image(-1)
|
61 |
+
get_current_image = make_get_image(0)
|
62 |
+
|
63 |
+
def submit_label(
|
64 |
+
voted_concepts: list,
|
65 |
+
current_image: Optional[str],
|
66 |
+
split,
|
67 |
+
index,
|
68 |
+
filtered_indices,
|
69 |
+
profile: gr.OAuthProfile
|
70 |
+
):
|
71 |
+
username = profile.username
|
72 |
+
if current_image is None:
|
73 |
+
gr.Warning("No image selected.")
|
74 |
+
return None, None, None, None, None, index, filtered_indices
|
75 |
+
current_split, idx = current_image.split(":")
|
76 |
+
idx = int(idx)
|
77 |
+
global_variables.get_metadata(current_split)
|
78 |
+
if "votes" not in global_variables.all_metadata[current_split][idx]:
|
79 |
+
global_variables.all_metadata[current_split][idx]["votes"] = {}
|
80 |
+
global_variables.all_metadata[current_split][idx]["votes"][username] = {c: c in voted_concepts for c in CONCEPTS}
|
81 |
+
vote_sum = {c: 0 for c in CONCEPTS}
|
82 |
+
concepts = {}
|
83 |
+
for c in CONCEPTS:
|
84 |
+
for vote in global_variables.all_metadata[current_split][idx]["votes"].values():
|
85 |
+
if c not in vote:
|
86 |
+
continue
|
87 |
+
vote_sum[c] += 2 * vote[c] - 1
|
88 |
+
concepts[c] = vote_sum[c] > 0 if vote_sum[c] != 0 else None
|
89 |
+
global_variables.all_metadata[current_split][idx]["concepts"] = concepts
|
90 |
+
global_variables.save_metadata(current_split)
|
91 |
+
gr.Info("Submit success")
|
92 |
+
return get_next_image(
|
93 |
+
split,
|
94 |
+
index,
|
95 |
+
filtered_indices,
|
96 |
+
profile
|
97 |
+
)
|
98 |
+
|
99 |
+
|
100 |
+
with gr.Blocks() as interface:
|
101 |
+
with gr.Row():
|
102 |
+
with gr.Column():
|
103 |
+
with gr.Group():
|
104 |
+
gr.Markdown(
|
105 |
+
"## # Image Selection",
|
106 |
+
)
|
107 |
+
split = gr.Radio(
|
108 |
+
label="Split",
|
109 |
+
choices=["train", "validation", "test"],
|
110 |
+
value="train",
|
111 |
+
)
|
112 |
+
index = gr.Textbox(
|
113 |
+
value="0",
|
114 |
+
label="Index",
|
115 |
+
max_lines=1,
|
116 |
+
)
|
117 |
+
with gr.Group():
|
118 |
+
voted_concepts = gr.CheckboxGroup(
|
119 |
+
label="Voted Concepts",
|
120 |
+
choices=CONCEPTS,
|
121 |
+
)
|
122 |
+
|
123 |
+
with gr.Row():
|
124 |
+
prev_button = gr.Button(
|
125 |
+
value="Prev",
|
126 |
+
)
|
127 |
+
next_button = gr.Button(
|
128 |
+
value="Next",
|
129 |
+
)
|
130 |
+
gr.LoginButton()
|
131 |
+
submit_button = gr.Button(
|
132 |
+
value="Submit",
|
133 |
+
)
|
134 |
+
with gr.Group():
|
135 |
+
gr.Markdown(
|
136 |
+
"## # Image Info",
|
137 |
+
)
|
138 |
+
im_class = gr.Textbox(
|
139 |
+
label="Class",
|
140 |
+
)
|
141 |
+
im_concepts = gr.JSON(
|
142 |
+
label="Concepts",
|
143 |
+
)
|
144 |
+
with gr.Column():
|
145 |
+
image = gr.Image(
|
146 |
+
label="Image",
|
147 |
+
)
|
148 |
+
current_image = gr.State(None)
|
149 |
+
filtered_indices = gr.State({
|
150 |
+
split: list(range(len(global_variables.all_metadata[split])))
|
151 |
+
for split in global_variables.all_metadata
|
152 |
+
})
|
153 |
+
common_output = [
|
154 |
+
image,
|
155 |
+
voted_concepts,
|
156 |
+
current_image,
|
157 |
+
im_class,
|
158 |
+
im_concepts,
|
159 |
+
index,
|
160 |
+
filtered_indices,
|
161 |
+
]
|
162 |
+
common_input = [split, index, filtered_indices]
|
163 |
+
prev_button.click(
|
164 |
+
get_prev_image,
|
165 |
+
inputs=common_input,
|
166 |
+
outputs=common_output
|
167 |
+
)
|
168 |
+
next_button.click(
|
169 |
+
get_next_image,
|
170 |
+
inputs=common_input,
|
171 |
+
outputs=common_output
|
172 |
+
)
|
173 |
+
submit_button.click(
|
174 |
+
submit_label,
|
175 |
+
inputs=[voted_concepts, current_image, split, index, filtered_indices],
|
176 |
+
outputs=common_output
|
177 |
+
)
|
178 |
+
index.submit(
|
179 |
+
get_current_image,
|
180 |
+
inputs=common_input,
|
181 |
+
outputs=common_output,
|
182 |
+
)
|
183 |
+
interface.load(
|
184 |
+
get_current_image,
|
185 |
+
inputs=common_input,
|
186 |
+
outputs=common_output,
|
187 |
+
)
|
src/vote_interface.py
ADDED
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Interface for labeling concepts in images.
|
2 |
+
"""
|
3 |
+
|
4 |
+
import gradio as gr
|
5 |
+
|
6 |
+
from src import global_variables
|
7 |
+
|
8 |
+
|
9 |
+
def get_votes(
|
10 |
+
split,
|
11 |
+
profile: gr.OAuthProfile
|
12 |
+
):
|
13 |
+
username = profile.username
|
14 |
+
vote_list = []
|
15 |
+
for i,s in enumerate(global_variables.all_metadata[split]):
|
16 |
+
if "votes" in s and username in s["votes"]:
|
17 |
+
vote_list.append(f'[{i}]: {s["votes"][username]}')
|
18 |
+
|
19 |
+
return "\n".join(vote_list)
|
20 |
+
|
21 |
+
|
22 |
+
with gr.Blocks() as interface:
|
23 |
+
with gr.Row():
|
24 |
+
with gr.Column():
|
25 |
+
with gr.Group():
|
26 |
+
gr.Markdown(
|
27 |
+
"## # Selection",
|
28 |
+
)
|
29 |
+
split = gr.Radio(
|
30 |
+
label="Split",
|
31 |
+
choices=["train", "validation", "test"],
|
32 |
+
value="train",
|
33 |
+
)
|
34 |
+
|
35 |
+
with gr.Row():
|
36 |
+
gr.LoginButton()
|
37 |
+
get_button = gr.Button(
|
38 |
+
value="Get My Votes",
|
39 |
+
)
|
40 |
+
with gr.Column():
|
41 |
+
votes = gr.TextArea(
|
42 |
+
label="Votes",
|
43 |
+
lines=1,
|
44 |
+
)
|
45 |
+
get_button.click(
|
46 |
+
get_votes,
|
47 |
+
inputs=[split],
|
48 |
+
outputs=[votes]
|
49 |
+
)
|