feat: GDINO A+B — time-bounded search (9s vs 130s) + parameterized interval

This commit is contained in:
Accusys
2026-05-14 13:57:25 +08:00
parent 5a9b34f1c2
commit 159684331e
4 changed files with 82 additions and 18 deletions

View File

@@ -17,7 +17,8 @@ def find_trace_by_identity(actor_name, file_uuid):
conn = psycopg2.connect("postgresql://accusys@localhost:5432/momentry")
cur = conn.cursor()
cur.execute("""
SELECT fd.trace_id, COUNT(*) as faces
SELECT fd.trace_id, COUNT(*) as faces,
MIN(fd.frame_number) as start_f, MAX(fd.frame_number) as end_f
FROM dev.face_detections fd
JOIN dev.identities i ON i.id = fd.identity_id
WHERE i.name = %s AND fd.file_uuid = %s AND fd.trace_id IS NOT NULL
@@ -27,7 +28,9 @@ def find_trace_by_identity(actor_name, file_uuid):
row = cur.fetchone()
cur.close()
conn.close()
return row[0] if row else None
if row:
return {"trace_id": row[0], "faces": row[1], "start_frame": row[2], "end_frame": row[3]}
return None
def find_trace_in_frame_range(start_frame, end_frame, file_uuid):
@@ -115,24 +118,32 @@ def execute(query, file_uuid):
print(f" [{qid}] ({qtype}) {query['prompt'][:55]}...", end="", flush=True)
# Type-specific search
trace_id = None
trace_info = None
if qtype == "identity":
actor = query.get("expected_identity")
if actor:
trace_id = find_trace_by_identity(actor, file_uuid)
trace_info = find_trace_by_identity(actor, file_uuid)
elif qtype == "scene":
start = query.get("cut_start", 0)
end = query.get("cut_end", 1000000)
trace_id = find_trace_in_frame_range(start, end, file_uuid)
if trace_id:
trace_info = {"trace_id": trace_id}
elif qtype == "object":
obj = query.get("expected_object", "")
trace_id = find_trace_by_object(obj, file_uuid)
if trace_id:
trace_info = {"trace_id": trace_id}
if trace_id is None:
if trace_info is None:
print(" ❌ no trace found")
return {"query": query, "status": "no_trace", "frames": []}
print(f" trace={trace_id}", end="", flush=True)
trace_id = trace_info["trace_id"] if isinstance(trace_info, dict) else trace_info
start_frame = trace_info.get("start_frame", 0) if isinstance(trace_info, dict) else 0
end_frame = trace_info.get("end_frame", 0) if isinstance(trace_info, dict) else 0
trace_start = start_frame / 25.0 if start_frame > 0 else 0
trace_end = end_frame / 25.0 if end_frame > 0 else trace_start + 30
# Download video
vid_path = f"{FRAME_OUTPUT}/{qid}_video.mp4"
@@ -152,5 +163,7 @@ def execute(query, file_uuid):
"status": "ok",
"trace_id": trace_id,
"video_path": vid_path,
"frames": frames
"frames": frames,
"trace_start": trace_start,
"trace_end": trace_end,
}