Frigate Hardware & Detector Fit — methodology

Method version 1.7.0 · dataset frigate-fit 2026-09-08 · engine: /engines/frigate-fit/ · dataset: datasets/frigate-fit.json

Every software fact here is Frigate's own documentation, quoted. Every capacity number is Frigate's own rule applied to the inference speeds the Frigate project publishes. Decode is the platform's decode datasheet through Camera Stream Capacity. Nothing is measured by EdgeAIStack, and nothing is guessed.

Contents

  1. What it decides, and what it does not
  2. Inputs
  3. Frigate's sizing rule
  4. The checks
  5. Verdict rule
  6. Platform → detector table
  7. Decode presets and the config snippet
  8. Alternatives and remediation
  9. Evidence classes and confidence
  10. What invalidates a result
  11. Method changelog

1. What it decides, and what it does not

The engine answers one procurement question: for this platform, this many cameras, this detect substream and this detect frame rate, does Frigate fit? It returns FIT, FIT WITH RISKS, NEEDS VALIDATION or NO FIT, together with the Frigate detector the platform runs, the image tag it needs, the detections per second the deployment demands against the detections per second the detector delivers, the camera ceiling, the decode budget, the ffmpeg hardware-acceleration preset and a config snippet.

It does not predict Frigate's frame rate, its recording throughput, its CPU load in your ffmpeg configuration, or the accuracy of a model on your scene. It does not model the go2rtc restream, birdseye, semantic search or the review pipeline. Detection load in the real world follows motion, not camera count; the engine sizes the worst case by default and lets you scale it with a motion share.

2. Inputs

InputValuesDefaultUsed by
platformplatform id (Jetson Orin Nano / NX / AGX Orin / Thor, Hailo-8 and 8L, Coral, RK3588, Intel N100 and Nuvo-9531, NVIDIA A2 / L4 / A10 / L40S servers)requiredall checks
cameras1–1284detector capacity, decode
detect_resolution480p · 720p · 1080p · 1440p · 4k · WxH720pdecode
detect_fps1–605 (Frigate's recommendation)detector capacity
source_fpscamera stream frame rate feeding the decoder15decode
codech264 · h265 · av1 · mjpegh264decode, preset selection
motion_share0–1, the share of frames with motion1 (worst case)detector capacity
hostraspberry_pi_5 · x86_mini_pc · rk3588_integrated — for an accelerator (Hailo, Coral)the accelerator's default hostdecode, host CPU / link / pre-processing, preset
recordingpassthrough (copy) · re-encodepassthroughpassthrough: no encode load (an assumption line says so); re-encode: adds the encode check and changes the record output args in the config snippet

The detect substream is the only stream the engine decodes. Frigate's recommended architecture records the high-resolution stream as a passthrough copy — no decode, no encode — and detects on a small substream, which is why detect resolution and detect fps, not the record stream, drive the budget. Frigate's recording documentation says so directly: “These recordings are written directly from your camera stream without re-encoding.” Choosing re-encode changes that: every camera's stream is encoded again, continuously, and the engine adds that load as the encode check (section 4). The record stream is sized at the camera stream the engine already models (cameras × detect resolution × source fps); a higher-resolution main stream costs proportionally more.

Inputs (WP-01). A field that is not stated takes its documented default and is listed in provenance.defaulted; a field that is stated but invalid — a count of 0, a negative, a fraction or a non-number, true in place of a count, an unknown value of an enumerated input, or an empty string — is rejected with VALIDATION_ERROR naming the field, never replaced by a default.

Input keys (WP-02). The engine accepts one list of input keys — the inputs documented here and their declared backward-compatible aliases. Unknown input keys are rejected with VALIDATION_ERROR naming the key: an invented or misspelt key is never silently ignored, a __ test hook never reaches the engine, and an alias sent together with the key it stands for is rejected too (the engine would read only one of them). export_json.inputs echoes every input the engine honoured, so replaying it reproduces the result.

Detection above the source rate. A stated detect_fps above source_fps is capped to the source frame rate and the cap is disclosed: the decode and preprocessing stages composed from Camera Stream Capacity run at the source rate, an assumption names both figures and workload.detect_fps_cap carries them; the detector demand keeps the stated rate.

3. Frigate's sizing rule

The capacity rule is not ours. Frigate's recommended-hardware page states it directly:

“You can calculate the maximum performance of your Coral based on the inference speed reported by Frigate.”
“With an inference speed of 10, your Coral will top out at 1000/10=100, or 100 frames per second.” Frigate · Recommended hardware · docs.frigate.video/frigate/hardware

So available detections/s = 1000 / inference ms. Where Frigate publishes a band rather than a single figure — 20–40 ms for every Jetson module — the inference row's available uses the band midpoint (33.3 det/s for 20–40 ms) for PASS / NEAR LIMIT / FAIL utilisation; the slow edge (25 det/s) and fast edge (50 det/s) are published in the row detail, and the band itself still reads REQUIRES VALIDATION until a platform measurement replaces it. The load is required detections/s = cameras × detect fps × motion share, and the camera ceiling uses the midpoint capacity: floor(available / (detect fps × motion share)).

The detect frame rate default is also Frigate's:

“Optional: desired fps for your camera for the input with the detect role (default: shown below). NOTE: Recommended value of 5.” Frigate · Full Reference Config · docs.frigate.video/configuration/reference

A motion share of 1 means every camera is detecting at the detect fps at the same instant. That is the number a deployment has to survive, so it is the default; 50 % or 30 % model a site whose cameras are mostly still.

4. The checks

CheckComparesStatusClass
detectorThe Frigate detector type the platform runs, its default and supported models, and the image tag the detector needsPASS when the documentation names the detector for the platform; NEEDS VALIDATION when the mapping carries a caveat (Thor on JetPack 7 against a -tensorrt-jp6 image)A
inferenceRequired detections/s against 1000 / the midpoint of the published inference band (single-ms rows use that ms)PASS below capacity; NEAR LIMIT close to it; FAIL above on a published row; REQUIRES VALIDATION above where a server GPU is mapped to another GPU's row (a cross-platform transfer is planning-only evidence and cannot eliminate); published bands also carry REQUIRES VALIDATION on the rangeC (published Frigate measurement); D where a server GPU maps to the nearest published row
decodeDetect-stream decode load against the platform's decode datasheet, through Camera Stream CapacityPASS / NEAR LIMIT / FAIL from that engine, unchanged — its elimination authority included (a modelled decode ceiling with no source record is REQUIRES VALIDATION there, never FAIL); UNKNOWN when the platform has no decode datasheet in the catalogA / D from Camera Stream Capacity; E when UNKNOWN
encode (re-encode only)The record stream encoded again. On a Jetson or server platform: carried from Camera Stream Capacity's encode stage (NVENC datasheet throughput; the Orin Nano's software-encode budget of about one 1080p30 stream). On an accelerator platform (Hailo, Coral, RK3588) the card has no encoder, so the host CPU encodes H.264 in software: cameras × width × height × source fps megapixels/s × (4 × the host's software-decode CPU-ms per megapixel), added to the host CPU check's load, against the same host CPU budget. Frigate publishes no encode figure; the factor 4 is an EdgeAIStack engineering factorPASS / NEAR LIMIT / REQUIRES VALIDATION. The host software-encode load is a class E estimate against an estimated host CPU budget, so an encode over budget cannot eliminate: it is REQUIRES VALIDATION with the shortfall stated on every accelerator host — the Raspberry Pi 5, which has no hardware H.264 encoder, and hosts whose hardware encoder is not modelled. A Jetson or server encode row carried from Camera Stream Capacity keeps that engine's status and elimination authority. UNKNOWN when no encoder is on record (Intel N100, the server GPUs, Neousys)A / D carried; E for the host software encode
host_cpu, host_link, host_preprocessingFor an accelerator (Hailo, Coral): the host board's CPU decode cost, the PCIe / USB link and the pre-processing budgetfrom Camera Stream Capacity's host budget, unchangedA / D
decode_presetThe ffmpeg hardware-acceleration preset Frigate documents for the platform, or for the resolved host, against the workload codecPASS when hardware decode exists for the codec. When the host has no hardware decode for the requested codec (Raspberry Pi 5 + H.264) the check follows the software-decode path: PASS when the host CPU and decode checks pass (software decode stays a risk); FAIL only when they fail on evidence that can prove it, carrying their elimination authority; REQUIRES VALIDATION when their miss rests on planning-only evidence, as the estimated host CPU budget does; NEEDS VALIDATION when the preset is host-dependent and no host was givenA (E when undocumented)

The checks always open with detector, inference, decode and close with decode_preset; the encode check follows decode only when the record stream is re-encoded, and the host checks appear between them only when an accelerator sits on a host board.

5. Verdict rule

  • NO FIT — any check FAILs. Most often the detector cannot hold the detections per second.
  • NEEDS VALIDATION — no FAIL, but a check is UNKNOWN or needs validation: the platform has no decode datasheet on record (Intel N100), or the documented Frigate image does not name this hardware generation (Jetson Thor).
  • FIT WITH RISKS — no FAIL and nothing unknown, but a check is NEAR LIMIT (a detector close to its midpoint ceiling), or the platform is a Coral, which Frigate documents as “no longer recommended for new Frigate installations, except in deployments with particularly low power requirements.”
  • FIT — every check passes.

The verdict never softens a FAIL and never hardens an UNKNOWN into a FAIL: a limit Frigate does not publish is reported as unknown, not guessed.

6. Platform → detector table

PlatformDetectorModel Frigate benchmarksInferenceDetections/sImage tagClass
Jetson Orin Nano 8GB / Orin Nano Super / Orin NX 8GB / Orin NX 16GB / AGX Orin 32GB / AGX Orin 64GBtensorrtYOLO (v3 / v4 / v7)20–40 ms25–50-tensorrt-jp6C
Jetson Thor T5000 / T4000tensorrtYOLO (v3 / v4 / v7)20–40 ms25–50-tensorrt-jp6 (JetPack 7 — validate)C
Hailo-8 (M.2 / HAT)hailo8lYOLOv6n7 ms142.9standard imageC
Hailo-8L (M.2 / AI Kit)hailo8lYOLOv6n11 ms90.9standard imageC
Google Coral Edge TPUedgetpuMobileDet10 ms100standard imageC
Rockchip RK3588rknnYOLOv9 small20 ms50standard imageC
Intel N100 mini PCopenvinoMobileNet v2 / YOLOv915 ms66.7standard imageC
Neousys Nuvo-9531 (Intel UHD 770)openvinoMobileNet v2 / YOLOv915 ms66.7standard imageC
NVIDIA A2 serveronnxYOLOv9 t-320 (RTX 3050 row)8–10 ms100–125standard imageD
NVIDIA L4 / A10 / L40S serveronnxYOLOv9 t-320 (RTX 3070 row)6–8 ms125–166.7standard imageD

Every inference figure is a verbatim quote from a Frigate documentation page, at most 25 words, with the URL and retrieval date, in datasets/frigate-fit.json. Frigate publishes one band for every Jetson module and no figure for datacentre GPUs; the four server GPUs are mapped to the nearest published consumer row and marked class D so a reader can see the substitution rather than inherit it silently. The registry also holds detector types the catalog has no platform for yet (cpu, memryx) and inference rows for hardware outside the catalog (RK3566, Intel Arc A750, Intel NPU, AMD 780M, GTX 1070, MemryX MX3).

7. Decode presets and the config snippet

PresetHardware Frigate names
preset-vaapiIntel (gen1–gen7), AMD — “VAAPI supports automatic profile selection so it will work automatically with both H.264 and H.265 streams.”
preset-intel-qsv-h264 / preset-intel-qsv-h265Intel (gen8+)
preset-nvidiaNVIDIA GPU — “ffmpeg will automatically select the necessary profile for the incoming video.”
preset-jetson-h264 / preset-jetson-h265NVIDIA Jetson
preset-rpi-64-h264 / preset-rpi-64-h265Raspberry Pi 3/4
preset-rkmppRockchip SoC

An accelerator card has no decoder of its own, so it inherits the preset of the host it sits on: a Hailo or Coral on a Raspberry Pi 5 gets the Pi preset, on a mini-PC the Intel presets. The Pi 5 has no H.264 hardware decoder, so an H.264 detect stream on that host falls back to software decode: the preset check passes when the host CPU and decode checks pass, the software decode is reported as a risk, and when they miss the preset check takes their outcome: FAIL only when a decode path fails on evidence that can prove it, REQUIRES VALIDATION when the miss rests on planning-only evidence. The host CPU budget is such an estimate (a software-decode cost per megapixel against a class E budget share), so on the Pi 5 an H.264 load over it is REQUIRES VALIDATION, not NO FIT. The CPU cost shows in the host CPU check — Frigate's Video Decoding page documents Raspberry Pi 3/4 presets and does not state the Pi 5 case, so the engine says so rather than inventing a preset. Frigate's own default is hwaccel_args “(default: auto detect)”.

The config snippet names the detector block, the device line where the detector needs one (edgetpu, openvino), the preset chosen for the codec, and the detect frame rate and size. It names a preset only when one decodes the stream codec on the resolved host; with software decode (Raspberry Pi 5 + H.264) it omits hwaccel_args and says so in a comment. The record output args follow the recording choice: passthrough records with preset-record-generic (the stream copied as-is, no audio); re-encode writes the same segment arguments with -c:v libx264 -preset veryfast — Frigate has no preset that re-encodes video, and it notes that browsers other than Chrome 108+, Edge and Safari “require recordings to be encoded with H264”. It is a starting point, not a complete config.yml: cameras, go2rtc, retention and object filters are yours.

8. Alternatives and remediation

Every result lists every mapped platform with its detector, published inference milliseconds, the cameras it holds at your detect fps and motion share, whether it holds this load, and its evidence class — sorted by camera ceiling, so the substitution is visible at a glance. A failing or near-limit check names the change that flips it: a lower detect fps, a smaller camera count on this node, a faster detector, or a lower-resolution detect substream when decode is the binding constraint. A detector that needs validation names the documented fallback.

The headroom ladder re-runs both the detector capacity and the decode budget across camera counts and reports where the node is comfortable, where it is likely viable, and where it fails.

9. Evidence classes and confidence

  • A — Frigate's software documentation: detector types, supported hardware and models, image tags, the ffmpeg presets, the recommended detect fps, the capacity rule and the Coral status statement; and the vendor decode datasheets Camera Stream Capacity uses.
  • C — the inference-speed rows the Frigate project publishes for each hardware family. These are measurements by the project, not by a vendor and not by EdgeAIStack.
  • D — a server GPU mapped to the nearest published consumer GPU row, and modelled decode where Camera Stream Capacity has no datasheet row.
  • E — an UNKNOWN decode or an undocumented preset: reported as unknown, never as a number.

Confidence: HIGH on the detector and preset checks (Frigate documentation); MEDIUM on a class C inference check; LOW on a class D mapping or any UNKNOWN. The overall confidence is the lowest of the checks.

10. What invalidates a result

  • A different detection model from the one Frigate benchmarked — a larger YOLO variant runs slower than the published row, so the capacity falls with it.
  • Re-encoding the record stream instead of passing it through: that is an encode budget this engine does not size.
  • Running detection on the full-resolution stream rather than a substream — the decode check is sized on the detect stream you entered.
  • A Jetson at a lower power mode: Frigate publishes one 20–40 ms band for every Jetson module with no per-module or per-power-mode figure, so a capped module sits at the slow end or below it.
  • A motion share entered below what the site actually produces — detection load follows motion, and a busy scene runs at the worst case.
  • Anything Frigate runs beyond detection: semantic search, face and licence-plate recognition, birdseye and the go2rtc restream all take resources this engine does not budget.
  • Wi-Fi cameras, which Frigate's own hardware page advises against.

11. Method changelog

MethodDatasetDateChange
1.7.02026-09-082026-09-29elimination authority (#263, owner ruling 2026-09-29). A server GPU's inference, mapped to another GPU's published row, and the host software encode (class E) are planning-only: a miss is REQUIRES VALIDATION (was NO FIT) — the Raspberry Pi 5 + Hailo-8L with two 1080p15 streams re-encoded is NEEDS VALIDATION now. Carried Camera Stream Capacity rows keep their authority, so an estimated host CPU miss is REQUIRES VALIDATION, and the decode preset follows them. Every row publishes elimination_authority.
1.6.22026-09-082026-09-28Input rules (WP-01 remainder, WP-02): recording is passthrough, reencode or none — an unknown value is rejected instead of failing the composed decode as UNKNOWN; codec, host, detect_resolution, detections_per_second and precision are checked; codec, detect_resolution and recording defaults are listed in provenance.defaulted. Unknown input keys are rejected; pipeline_model is composition-only (send model_family / variant / precision). No formula changed.
1.6.12026-09-082026-09-28Present-invalid inputs are rejected; absent inputs default and are recorded (WP-01): a value that is stated but malformed — cameras 0 / −5 / "lots" / true / 2.9 / "" or above 128, a detect_fps, source_fps or motion_share that is not a number in range — returns VALIDATION_ERROR naming the field instead of being replaced by a default; a field that is not stated takes its documented default and is listed in provenance.defaulted. No formula changed. A detection rate stated above the source frame rate is capped to it and the cap is disclosed (assumption and workload block), never silent.
1.6.02026-09-082026-09-28The recording control is wired. Re-encode adds an encode check — the platform encoder carried from Camera Stream Capacity, or software H.264 encode on an accelerator platform's host CPU (class E factor 4 × software decode); the verdict can change (Raspberry Pi 5 + Hailo-8L with two 1080p15 streams: FIT with passthrough, NO FIT with re-encode). Passthrough states that it adds no encode load. The config snippet carries the record output args for the choice, and the result publishes a recording block. Previously the choice changed only the echoed inputs.
1.5.02026-09-082026-09-27Raspberry Pi 5 + H.264: the decode preset check follows the software-decode path — PASS with a software-decode risk when the host CPU and decode checks pass, FAIL only when every decode path fails (previously always FAIL, so every such run was NO FIT). The config snippet no longer names the H.265-only preset for H.264 streams; it omits hwaccel_args and says software decode in a comment.
1.02026-09-082026-09-08First release. Eighteen platforms mapped to eight Frigate detector types, fifteen published inference rows and nine hardware-acceleration presets from the Frigate documentation; Frigate's capacity rule and recommended detect fps; the detector, inference, decode, host budget and preset checks; the four-state verdict; the config snippet and the platform comparison.

Method changes bump the method version; new or re-verified Frigate documentation bumps the dataset version. Both are in every result and in the citation block.