The garage camera was firing 200 person events per 24 hours. None of them were people. Frigate’s default 0.7 person-detection threshold was catching IR-noise pareidolia at a rate that buried real events under garbage.
Standard advice on the Frigate forums says “raise your threshold.” Standard advice on YouTube says “lower it, you’ll miss real people.” Both are wrong unless you check the data first.
Pull the histogram
Frigate exposes recent events at /api/events. You can pull the last 200 events for a single camera, including each detection’s confidence score, in one line:
curl 'http://frigate:5000/api/events?camera=garage&limit=200' \
| jq '[.[] | .top_score] | sort'
That gives you the ordered list of detection confidences. Bin it however feels useful — quartiles, percentiles, a quick histogram — but the shape is what matters.
For the garage camera, the shape was unmistakable:
- Noise band:
0.65 → 0.84, dense, hundreds of events. - Real events (people walking through, IR-lit at night):
0.78 → 0.84, sparse, all in the upper half of the noise band. - Above 0.84: nothing. Real IR-lit person detections cap there because the underlying classifier loses confidence in low-light.
The textbook answer (“raise threshold to 0.85+, kill the noise”) also kills every real detection. The right answer comes from looking at the real-event distribution, not the noise distribution.
What “right” actually meant for this camera
We set person.threshold: 0.80 on the garage. That keeps the upper half of real events and drops the bottom 60% of the noise band. Expected reduction: ~70% in event volume. Tradeoff: real persons in the 0.78–0.79 sliver get missed, but those were the marginal cases anyway.
24 hours later: down from 200 events to 47. Of those 47, all but a handful were actual people walking through.
The driveway camera had the opposite problem
Same workflow on the driveway revealed a different failure mode. Real departures (cars backing out at 5fps) were capping at score 0.62 — below the default 0.7 — because motion blur trashes the classifier’s confidence on fast-moving objects.
Lower the threshold, and the noise band on the driveway is sparse enough that it doesn’t matter:
driveway:
objects:
filters:
person:
threshold: 0.55
car:
threshold: 0.55
Real departures fire correctly, and the noise floor is still acceptable because the driveway just isn’t a noisy scene during the day.
The rule
Before touching a Frigate threshold, pull /api/events?camera=<name>&limit=200 and look at the actual score distribution. Look at where real events cluster, look at where noise clusters, tune toward the gap between them.
Don’t trust intuition. Don’t trust forum advice that doesn’t reference your camera’s data. An indoor camera with strong lighting has a totally different distribution than an outdoor IR camera at night, and a threshold that’s right for one is wrong for the other.
This rule cost an embarrassing dev session before it became second nature. Worth writing down.