Nightfury16 commited on
Commit
e172b1c
·
1 Parent(s): c9e566c

update app.py

Browse files
Files changed (1) hide show
  1. app.py +26 -29
app.py CHANGED
@@ -83,8 +83,10 @@ def get_flagged_groups():
83
  try:
84
  df = pd.read_csv(LABEL_FILE)
85
  if df.empty: return []
 
86
  df['score'] = pd.to_numeric(df['score'], errors='coerce')
87
  df = df.drop_duplicates(subset=['url'], keep='last')
 
88
  errors = df[(df['score'] == 10) & (df['label'] != 'living_room')]
89
  return errors['group_id'].unique().tolist()
90
  except: return []
@@ -100,10 +102,11 @@ def get_saved_values(gid, mode):
100
  df = df.drop_duplicates(subset=['url'], keep='last')
101
  rows = df[df['group_id'] == gid]
102
  for _, row in rows.iterrows():
 
103
  if mode in ["label", "fix"]:
104
- saved_data[row['url']] = {"score": row['score'], "label": row['label']}
105
  else:
106
- saved_data[row['url']] = {"is_correct": row['is_correct'], "label": row['corrected_label'], "score": row['corrected_score']}
107
  except: pass
108
  return saved_data
109
 
@@ -114,13 +117,11 @@ def get_stats_text():
114
  df_l = pd.read_csv(LABEL_FILE).drop_duplicates(subset=['url'], keep='last')
115
  l = len(df_l['group_id'].unique())
116
  except: l = 0
117
- err_msg = f" | ⚠️ **Fix:** {len(flagged)}" if flagged else ""
118
- return f"**Total:** {len(all_gids)} | **Labeled:** {l}{err_msg}"
119
 
120
  def render_workspace(mode, history, specific_index=None, move_back=False):
121
  all_ordered = get_ordered_groups()
122
- flagged_pool = get_flagged_groups()
123
-
124
  current_gid = history[-1] if history else None
125
  target_gid = None
126
 
@@ -130,6 +131,7 @@ def render_workspace(mode, history, specific_index=None, move_back=False):
130
  history.pop()
131
  target_gid = history[-1]
132
  else:
 
133
  try:
134
  df_l = pd.read_csv(LABEL_FILE).drop_duplicates(subset=['url'], keep='last')
135
  l_done = set(df_l['group_id'].unique())
@@ -138,14 +140,17 @@ def render_workspace(mode, history, specific_index=None, move_back=False):
138
  except: l_done, v_done = set(), set()
139
 
140
  if mode == "fix":
 
141
  candidates = [g for g in flagged_pool if g != current_gid]
142
- if not candidates and flagged_pool: candidates = flagged_pool
 
143
  else:
 
144
  candidates = [g for g in all_ordered if (mode=="label" and g not in l_done) or (mode=="verify" and g in l_done and g not in v_done)]
 
145
 
146
- if not candidates:
147
- return {screen_menu: gr.update(visible=True), screen_work: gr.update(visible=False), log_box: "No more properties found in this mode."}
148
- target_gid = candidates[0]
149
 
150
  urls = get_group_urls(target_gid)
151
  if not history or history[-1] != target_gid: history.append(target_gid)
@@ -166,7 +171,7 @@ def render_workspace(mode, history, specific_index=None, move_back=False):
166
  screen_menu: gr.update(visible=False), screen_work: gr.update(visible=True),
167
  header_md: f"# {mode.upper()} Property #{target_idx + 1} ({target_gid})",
168
  state_urls: urls, state_hist: history, state_idx: target_idx,
169
- top_stats: get_stats_text(), log_box: f"Viewing {target_gid}"
170
  }
171
 
172
  for i in range(MAX_IMAGES):
@@ -176,14 +181,14 @@ def render_workspace(mode, history, specific_index=None, move_back=False):
176
  u = urls[i]
177
  updates[img_objs[i]] = gr.update(value=processed_images[i], visible=True)
178
  v_sc = int(float(saved_vals.get(u, {}).get('score', 5)))
179
- v_lbl = saved_vals.get(u, {}).get('label', "living_room")
180
  is_err = (v_sc == 10 and v_lbl != "living_room")
181
 
182
  if mode in ["label", "fix"]:
183
  updates[c_sld] = gr.update(visible=True, value=v_sc, interactive=True)
184
  updates[c_drp] = gr.update(visible=True, value=v_lbl, interactive=True)
185
  updates[c_chk] = gr.update(visible=False)
186
- updates[c_lbl] = gr.update(visible=True if is_err else False, value="<span style='color:red'>⚠️ ERROR: Score 10 is Living Room ONLY</span>")
187
  else:
188
  p_lbl, p_sc = r1_vals.get(u, {}).get('label', "?"), r1_vals.get(u, {}).get('score', "?")
189
  updates[c_sld] = gr.update(visible=True, value=v_sc if u in saved_vals else p_sc)
@@ -197,14 +202,12 @@ def render_workspace(mode, history, specific_index=None, move_back=False):
197
 
198
  def save_data(mode, history, urls, *args):
199
  if not history: return
200
- gid = history[-1]
201
- ts = datetime.now().isoformat()
202
- rows = []
203
  for i, u in enumerate(urls):
204
  sc, lbl, chk = args[i*4], args[i*4+1], args[i*4+2]
205
- if mode in ["label", "fix"]: rows.append([ts, "user", gid, u, int(sc), lbl])
206
- else: rows.append([ts, "user", gid, u, chk, lbl, int(sc)])
207
-
208
  fname = LABEL_FILE if mode in ["label", "fix"] else VERIFY_FILE
209
  with FileLock(LOCK_FILE):
210
  with open(fname, "a", newline="") as f: csv.writer(f).writerows(rows)
@@ -220,13 +223,7 @@ def refresh_cat():
220
  df_v = pd.read_csv(VERIFY_FILE).drop_duplicates(subset=['url'], keep='last')
221
  v_set = set(df_v['group_id'].unique())
222
  except: l_set, v_set = set(), set()
223
- data = []
224
- for i, gid in enumerate(all_gids):
225
- if gid in flagged: s = "⚠️ Fix Needed"
226
- elif gid in v_set: s = "✅ Verified"
227
- elif gid in l_set: s = "🔵 Labeled"
228
- else: s = "⚪ Pending"
229
- data.append([i+1, s, gid])
230
  return pd.DataFrame(data, columns=["#", "Status", "ID"])
231
 
232
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
@@ -237,9 +234,9 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
237
  with gr.Tabs():
238
  with gr.Tab("Workspace"):
239
  with gr.Group() as screen_menu:
240
- gr.Markdown("# Welcome")
241
  with gr.Row():
242
- b_start_l, b_start_v, b_start_f = gr.Button("Label", variant="primary"), gr.Button("Verify"), gr.Button("🛠 Fix", variant="secondary")
243
  with gr.Group(visible=False) as screen_work:
244
  header_md = gr.Markdown()
245
  img_objs, input_objs = [], []
@@ -257,7 +254,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
257
  num_in = gr.Number(value=1, label="Prop #", precision=0)
258
  b_go_l, b_go_v, b_go_f = gr.Button("Go Label"), gr.Button("Go Verify"), gr.Button("Go Fix")
259
  df_cat = gr.Dataframe(interactive=False)
260
- b_ref_cat = gr.Button("Refresh")
261
 
262
  ALL_IO = [screen_menu, screen_work, header_md, state_urls, state_hist, state_idx, top_stats, log_box] + img_objs + input_objs
263
  b_start_l.click(lambda: "label", None, state_mode).then(render_workspace, [state_mode, state_hist], ALL_IO)
 
83
  try:
84
  df = pd.read_csv(LABEL_FILE)
85
  if df.empty: return []
86
+ df['label'] = df['label'].astype(str).str.strip().str.lower()
87
  df['score'] = pd.to_numeric(df['score'], errors='coerce')
88
  df = df.drop_duplicates(subset=['url'], keep='last')
89
+ # Logic: Flag if score is 10 AND it's NOT living_room
90
  errors = df[(df['score'] == 10) & (df['label'] != 'living_room')]
91
  return errors['group_id'].unique().tolist()
92
  except: return []
 
102
  df = df.drop_duplicates(subset=['url'], keep='last')
103
  rows = df[df['group_id'] == gid]
104
  for _, row in rows.iterrows():
105
+ lbl = str(row['label']).strip().lower() if mode in ["label", "fix"] else str(row['corrected_label']).strip().lower()
106
  if mode in ["label", "fix"]:
107
+ saved_data[row['url']] = {"score": row['score'], "label": lbl}
108
  else:
109
+ saved_data[row['url']] = {"is_correct": row['is_correct'], "label": lbl, "score": row['corrected_score']}
110
  except: pass
111
  return saved_data
112
 
 
117
  df_l = pd.read_csv(LABEL_FILE).drop_duplicates(subset=['url'], keep='last')
118
  l = len(df_l['group_id'].unique())
119
  except: l = 0
120
+ err_msg = f" | ⚠️ **To Fix:** {len(flagged)}" if flagged else ""
121
+ return f"**Total Properties:** {len(all_gids)} | **Labeled:** {l}{err_msg}"
122
 
123
  def render_workspace(mode, history, specific_index=None, move_back=False):
124
  all_ordered = get_ordered_groups()
 
 
125
  current_gid = history[-1] if history else None
126
  target_gid = None
127
 
 
131
  history.pop()
132
  target_gid = history[-1]
133
  else:
134
+ flagged_pool = get_flagged_groups()
135
  try:
136
  df_l = pd.read_csv(LABEL_FILE).drop_duplicates(subset=['url'], keep='last')
137
  l_done = set(df_l['group_id'].unique())
 
140
  except: l_done, v_done = set(), set()
141
 
142
  if mode == "fix":
143
+ # Deterministic selection for Fix mode to avoid jumping
144
  candidates = [g for g in flagged_pool if g != current_gid]
145
+ if not candidates and flagged_pool: candidates = flagged_pool
146
+ if candidates: target_gid = candidates[0]
147
  else:
148
+ # Random selection for Label/Verify mode
149
  candidates = [g for g in all_ordered if (mode=="label" and g not in l_done) or (mode=="verify" and g in l_done and g not in v_done)]
150
+ if candidates: target_gid = random.choice(candidates)
151
 
152
+ if not target_gid:
153
+ return {screen_menu: gr.update(visible=True), screen_work: gr.update(visible=False), log_box: "Mode Complete."}
 
154
 
155
  urls = get_group_urls(target_gid)
156
  if not history or history[-1] != target_gid: history.append(target_gid)
 
171
  screen_menu: gr.update(visible=False), screen_work: gr.update(visible=True),
172
  header_md: f"# {mode.upper()} Property #{target_idx + 1} ({target_gid})",
173
  state_urls: urls, state_hist: history, state_idx: target_idx,
174
+ top_stats: get_stats_text(), log_box: f"Loaded {target_gid}"
175
  }
176
 
177
  for i in range(MAX_IMAGES):
 
181
  u = urls[i]
182
  updates[img_objs[i]] = gr.update(value=processed_images[i], visible=True)
183
  v_sc = int(float(saved_vals.get(u, {}).get('score', 5)))
184
+ v_lbl = str(saved_vals.get(u, {}).get('label', "living_room")).strip().lower()
185
  is_err = (v_sc == 10 and v_lbl != "living_room")
186
 
187
  if mode in ["label", "fix"]:
188
  updates[c_sld] = gr.update(visible=True, value=v_sc, interactive=True)
189
  updates[c_drp] = gr.update(visible=True, value=v_lbl, interactive=True)
190
  updates[c_chk] = gr.update(visible=False)
191
+ updates[c_lbl] = gr.update(visible=True if is_err else False, value="<span style='color:red'>⚠️ ERROR: Score 10 must be Living Room</span>")
192
  else:
193
  p_lbl, p_sc = r1_vals.get(u, {}).get('label', "?"), r1_vals.get(u, {}).get('score', "?")
194
  updates[c_sld] = gr.update(visible=True, value=v_sc if u in saved_vals else p_sc)
 
202
 
203
  def save_data(mode, history, urls, *args):
204
  if not history: return
205
+ gid = history[-1]; ts = datetime.now().isoformat(); rows = []
 
 
206
  for i, u in enumerate(urls):
207
  sc, lbl, chk = args[i*4], args[i*4+1], args[i*4+2]
208
+ clean_lbl = str(lbl).strip().lower()
209
+ if mode in ["label", "fix"]: rows.append([ts, "user", gid, u, int(sc), clean_lbl])
210
+ else: rows.append([ts, "user", gid, u, chk, clean_lbl, int(sc)])
211
  fname = LABEL_FILE if mode in ["label", "fix"] else VERIFY_FILE
212
  with FileLock(LOCK_FILE):
213
  with open(fname, "a", newline="") as f: csv.writer(f).writerows(rows)
 
223
  df_v = pd.read_csv(VERIFY_FILE).drop_duplicates(subset=['url'], keep='last')
224
  v_set = set(df_v['group_id'].unique())
225
  except: l_set, v_set = set(), set()
226
+ data = [[i+1, "⚠️ Fix Needed" if gid in flagged else "✅ Verified" if gid in v_set else "🔵 Labeled" if gid in l_set else "⚪ Pending", gid] for i, gid in enumerate(all_gids)]
 
 
 
 
 
 
227
  return pd.DataFrame(data, columns=["#", "Status", "ID"])
228
 
229
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
 
234
  with gr.Tabs():
235
  with gr.Tab("Workspace"):
236
  with gr.Group() as screen_menu:
237
+ gr.Markdown("# Property Labeler Pro")
238
  with gr.Row():
239
+ b_start_l, b_start_v, b_start_f = gr.Button("Start Labeling", variant="primary"), gr.Button("Start Verification"), gr.Button("🛠 Fix Errors", variant="secondary")
240
  with gr.Group(visible=False) as screen_work:
241
  header_md = gr.Markdown()
242
  img_objs, input_objs = [], []
 
254
  num_in = gr.Number(value=1, label="Prop #", precision=0)
255
  b_go_l, b_go_v, b_go_f = gr.Button("Go Label"), gr.Button("Go Verify"), gr.Button("Go Fix")
256
  df_cat = gr.Dataframe(interactive=False)
257
+ b_ref_cat = gr.Button("Refresh Catalog")
258
 
259
  ALL_IO = [screen_menu, screen_work, header_md, state_urls, state_hist, state_idx, top_stats, log_box] + img_objs + input_objs
260
  b_start_l.click(lambda: "label", None, state_mode).then(render_workspace, [state_mode, state_hist], ALL_IO)