Skip to content

Small Fast Targets

Khandelwal edited this page Oct 9, 2026 · 5 revisions

The rule: can you see its shape? A body, a head, legs, wings, an outline — anything you could put more than one landmark on — goes to AllTracker (with Segment for the outline). A target that is only a dot small enough to be one point (a few px to ~20 px across, no visible shape) goes to Moving spot. Moving spot follows one point per target: on anything bigger it would follow only the centre of a blob, and the test says so.

Kinetrace has three point models — the methods that follow the points you click. They sit in the Track ▾ menu; the choice applies to the next run, can be changed at any time. Each point has its own tracker (AT / CT / MS beside its name in LAYERS; right-click → Tracker), saved with the project, and a Track press tracks every selected point with its own.

Your footage Point model Clicking needed
An animal, a person or an object whose shape you can see AllTracker (default) + Segment (SAM 3) for the outline one click per body part to start
High-contrast painted dots or stickers, when speed matters CoTracker3 one click per point
A target that is only a dot — small enough to be one point (a few px to ~20 px), no shape of its own — often over a moving background (waves, ripples, sky, leaves) Moving spot the dot on two frames in a row to start; 20 frames in a row for the test
A round marker (wand ball) Point ▾ → Ball marker (any point model) one click per ball

AllTracker and SAM 3 stay the choice for animals: they need no clicking beyond the first, and the silhouette can keep landmarks on the body (the animal's Keep its points on its silhouette). Moving spot is for the footage where they fail.

Why the appearance trackers lose a small spot

AllTracker and CoTracker3 follow the texture around the click. A white spot a few pixels across, filmed on water, has none of its own; the water around it has plenty, so both follow the water. Their confidence stays high (0.74–0.98), so auto-pause never fires: on real footage of such a spot both were off within 2 frames.

How Moving spot works

kinetrace/spots.py, no model and no GPU. On every frame the spot is searched where a constant-velocity prediction puts it, within a search radius that may grow with the speed, by one detector (a cue):

  • bright spot — the strongest bright blob (difference of Gaussians at the spot's own size) of the whiteness channel, min(R, G, B): white or pale on blue water, sky or foliage;
  • dark spot — the same on the darkness channel, 255 − max(R, G, B);
  • unusual change — what changes much more than those pixels usually do, each pixel against its own last 30 frames (a bat over a river; it fails at sea, where every pixel changes).

It stops at the first frame where the spot is not there or two candidates are equally likely (two crossing, a glint on it): the track ends on the frame before, the run auto-pauses there with the point selected, and the user clicks it again. A spot whose prediction leaves the picture simply ends. With two clicks in a row it knows the speed; with one, the first search is wider and it stops if two spots there look alike, or if the click was a little off the spot (rather than following the strongest glint in the search area): click the spot more precisely, or on a second frame. In a run that holds other points too, they keep every frame up to a Moving spot's stop. Regions are left out of a Moving spot run.

Test the point models on my clicks

Track ▾ → Test the point models on my clicks… (or right-click the point). Place the point by hand on at least 20 frames in a row (one or two skipped frames are fine; 30 is better). The test starts every model from the first click and follows the clicks; wherever one drifts more than the drift limit (max(6 px, 1.5 × the spot's size, 0.2 % of the picture width)) or stops, it is put back on that click — one correction. Moving spot is tried at every cue × several search radii × 3 speed gains in one pass over the frames. The radii come from two things: the spot's size, measured at the first click (3 to about 60 px across; a bigger target is told that AllTracker + Segment suits it better), and the clicks' own motion — Moving spot's prediction replayed over them, 1.5 × its 90th-percentile miss + 2 px, then 1.6 and 2.5 × that — so a turning or dodging animal is offered a wide enough search; AllTracker and CoTracker3 (ticked by default with a GPU) are re-tracked from every correction. The fewest corrections win, then the fewest silent drifts, then the median error; a tie goes to AllTracker. The button names the winner and the point (Use Moving spot for P1) and sets the tracker of that point only (the project's default and your other points are untouched); for Moving spot it also stores the settings it found on that point (cameras/<cam>/spots.json).

The app suggests the test in two situations: a point tracked by AllTracker / CoTracker3 corrected by hand on 5 of the last 20 frames, and a new point placed on a small isolated spot in a camera with no silhouette.

Measured

Synthetic clips with exact ground truth (tests/verify_spots.py): a flapping white spot over moving water with glints stronger than it — bright spot, 60 frames, 0.09 px median; a dark bird against a cloudy sky — dark spot, 0.02 px; a dark bat over flickering water among rocks as dark as it — unusual change, 0.29 px, where the dark-spot cue stops within a few frames. On each, the test recommends the right cue with 0 corrections over 29 clicked frames.

A run that stops is the design, not a failure: the data ends where the spot can no longer be told from its background, and one click carries it on.

Clone this wiki locally