Nicola commited on
Commit
f2b7155
1 Parent(s): 92a89f4
.idea/Civis.iml CHANGED
@@ -2,7 +2,7 @@
2
  <module type="PYTHON_MODULE" version="4">
3
  <component name="NewModuleRootManager">
4
  <content url="file://$MODULE_DIR$" />
5
- <orderEntry type="jdk" jdkName="aws" jdkType="Python SDK" />
6
  <orderEntry type="sourceFolder" forTests="false" />
7
  </component>
8
  </module>
 
2
  <module type="PYTHON_MODULE" version="4">
3
  <component name="NewModuleRootManager">
4
  <content url="file://$MODULE_DIR$" />
5
+ <orderEntry type="jdk" jdkName="civis" jdkType="Python SDK" />
6
  <orderEntry type="sourceFolder" forTests="false" />
7
  </component>
8
  </module>
.idea/misc.xml CHANGED
@@ -7,5 +7,5 @@
7
  <option name="show" value="ASK" />
8
  <option name="description" value="" />
9
  </component>
10
- <component name="ProjectRootManager" version="2" project-jdk-name="aws" project-jdk-type="Python SDK" />
11
  </project>
 
7
  <option name="show" value="ASK" />
8
  <option name="description" value="" />
9
  </component>
10
+ <component name="ProjectRootManager" version="2" project-jdk-name="civis" project-jdk-type="Python SDK" />
11
  </project>
app.py CHANGED
@@ -1,16 +1,6 @@
1
- import pandas as pd
2
  import streamlit as st
3
 
4
 
5
- def load_results():
6
- return pd.read_csv("results/results.csv")
7
-
8
- c = pd.DataFrame()
9
- c.to_csv("results/results.csv")
10
- results = load_results()
11
- st.session_state["results"] = results
12
-
13
-
14
  st.set_page_config(
15
  page_title="ciVIS",
16
  page_icon="👋"
@@ -24,10 +14,10 @@ st.markdown(
24
  Prima di tutto, grazie per la tua disponibilità a prendere parte a questo studio!
25
  Questo studio è parte della mia tesi di Dottorato in ..., il cui obiettivo è ...
26
  Durante l'esperimento, ti chiederemo di selezionare alcuni parametri per la generazione di un'immagine con un algoritmo
27
- di intelligence artificiale.
28
- Ti sarà quindi chiesto di rispondere ad un breve questionario sull'immagine generata per sapere la tua opinione sul
29
- risultato, rispetto a quelle che erano le tue aspettative.
30
- L'esperimento richiede circa 6 ore e puoi organizzare l'annotazione come ritieni più comodo.
31
 
32
  Per sapere di più sul Centro interdipartimentale sulla Visualità, [clicca qui](https://ci-vis.unige.it/)
33
  """
 
 
1
  import streamlit as st
2
 
3
 
 
 
 
 
 
 
 
 
 
4
  st.set_page_config(
5
  page_title="ciVIS",
6
  page_icon="👋"
 
14
  Prima di tutto, grazie per la tua disponibilità a prendere parte a questo studio!
15
  Questo studio è parte della mia tesi di Dottorato in ..., il cui obiettivo è ...
16
  Durante l'esperimento, ti chiederemo di selezionare alcuni parametri per la generazione di un'immagine con un algoritmo
17
+ di intelligenze artificiale.
18
+ Quindi, ti sarà chiesto di rispondere ad un breve questionario sull'immagine generata per fornirci la tua opinione sul
19
+ risultato.
20
+ L'esperimento richiede circa 15 minuti e puoi organizzare l'annotazione come ritieni più comodo.
21
 
22
  Per sapere di più sul Centro interdipartimentale sulla Visualità, [clicca qui](https://ci-vis.unige.it/)
23
  """
pages/annotation.py CHANGED
@@ -1,137 +1,195 @@
1
  import os
 
 
2
  import pandas as pd
3
  import streamlit as st
4
- from datasets import load_dataset
5
  from streamlit_tags import st_tags
 
 
6
 
7
  HF_TOKEN = os.environ.get("HF_TOKEN")
 
8
 
9
 
10
  def save_data():
11
  st.session_state["user"]["part_two"] = {
12
- "aesthetic": aesthetic,
13
- "real_buildings": real_buildings,
14
- "confidence": confidence,
15
- "expectation": expectation,
16
- "coherent": coherent,
17
- "coherent_others": coherent_others,
18
- "not_coherent": not_coherent,
19
- "not_coherent_others": not_coherent_others,
20
- "feedback": feedback
 
 
 
21
  }
 
22
 
23
  results = {
24
- "user": st.session_state["user"]["nickname"],
25
  **st.session_state["user"]["part_one"],
26
  **st.session_state["user"]["part_two"]
27
  }
28
- df = pd.DataFrame.from_dict(results, orient="index").T
29
- df = pd.concat(
30
- [st.session_state["results"], df]
31
- )
32
- df.to_csv("results/results.csv")
 
 
 
 
 
 
 
 
 
33
 
34
 
35
  @st.cache_resource
36
- def get_dataset():
37
  return load_dataset(
38
- "Nicorb/test_img",
39
  split="train",
40
  token=HF_TOKEN
41
  )
42
 
43
 
44
- dataset = get_dataset()
45
-
46
- st.title("Studio sulla City Identity")
47
-
48
- with st.form("valutazione_immagine"):
49
- st.image(
50
- dataset[0]["image"]
51
- )
52
-
53
- aesthetic = st.radio(
54
- "L'immagine mi piace",
55
- [
56
- "1 - Per nulla",
57
- "2",
58
- "3",
59
- "4",
60
- "5 - Totalmente"
61
- ],
62
- horizontal=True
63
- )
64
-
65
- real_buildings = st.radio(
66
- "Penso che gli edifici nell'immagine esistano realmente:",
67
- [
68
- "Si", "No"
69
- ]
70
- )
71
-
72
- confidence = st.radio(
73
- "Sono convinto/a della mia risposta",
74
- [
75
- "1 - Per nulla",
76
- "2",
77
- "3",
78
- "4",
79
- "5 - Totalmente"
80
- ],
81
- horizontal=True
82
- )
83
-
84
- expectation = st.radio(
85
- "Gli edifici nell'immagine rispettano la mia aspettativa sulla città di Genova",
86
- [
87
- "1 - Per nulla d'accordo",
88
- "2",
89
- "3",
90
- "4",
91
- "5 - Pienamente d'accordo"
92
- ],
93
- horizontal=True
94
  )
95
 
96
- coherent = st.multiselect(
97
- "Penso che le seguenti caratteristiche dell'immagine siano coerenti con le mie aspettative:",
98
- [
99
- "colore", "nitidezza", "aspetto realistico", "aspetto surreale", "stile architettonico",
100
- "difetti dell'immagine", "presenza del contesto", "correttezza del contesto (se presente)",
101
- "coerenza con la città", "tratti caratteristici della città" # aggiungere ripetizione? troppi elementi?
102
- ],
103
- placeholder="Seleziona gli elementi"
104
- )
105
- coherent_others = st_tags(
106
- label="Altre caratteristiche:",
107
- text="Premere invio per aggiungere un nuovo elemento",
108
- value=[],
109
- maxtags=-1,
110
- key="coherent"
111
- )
112
 
113
- not_coherent = st.multiselect(
114
- "Penso che le seguenti caratteristiche dell'immagine NON siano coerenti con le mie aspettative:",
115
- [
116
- "colore", "nitidezza", "aspetto realistico", "aspetto surreale", "stile architettonico",
117
- "difetti dell'immagine", "presenza del contesto", "correttezza del contesto (se presente)",
118
- "coerenza con la città", "tratti caratteristici della città" # aggiungere ripetizione? troppi elementi?
119
- ],
120
- placeholder="Seleziona gli elementi"
121
- )
122
- not_coherent_others = st_tags(
123
- label="Altre caratteristiche:",
124
- text="Premere invio per aggiungere un nuovo elemento",
125
- value=[],
126
- maxtags=-1,
127
- key="not_coherent"
128
- )
129
 
130
- feedback = st.text_area("Note, idee, suggerimenti e osservazioni")
 
 
 
131
 
132
- submit = st.form_submit_button("Salva", on_click=save_data)
133
 
134
- if submit:
135
- st.success("Salvataggio completato")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
 
137
- st.page_link("pages/annotation.py", label="Continua")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import os
2
+ import io
3
+ import random
4
  import pandas as pd
5
  import streamlit as st
6
+ from tempfile import NamedTemporaryFile
7
  from streamlit_tags import st_tags
8
+ from datasets import load_dataset
9
+ from huggingface_hub import HfApi, Repository
10
 
11
  HF_TOKEN = os.environ.get("HF_TOKEN")
12
+ API = HfApi()
13
 
14
 
15
  def save_data():
16
  st.session_state["user"]["part_two"] = {
17
+ "aesthetic": [aesthetic],
18
+ "real_buildings": [real_buildings],
19
+ "confidence": [confidence],
20
+ "expectation": [expectation],
21
+ "coherent": [coherent],
22
+ "coherent_others": [coherent_others],
23
+ "not_coherent": [not_coherent],
24
+ "not_coherent_others": [not_coherent_others],
25
+ "feedback": [feedback],
26
+ "storicity": [storicity],
27
+ "perspective": [perspective],
28
+ "image_idx": [image_idx]
29
  }
30
+ st.session_state["n_annotated_images"] += 1
31
 
32
  results = {
33
+ "user": [st.session_state["user"]["nickname"]],
34
  **st.session_state["user"]["part_one"],
35
  **st.session_state["user"]["part_two"]
36
  }
37
+ user_results = pd.DataFrame.from_dict(results, orient='index').T
38
+ print(user_results)
39
+ updated_annotation = pd.concat([annotations, user_results])
40
+ print(updated_annotation)
41
+ # Create a NamedTemporaryFile
42
+ with NamedTemporaryFile(mode='w+', suffix='.csv') as tmp:
43
+ updated_annotation.to_csv(tmp.name, index=False)
44
+ tmp.seek(0)
45
+ API.upload_file(
46
+ path_or_fileobj=tmp.name,
47
+ path_in_repo="results.csv",
48
+ repo_id="Nicorb/annotation_results",
49
+ repo_type="dataset",
50
+ )
51
 
52
 
53
  @st.cache_resource
54
+ def get_img_dataset(path):
55
  return load_dataset(
56
+ path=path,
57
  split="train",
58
  token=HF_TOKEN
59
  )
60
 
61
 
62
+ def get_dataset(path):
63
+ return load_dataset(
64
+ path=path,
65
+ split="train",
66
+ token=HF_TOKEN
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  )
68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
 
70
+ images = get_img_dataset("Nicorb/test_img")
71
+ annotations = get_dataset("Nicorb/annotation_results").to_pandas()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
 
73
+ if "n_annotated_images" not in st.session_state:
74
+ st.session_state["n_annotated_images"] = 0
75
+ if "selectbox_disable" not in st.session_state:
76
+ st.session_state["selectbox_disable"] = False
77
 
78
+ st.title("Studio sulla City Identity")
79
 
80
+ storicity = st.selectbox(
81
+ "Scegli un periodo storico:",
82
+ [
83
+ "Medioevo", "Ottocento", "Novecento"
84
+ ],
85
+ index=None,
86
+ key="storicity",
87
+ disabled=st.session_state["selectbox_disable"]
88
+ )
89
+ perspective = st.selectbox(
90
+ "Scegli il punto di vista:",
91
+ [
92
+ "Frontale", "Prospettiva centrale", "Panoramico"
93
+ ],
94
+ index=None,
95
+ key="perspective",
96
+ disabled=st.session_state["selectbox_disable"]
97
+ )
98
+
99
+ # GENERARE TRE IMMAGINI PER OGNI SCELTA
100
+ random_idxs = random.choices(list(range(len(images))), k=3)
101
 
102
+ with st.form("valutazione_immagine"):
103
+ if st.session_state["storicity"] and st.session_state["perspective"] and st.session_state["n_annotated_images"] < 3:
104
+ st.session_state["selectbox_disable"] = True
105
+ image_idx = st.session_state["n_annotated_images"]
106
+ st.image(
107
+ images[random_idxs[image_idx]]["image"]
108
+ )
109
+
110
+ aesthetic = st.radio(
111
+ "L'immagine mi piace",
112
+ [
113
+ "1 - Per nulla",
114
+ "2",
115
+ "3",
116
+ "4",
117
+ "5 - Totalmente"
118
+ ],
119
+ horizontal=True
120
+ )
121
+
122
+ real_buildings = st.radio(
123
+ "Penso che gli edifici nell'immagine esistano realmente:",
124
+ [
125
+ "Si", "No"
126
+ ]
127
+ )
128
+
129
+ confidence = st.radio(
130
+ "Sono convinto/a della mia risposta",
131
+ [
132
+ "1 - Per nulla",
133
+ "2",
134
+ "3",
135
+ "4",
136
+ "5 - Totalmente"
137
+ ],
138
+ horizontal=True
139
+ )
140
+
141
+ expectation = st.radio(
142
+ "Gli edifici nell'immagine rispettano la mia aspettativa sulla città di Genova",
143
+ [
144
+ "1 - Per nulla d'accordo",
145
+ "2",
146
+ "3",
147
+ "4",
148
+ "5 - Pienamente d'accordo"
149
+ ],
150
+ horizontal=True
151
+ )
152
+
153
+ coherent = st.multiselect(
154
+ "Penso che le seguenti caratteristiche dell'immagine siano coerenti con le mie aspettative:",
155
+ [
156
+ "colore", "nitidezza", "aspetto realistico", "aspetto surreale", "stile architettonico",
157
+ "difetti dell'immagine", "presenza del contesto", "correttezza del contesto (se presente)",
158
+ "coerenza con la città", "tratti caratteristici della città" # aggiungere ripetizione? troppi elementi?
159
+ ],
160
+ placeholder="Seleziona gli elementi"
161
+ )
162
+ coherent_others = st_tags(
163
+ label="Altre caratteristiche:",
164
+ text="Premere invio per aggiungere un nuovo elemento",
165
+ value=[],
166
+ maxtags=-1,
167
+ key="coherent"
168
+ )
169
+
170
+ not_coherent = st.multiselect(
171
+ "Penso che le seguenti caratteristiche dell'immagine *NON* siano coerenti con le mie aspettative:",
172
+ [
173
+ "colore", "nitidezza", "aspetto realistico", "aspetto surreale", "stile architettonico",
174
+ "difetti dell'immagine", "presenza del contesto", "correttezza del contesto (se presente)",
175
+ "coerenza con la città", "tratti caratteristici della città" # aggiungere ripetizione? troppi elementi?
176
+ ],
177
+ placeholder="Seleziona gli elementi"
178
+ )
179
+ not_coherent_others = st_tags(
180
+ label="Altre caratteristiche:",
181
+ text="Premere invio per aggiungere un nuovo elemento",
182
+ value=[],
183
+ maxtags=-1,
184
+ key="not_coherent"
185
+ )
186
+
187
+ feedback = st.text_area("Note, idee, suggerimenti e osservazioni")
188
+
189
+ submit = st.form_submit_button("Salva", on_click=save_data)
190
+
191
+ if submit:
192
+ st.success("Salvataggio completato")
193
+ st.page_link("pages/annotation.py", label="Continua")
194
+ else:
195
+ st.session_state["selectbox_disable"] = False
pages/demographics.py CHANGED
@@ -5,19 +5,19 @@ from streamlit_tags import st_tags
5
  def store_user():
6
  st.session_state["users"].append(st.session_state["user"])
7
  st.session_state["user"]["part_one"] = {
8
- "age": age,
9
- "school": school,
10
- "work": work,
11
- "work_other": work_other,
12
- "img_rapport": img_rapport,
13
- "img_other": img_other,
14
- "img_freq": img_freq,
15
- "img_expert": img_expert,
16
- "ai_expert": ai_expert,
17
- "genova_expert": genova_expert,
18
- "genova_freq": genova_freq,
19
- "genova_knowledge": genova_knowledge,
20
- "genova_thoughts": genova_thoughts
21
  }
22
 
23
 
@@ -54,7 +54,7 @@ with st.form("demografica"):
54
  "Altro"
55
  ]
56
  )
57
- work_other = st.text_input("Se altro, indica cosa...")
58
 
59
  img_rapport = st.radio(
60
  "Il mio rapporto con le immagini è:",
@@ -65,7 +65,7 @@ with st.form("demografica"):
65
  "Altro"
66
  ]
67
  )
68
- img_other = st.text_input("Se altro, indica quale...")
69
 
70
  img_freq = st.radio(
71
  "Quanto spesso ho a che fare con le immagini",
@@ -136,21 +136,16 @@ with st.form("demografica"):
136
  )
137
 
138
  genova_thoughts = st_tags(
139
- label="Quando penso all'architettura di Genova mi immagino:",
140
  text="Premere invio per aggiungere un nuovo elemento",
141
  value=[],
142
  maxtags=-1)
143
- # thoughts = st.multiselect(
144
- # "Quando penso a Genova mi immagino:",
145
- # [
146
- # "ciao"
147
- # ],
148
- # placeholder="Scrivi le opzioni"
149
- # )
150
 
151
  submit = st.form_submit_button("Salva", on_click=store_user)
152
 
153
  if submit:
154
- st.success("Salvataggio completato")
155
-
156
- st.page_link("pages/annotation.py", label="Continua")
 
 
 
5
  def store_user():
6
  st.session_state["users"].append(st.session_state["user"])
7
  st.session_state["user"]["part_one"] = {
8
+ "age": [age],
9
+ "school": [school],
10
+ "work": [work],
11
+ "work_other": [work_other],
12
+ "img_rapport": [img_rapport],
13
+ "img_other": [img_other],
14
+ "img_freq": [img_freq],
15
+ "img_expert": [img_expert],
16
+ "ai_expert": [ai_expert],
17
+ "genova_expert": [genova_expert],
18
+ "genova_freq": [genova_freq],
19
+ "genova_knowledge": [genova_knowledge],
20
+ "genova_thoughts": [genova_thoughts]
21
  }
22
 
23
 
 
54
  "Altro"
55
  ]
56
  )
57
+ work_other = st.text_input("Se altro, indica cosa...(premere INVIO per confermare)")
58
 
59
  img_rapport = st.radio(
60
  "Il mio rapporto con le immagini è:",
 
65
  "Altro"
66
  ]
67
  )
68
+ img_other = st.text_input("Se altro, indica quale...(premere INVIO per confermare)")
69
 
70
  img_freq = st.radio(
71
  "Quanto spesso ho a che fare con le immagini",
 
136
  )
137
 
138
  genova_thoughts = st_tags(
139
+ label="Quando penso all'architettura di Genova mi immagino (premere INVIO per confermare):",
140
  text="Premere invio per aggiungere un nuovo elemento",
141
  value=[],
142
  maxtags=-1)
 
 
 
 
 
 
 
143
 
144
  submit = st.form_submit_button("Salva", on_click=store_user)
145
 
146
  if submit:
147
+ if len(genova_expert) == 0:
148
+ st.warning("Per favore, compila tutte le domande obbligatorie")
149
+ else:
150
+ st.success("Salvataggio completato")
151
+ st.page_link("pages/annotation.py", label="Continua")
pages/instructions.py DELETED
@@ -1,11 +0,0 @@
1
- import streamlit as st
2
-
3
-
4
- st.title("Studio sulla City Identity")
5
-
6
- st.markdown("""
7
-
8
-
9
- """)
10
-
11
- st.page_link("pages/demographics.py", label="Inizia")
 
 
 
 
 
 
 
 
 
 
 
 
pages/login.py CHANGED
@@ -1,15 +1,20 @@
1
- import pickle as pkl
2
  import streamlit as st
 
3
 
4
- USER_FILE = "users.pkl"
5
 
6
- try:
7
- with open(USER_FILE, "rb") as file:
8
- users = pkl.load(file)
9
- except Exception as exc:
10
- users = []
11
 
12
- st.session_state["users"] = users
 
 
 
 
 
 
 
 
 
13
 
14
  st.title("Studio sulla City Identity")
15
 
@@ -18,11 +23,11 @@ per salvare lo stato d'avanzamento dello studio.
18
  Il nickname è composto dalle prime tre lettere del nome di tua madre, le prime tre lettere nel nome di tuo padre
19
  e le prime due cifre della data del tuo compleanno.""")
20
 
21
- nickname = st.text_input("Inserisci il tuo nickname")
22
  st.session_state["user"] = {}
23
  st.session_state["user"]["nickname"] = nickname
24
 
25
- if nickname in users:
26
  st.page_link("pages/annotation.py", label="Comincia")
27
  else:
28
- st.page_link("pages/instructions.py", label="Comincia")
 
1
+ import os
2
  import streamlit as st
3
+ from datasets import load_dataset
4
 
5
+ HF_TOKEN = os.environ.get("HF_TOKEN")
6
 
 
 
 
 
 
7
 
8
+ def get_dataset():
9
+ return load_dataset(
10
+ "Nicorb/annotation_results",
11
+ token=HF_TOKEN,
12
+ split="train"
13
+ )
14
+
15
+
16
+ users = get_dataset()
17
+ st.session_state["users"] = users["user"]
18
 
19
  st.title("Studio sulla City Identity")
20
 
 
23
  Il nickname è composto dalle prime tre lettere del nome di tua madre, le prime tre lettere nel nome di tuo padre
24
  e le prime due cifre della data del tuo compleanno.""")
25
 
26
+ nickname = st.text_input("Inserisci il tuo nickname e premi INVIO")
27
  st.session_state["user"] = {}
28
  st.session_state["user"]["nickname"] = nickname
29
 
30
+ if nickname in st.session_state["users"]:
31
  st.page_link("pages/annotation.py", label="Comincia")
32
  else:
33
+ st.page_link("pages/demographics.py", label="Comincia")
results/results.csv DELETED
@@ -1,2 +0,0 @@
1
- ,Unnamed: 0,user,age,school,work,work_other,img_rapport,img_other,img_freq,img_expert,ai_expert,genova_expert,genova_freq,genova_knowledge,genova_thoughts,aesthetic,real_buildings,confidence,expectation,coherent,coherent_others,not_coherent,not_coherent_others,feedback
2
- 0,,nn,18-24,Licenza media,Architettura,,Professionale,,Mai,1 - Per nulla d'accordo,Mai,1 - Per nulla d'accordo,Mai,1 - Per nulla d'accordo,[],1 - Per nulla,Si,1 - Per nulla,1 - Per nulla d'accordo,[],[],[],[],