Spaces:
Sleeping
A newer version of the Gradio SDK is available: 6.26.0
title: Molmo2Fish Tracking
emoji: π
colorFrom: purple
colorTo: blue
sdk: gradio
sdk_version: 6.15.1
app_file: app.py
short_description: Track fish in sonar video, fix it with plain English
python_version: '3.12'
startup_duration_timeout: 1h
π Molmo2Fish β interactive fish tracking with natural language guidance
Demo of tidalove/Molmo2Fish, the model from "Teach a Molmo2Fish: Towards interactive fish tracking with natural language guidance" (paper Β· code).
Molmo2Fish is a LoRA-finetuned Molmo2 VLM that tracks salmon in ARIS sonar video and β crucially β accepts a plain-English critique of its own output and re-emits corrected tracks. The paper reports tracking accuracy going from ~5% to ~79% over a handful of conversational correction turns.
How the demo works
- β Track all fish sends the clip with the prompt
track all fish. The model replies with the html-v2 pointing format used in training:<tracks coords="0.0 1 409 852;0.5 1 436 890 2 300 120;β¦">fish</tracks>(timestamps in seconds at 2 FPS, ids, and x/y normalised to 0β1000). - β‘ Apply correction rebuilds the conversation β video on the first user turn, the
model's previous
<tracks β¦>answer as the assistant turn, your critique as the new user turn β exactly as inolmo/eval/vllm_runner.py::build_multi_turn_chat, and the model regenerates the track set.
Points are parsed with the same regexes as
olmo/preprocessing/point_formatter.py and drawn back onto the 6 FPS source video.
Example clips
The three sonar clips shipped with this Space are re-encoded (G channel, 6 FPS, libx264,
matching the repo's encode_frames_to_video recipe) from the Caltech Fish Counting
release perona-lab/cfc26, which is
distributed under CC-BY-4.0 β credit to the Caltech Fish Counting / CFC26 authors.
The correction prompts pre-filled with each example are verbatim from the validation split
of tidalove/cfc-track-instruction.
Notes
- Runs on ZeroGPU; the model is loaded in bfloat16 (~16 GB VRAM).
- Video is sampled at 2 FPS, max 128 frames, per the model's
video_preprocessor_config.json. - The released checkpoint ships a config mismatch:
processor_config.jsonsetsuse_frame_special_tokens: true(so each frame is wrapped in<frame_start>/<frame_end>, matching training) whileconfig.jsonsets itfalse, which makes the model count<im_end>instead and abort withAssertionError: Expected 0 videos, but got 1.app.pyaligns the two at load time. - A truncated answer (no closing
</tracks>) means you hit the Max new tokens cap β raise it in Advanced.