Spaces:
Running
Running
backup
Browse files
app.py
CHANGED
|
@@ -110,12 +110,13 @@ scheduler = CommitScheduler(
|
|
| 110 |
)
|
| 111 |
|
| 112 |
|
| 113 |
-
def save_evaluation(
|
| 114 |
-
|
|
|
|
|
|
|
| 115 |
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
| 116 |
-
duration = end_time - start_time
|
| 117 |
|
| 118 |
-
# Create data directory if it doesn't exist
|
| 119 |
os.makedirs("data", exist_ok=True)
|
| 120 |
filename = "data/evaluation_results_exp.csv"
|
| 121 |
|
|
@@ -134,6 +135,7 @@ def save_evaluation(post_id, model_a, model_b, verdict, username, start_time, en
|
|
| 134 |
"start_time",
|
| 135 |
"end_time",
|
| 136 |
"duration_seconds",
|
|
|
|
| 137 |
]
|
| 138 |
)
|
| 139 |
|
|
@@ -151,6 +153,7 @@ def save_evaluation(post_id, model_a, model_b, verdict, username, start_time, en
|
|
| 151 |
start_time,
|
| 152 |
end_time,
|
| 153 |
duration,
|
|
|
|
| 154 |
]
|
| 155 |
)
|
| 156 |
|
|
@@ -159,57 +162,52 @@ def save_evaluation(post_id, model_a, model_b, verdict, username, start_time, en
|
|
| 159 |
)
|
| 160 |
|
| 161 |
|
| 162 |
-
def
|
| 163 |
-
"""Get list of
|
| 164 |
filename = "data/evaluation_results_exp.csv"
|
| 165 |
if not os.path.exists(filename):
|
| 166 |
return set()
|
| 167 |
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 171 |
|
| 172 |
|
| 173 |
def get_random_sample(username):
|
| 174 |
-
"""Get a random sample
|
| 175 |
-
# Get
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
# Get
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
#
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
# Find the corresponding dataset index
|
| 190 |
-
for idx, item in enumerate(dataset):
|
| 191 |
-
if item["post_id"] == selected_post_id:
|
| 192 |
-
sample = item
|
| 193 |
-
break
|
| 194 |
-
else:
|
| 195 |
-
raise ValueError(f"Could not find post_id {selected_post_id} in dataset")
|
| 196 |
|
| 197 |
# Randomly decide which image goes to position A and B
|
| 198 |
if random.choice([True, False]):
|
| 199 |
# AI edit is A, human edit is B
|
| 200 |
image_a = sample["ai_edited_image"]
|
| 201 |
image_b = sample["human_edited_image"]
|
| 202 |
-
model_a = sample["model"]
|
| 203 |
-
model_b = "HUMAN"
|
| 204 |
else:
|
| 205 |
# Human edit is A, AI edit is B
|
| 206 |
image_a = sample["human_edited_image"]
|
| 207 |
image_b = sample["ai_edited_image"]
|
| 208 |
-
model_a = "HUMAN"
|
| 209 |
-
model_b = sample["model"]
|
| 210 |
-
|
| 211 |
-
print(f"Selected post_id: {sample['post_id']}")
|
| 212 |
-
print(f"AI model: {sample['model']}")
|
| 213 |
|
| 214 |
return {
|
| 215 |
"post_id": sample["post_id"],
|
|
@@ -222,6 +220,7 @@ def get_random_sample(username):
|
|
| 222 |
"image_b": image_b,
|
| 223 |
"model_a": model_a,
|
| 224 |
"model_b": model_b,
|
|
|
|
| 225 |
}
|
| 226 |
|
| 227 |
|
|
@@ -260,11 +259,11 @@ def evaluate(verdict, state):
|
|
| 260 |
state["username"],
|
| 261 |
state["start_time"],
|
| 262 |
end_time,
|
|
|
|
| 263 |
)
|
| 264 |
|
| 265 |
-
# Get next sample
|
| 266 |
next_sample = get_random_sample(state["username"])
|
| 267 |
-
|
| 268 |
# Preserve username in state and set new start time
|
| 269 |
next_state = next_sample.copy()
|
| 270 |
next_state["username"] = state["username"]
|
|
@@ -339,7 +338,7 @@ def handle_username_submit(email, current_page):
|
|
| 339 |
|
| 340 |
def initialize(username):
|
| 341 |
"""Initialize the interface with first sample"""
|
| 342 |
-
sample = get_random_sample(username)
|
| 343 |
# Create state with username and start time included
|
| 344 |
state = sample.copy()
|
| 345 |
state["username"] = username
|
|
|
|
| 110 |
)
|
| 111 |
|
| 112 |
|
| 113 |
+
def save_evaluation(
|
| 114 |
+
post_id, model_a, model_b, verdict, username, start_time, end_time, dataset_idx
|
| 115 |
+
):
|
| 116 |
+
"""Save evaluation results to CSV including timing, username and dataset index information."""
|
| 117 |
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
| 118 |
+
duration = end_time - start_time
|
| 119 |
|
|
|
|
| 120 |
os.makedirs("data", exist_ok=True)
|
| 121 |
filename = "data/evaluation_results_exp.csv"
|
| 122 |
|
|
|
|
| 135 |
"start_time",
|
| 136 |
"end_time",
|
| 137 |
"duration_seconds",
|
| 138 |
+
"dataset_idx",
|
| 139 |
]
|
| 140 |
)
|
| 141 |
|
|
|
|
| 153 |
start_time,
|
| 154 |
end_time,
|
| 155 |
duration,
|
| 156 |
+
dataset_idx,
|
| 157 |
]
|
| 158 |
)
|
| 159 |
|
|
|
|
| 162 |
)
|
| 163 |
|
| 164 |
|
| 165 |
+
def get_annotated_indices(username):
|
| 166 |
+
"""Get list of dataset indices already annotated by this user"""
|
| 167 |
filename = "data/evaluation_results_exp.csv"
|
| 168 |
if not os.path.exists(filename):
|
| 169 |
return set()
|
| 170 |
|
| 171 |
+
try:
|
| 172 |
+
df = pd.read_csv(filename)
|
| 173 |
+
if "dataset_idx" not in df.columns or "username" not in df.columns:
|
| 174 |
+
return set()
|
| 175 |
+
user_annotations = df[df["username"] == username]["dataset_idx"].tolist()
|
| 176 |
+
return set(user_annotations)
|
| 177 |
+
except:
|
| 178 |
+
return set()
|
| 179 |
|
| 180 |
|
| 181 |
def get_random_sample(username):
|
| 182 |
+
"""Get a random sample excluding previously annotated items"""
|
| 183 |
+
# Get indices already annotated by this user
|
| 184 |
+
annotated_indices = get_annotated_indices(username)
|
| 185 |
+
|
| 186 |
+
# Get all valid indices that haven't been annotated
|
| 187 |
+
all_indices = set(range(len(dataset)))
|
| 188 |
+
available_indices = list(all_indices - annotated_indices)
|
| 189 |
+
|
| 190 |
+
if not available_indices:
|
| 191 |
+
# If user has annotated all items, allow repeats
|
| 192 |
+
available_indices = list(all_indices)
|
| 193 |
+
|
| 194 |
+
# Randomly select from available indices
|
| 195 |
+
idx = random.choice(available_indices)
|
| 196 |
+
sample = dataset[idx]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 197 |
|
| 198 |
# Randomly decide which image goes to position A and B
|
| 199 |
if random.choice([True, False]):
|
| 200 |
# AI edit is A, human edit is B
|
| 201 |
image_a = sample["ai_edited_image"]
|
| 202 |
image_b = sample["human_edited_image"]
|
| 203 |
+
model_a = sample["model"]
|
| 204 |
+
model_b = "HUMAN"
|
| 205 |
else:
|
| 206 |
# Human edit is A, AI edit is B
|
| 207 |
image_a = sample["human_edited_image"]
|
| 208 |
image_b = sample["ai_edited_image"]
|
| 209 |
+
model_a = "HUMAN"
|
| 210 |
+
model_b = sample["model"]
|
|
|
|
|
|
|
|
|
|
| 211 |
|
| 212 |
return {
|
| 213 |
"post_id": sample["post_id"],
|
|
|
|
| 220 |
"image_b": image_b,
|
| 221 |
"model_a": model_a,
|
| 222 |
"model_b": model_b,
|
| 223 |
+
"dataset_idx": idx, # Include the dataset index in the return
|
| 224 |
}
|
| 225 |
|
| 226 |
|
|
|
|
| 259 |
state["username"],
|
| 260 |
state["start_time"],
|
| 261 |
end_time,
|
| 262 |
+
state["dataset_idx"],
|
| 263 |
)
|
| 264 |
|
| 265 |
+
# Get next sample using username to avoid repeats
|
| 266 |
next_sample = get_random_sample(state["username"])
|
|
|
|
| 267 |
# Preserve username in state and set new start time
|
| 268 |
next_state = next_sample.copy()
|
| 269 |
next_state["username"] = state["username"]
|
|
|
|
| 338 |
|
| 339 |
def initialize(username):
|
| 340 |
"""Initialize the interface with first sample"""
|
| 341 |
+
sample = get_random_sample(username)
|
| 342 |
# Create state with username and start time included
|
| 343 |
state = sample.copy()
|
| 344 |
state["username"] = username
|