Evaluation

The right way to fuse vision and text on-device. We measured it.

Every privacy-first product promises your data never leaves your device. Almost none tell you how well the AI works once you make that promise. So we ran the numbers on real, human-written queries — and found that with the right kind of fusion, combining vision and text beats the best single channel. The catch: the method matters more than you'd expect. Here's the measurement, and the honest correction behind it.

“On-device” has become a marketing checkbox. It tells you where the computation happens, not whether the result is any good — and for a category built on trust, that gap matters. We wanted an honest answer to the obvious question: how much does combining vision and text actually buy you when everything runs locally? Not a cherry-picked demo. A number, on queries we didn't write, that anyone with the same public data can reproduce.

The short version: combining vision and text does win — but only with the right fusion. The method turns out to matter more than the models. Here's what we found, caveats and all — including the correction we made along the way.

The setup

We used Ego4D Natural Language Queries (NLQ) — a public benchmark of egocentric video with human-authored questions (“where did I put the watering can?”) and answer windows that were created independently of our system. That independence is the whole point: we can't quietly grade ourselves against a target we invented. We learned that one the hard way — an earlier internal experiment looked great on a benchmark we designed, then collapsed on real human queries once the ground truth wasn't rigged in our favor. Never again.

We built a cross-video pooled index over four Ego4D videos:

One honest note up front: the text channel uses Ego4D's provided narrations, not MediaFind's own speech-to-text. This experiment measures multimodal fusion, not our transcription quality. Swapping in real ASR output is a separate test we haven't run yet.

Ego4D is head-mounted camera footage, so its NLQ questions are first-person “where did I leave it” memory queries — exactly the kind you'd ask your own recordings. A few real ones from our set:

“Where did I put my phone?” · “What did I put in the pot?” · “Where is the pipe metal?” · “What time did I eat the food?” · “Where did I put a cup?” · “Did I leave the microwave open?”

We ran 97 of these against several fully on-device methods. Two single channels:

and two ways to fuse them: RRF (reciprocal-rank fusion — combine the two rankings, the standard first reach) and score fusion (sum each channel's confidence-normalized similarity scores). Plus an oracle that always routes to whichever channel is right — an unreachable ceiling, not a real method.

The protocol, precisely, so a skeptic can see exactly how the table is computed. Every method searches across all four videos — crucially, none is restricted to the query's own video (getting that wrong is exactly the bug we hit; more below). Each single channel ranks its own units (narration segments for text, frames for visual); the fusion methods rank the union of both. A query counts as a hit at rank k if a top-k moment falls inside the query's ground-truth answer window (±1s) in the correct video. The cross-video pool makes this harder than standard within-video NLQ, so these numbers are not comparable to the official NLQ leaderboard.

Everything ran locally on an Apple M4 Max laptop via Metal Performance Shaders (MPS). No cloud, no API keys.

The result

MethodR@1R@5R@10MRR
text only0.0720.2160.2990.161
visual only0.0720.1030.1440.099
RRF (rank fusion)0.0820.2060.2890.142
score fusion0.1240.2370.3300.188
oracle route (ceiling)0.1440.2780.381

The fusion method matters more than the models

Start with the obvious approach and you'd conclude the opposite of our headline. Reciprocal-rank fusion (RRF) — rank each channel, then combine the ranks — is the standard first move, and on its own it doesn't clear the bar here: 0.289 R@10, a touch under text-only's 0.299, and it trails on R@5 and MRR too. (It edges text at R@1 — 8 hits vs 7 — but that's within the noise of 97 queries.) Simply combining ranks isn't enough.

Why? RRF looks only at the rank of each item, throwing away the similarity magnitude. So a barely-above-noise visual guess gets the same vote as a confident one — and since the visual channel is much weaker here (R@10 0.144 vs text's 0.299), its uncertain votes dilute strong text hits. Rank fusion asks each channel for its opinion but never asks how sure it is. That's the piece worth keeping.

What actually works: confidence-aware score fusion

The fix is to keep the confidence signal. Instead of fusing ranks, we normalize each channel's similarity scores (per query, z-scored to a common scale) and add them. This puts both channels on the same footing while preserving each channel's internal score gaps — so a channel with a clear standout casts a strong vote, while a flat, uncertain channel's votes stay small. Same two channels, same candidates — just a fusion that respects how peaked each channel's scores are.

That version beats the best single channel on every metric: R@10 0.330 (+10% over text-only's 0.299), R@1 0.124 (+72% over the best single channel's 0.072), MRR +17%. It has zero parameters tuned on the test set, and the win holds across normalization choices (R@10 0.320–0.330). The oracle ceiling — always route to the right channel — sits at 0.381, so there's still headroom: score fusion captures roughly a third of the gap between the best single channel and a perfect router.

Concrete examples — real queries from the run

The position each method gave the correct moment (#1 is the top result; “miss” = not in the top ten).

Score fusion holds on to a correct answer that rank fusion lets slip. When text alone already nails it, RRF's equal-weight visual vote can drag it down — sometimes out of the top ten — while score fusion keeps it at the top:

QueryTextVisualRRFScore fusion
“Where did I put a cup?”#1missmiss#1
“Where is the pipe metal?”#2miss#5#1
“What time did I tap on the table?”#1miss#5#1

And score fusion genuinely adds signal — surfacing moments neither channel ranked highly on its own:

QueryTextVisualRRFScore fusion
“What time did I eat the food?”missmissmiss#5
“Where did I put my phone?”missmiss#3#2
The bug we caught (2026-07-14). An earlier version of this post claimed fusion beat the best single channel by +48% (R@10 0.443). That was wrong — a harness bug. Fusion was scored only against moments from the query's own video, while text and visual were scored against the full four-video pool, so fusion faced far fewer distractors. Once every method shares the same pool, the +48% vanishes and rank fusion no longer clears text. It's the same failure class as grading yourself on a benchmark you designed: a self-favoring evaluation manufactured a false positive. We caught it in review before it shipped, reran everything, and the honest result is the table above — a real, if modest, win for score fusion.

What we're not claiming

We're allergic to hype, so here's the honest boundary:

Why publish this at all

Because “on-device” has become a marketing checkbox, and checkboxes don't tell you if the product works. The useful, non-obvious finding here: combining vision and text on-device really does beat the best single channel — but you get there with confidence-aware score fusion, not the rank fusion you'd reach for first. That's the kind of thing you only learn by measuring — and by being willing to publish the correction when the first measurement was wrong.

This is deliberately the outward-facing half of a pair. Internally we run a per-commit regression eval that guards search quality on our own curated sets on every push; this post is the complement — an external, public benchmark, on queries we didn't write, that a stranger can rerun. One keeps us from regressing; this one lets you check our homework — bug and all.

Search your own library — privately, and measurably

On-device transcription, CLIP vision, faces and a local LLM. No cloud, no keys. Point it at your media and see for yourself.

Download for macOS