Support additional requests to fix boxes

master
Sébastien Miquel 2026-03-15 10:33:55 +01:00
parent 0a60c81eb6
commit 9d51ea8394
1 changed files with 40 additions and 18 deletions

View File

@ -304,7 +304,8 @@ def process_single_task(task_tuple):
res = p["result"] res = p["result"]
if res["error"] != "": if res["error"] != "":
print("\tError :", res["error"], "for Copie", pid, label, group_name) print("\tError :", res["error"], "for Copie", pid, label, group_name)
for f in res["feedback"]: needs_correction = []
for (i,f) in enumerate(res["feedback"]):
b = f["box_2d"] b = f["box_2d"]
if b: if b:
ymin, xmin, ymax, xmax = b ymin, xmin, ymax, xmax = b
@ -312,26 +313,47 @@ def process_single_task(task_tuple):
ymax = ymax * total_height // 1000 ymax = ymax * total_height // 1000
if pid not in d_data: if pid not in d_data:
print("Error : Gemini answered a copie id not present", pid, label, group_name) print("Error : Gemini answered a copie id not present",
pid, label, group_name)
continue continue
yming, ymaxg, width_r = d_data[pid]
if ymin < yming-50 or ymax > ymaxg+50:
print("Error : Gemini answered box2d too low/up", pid, label, group_name)
if ymax < yming or ymin > ymaxg:
print("Removing the box.")
f["box_2d"] = None
continue
nymin = max(ymin, yming) * 1000 // total_height
nymax = min(ymax, ymaxg) * 1000 // total_height
f["box_2d"] = [nymin, xmin, nymax, xmax]
if f["box_2d"] and xmax / 1000 > width_r: if (ymin < yming - 50 or
print("Error : Gemini answered box2d too right", pid, label, group_name) ymax > ymaxg + 50 or
if xmin / 1000 > width_r: xmax / 1000 > width_r):
print("Removing the box.") needs_correction.append(i)
break
# yming, ymaxg, width_r = d_data[pid]
# if ymin < yming-50 or ymax > ymaxg+50:
# print("Error : Gemini answered box2d too low/up", pid, label, group_name)
# if ymax < yming or ymin > ymaxg:
# print("Removing the box.")
# f["box_2d"] = None
# continue
# nymin = max(ymin, yming) * 1000 // total_height
# nymax = min(ymax, ymaxg) * 1000 // total_height
# f["box_2d"] = [nymin, xmin, nymax, xmax]
# if f["box_2d"] and xmax / 1000 > width_r:
# print("Error : Gemini answered box2d too right", pid, label, group_name)
# if xmin / 1000 > width_r:
# print("Removing the box.")
# f["box_2d"] = None
# continue
# f["box_2d"][3] = int(width_r * 1000)
if needs_correction:
print(f"\tBox anomalies detected for Copie {pid} {group_name}. Requesting isolated correction from Gemini Flash...")
try:
res["feedback"] = correct_boxes_with_gemini(
pid, label, res["feedback"], INPUT_DIR,
yming, ymaxg, width_r, total_height)
except Exception as e:
print(f"\tCorrection failed for Copie {pid}, {group_name} : {e}\n\tRemoving the boxes")
# Fallback if the second request fails entirely
for (i, f) in enumerate(res["feedback"]):
if i in needs_correction:
f["box_2d"] = None f["box_2d"] = None
continue
f["box_2d"][3] = int(width_r * 1000)
# --- Use Lock for writing shared data --- # --- Use Lock for writing shared data ---
with io_lock: with io_lock: