<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[CosmoEdge Engineering]]></title><description><![CDATA[CosmoEdge Engineering]]></description><link>https://cosmoedge.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>CosmoEdge Engineering</title><link>https://cosmoedge.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 19:02:43 GMT</lastBuildDate><atom:link href="https://cosmoedge.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How Many Cameras Can an Edge AI Box Really Handle?]]></title><description><![CDATA[“Eight cameras” sounds like a hardware specification. It is really a statement about a workload.
Eight streams running a person detector at 5 FPS ask something different from eight streams running tha]]></description><link>https://cosmoedge.hashnode.dev/how-many-cameras-can-an-edge-ai-box-really-handle</link><guid isPermaLink="true">https://cosmoedge.hashnode.dev/how-many-cameras-can-an-edge-ai-box-really-handle</guid><category><![CDATA[Computer Vision]]></category><category><![CDATA[ Edge AI]]></category><category><![CDATA[YOLO]]></category><category><![CDATA[benchmarking]]></category><category><![CDATA[open source]]></category><dc:creator><![CDATA[samuel Hu]]></dc:creator><pubDate>Sat, 10 Oct 2026 10:03:21 GMT</pubDate><content:encoded><![CDATA[<p>“Eight cameras” sounds like a hardware specification. It is really a statement about a workload.</p>
<p>Eight streams running a person detector at 5 FPS ask something different from eight streams running that detector at 24 FPS. Add a classifier after detection and the amount of work can change with the number of people in view. Even counting the model stages can mislead you if two tasks reuse the same detector output.</p>
<p><a href="https://github.com/cosmo-wander-ai/cosmo-edge">CosmoEdge</a> is an open-source edge video analytics engine. Its published v1.1 RK3576 tests make these differences visible. One mixed workload passed through eight channels. A person-detection run targeting 24 FPS first failed its throughput requirement at seven. The useful question is how those conclusions were obtained, and what each number actually measures.</p>
<h2>Define one channel before multiplying it</h2>
<p>The <a href="https://github.com/cosmo-wander-ai/cosmo-edge/blob/cdf549c68881eaea58871970597dc2739ab6a964/docs/benchmarks/scenario-bench/v1.1/scenarios/concurrent-mixed/scenario.public.yml">mixed workload</a> assigns two tasks to every channel:</p>
<ul>
<li>Person detection, with one detector stage.</li>
<li>No-safety-helmet analysis, with a detector followed by a classifier.</li>
</ul>
<p>Both tasks target 5 FPS. The <a href="https://github.com/cosmo-wander-ai/cosmo-edge/blob/cdf549c68881eaea58871970597dc2739ab6a964/docs/benchmarks/scenario-bench/v1.1/models/io-contract.json">model contract</a> records a 640 × 640 detector input and 224 × 224 person crops for helmet classification.</p>
<p><img src="https://cdn.hashnode.com/uploads/covers/6ac8e11af442adb88853a676/cec50c29-4b92-4367-bbfc-cb5a86454063.png" alt="Technical schematic showing shared detector output, task-specific processing, target crop classification, queue-counter throughput measurements, and the event path outside the FPS measurement." /></p>
<p><em>Figure 1. Logical tasks, runtime reuse, and measurement points in the inspected source. Detector reuse requires the same algorithm and channel.</em></p>
<p>At eight channels, that is sixteen task bindings and three logical model stages per channel. Multiplying 8 × 2 × 5 gives a target of 80 task-frame updates per second. It does not give the number of accelerator invocations.</p>
<p>There is a concrete reason. In the recorded engine source, <a href="https://github.com/cosmo-wander-ai/cosmo-edge/blob/89c73a7464a81ef378686447d7c1eeb88b988455/src/flow/detect/AiDetectMng.cc">detector placement</a> reuses the existing detector when the algorithm and channel match. The detector runs on its input frames, then <a href="https://github.com/cosmo-wander-ai/cosmo-edge/blob/89c73a7464a81ef378686447d7c1eeb88b988455/src/flow/detect/AiDetector.cc">distributes the result</a> to task queues with task-specific confidence filtering. Its rate budget uses the highest requested task FPS on that channel. Two matching 5 FPS bindings therefore contribute 5 FPS to that detector budget, rather than 10.</p>
<p>Classification scales differently. The <a href="https://github.com/cosmo-wander-ai/cosmo-edge/blob/89c73a7464a81ef378686447d7c1eeb88b988455/src/flow/classify/AiClassifier.cc">classifier path</a> collects eligible targets, skips filtered or out-of-area targets, and classifies the remaining crops. The downstream workload depends on how many targets survive. A quiet entrance and a shift change can stress the same configuration differently.</p>
<h2>Follow the clocks through the pipeline</h2>
<p>A camera’s frame rate, a task’s processing rate, and an event rate are three different clocks.</p>
<p>The test input runs at 24 FPS. The mixed tasks request 5 FPS. Rate-controlled frame selection happens on the processing path; frames deliberately skipped there should not be read as queue-overload losses. Meanwhile, video access and decoding still have work to do, and opening a preview adds another consumer.</p>
<p>The benchmark obtains CV throughput from queue counters. For each action, it divides the queue’s processed-item count by its reported interval. That counter advances when an item is removed for processing. It then takes the slowest effective frame-processing action for each task/channel binding. The <a href="https://github.com/cosmo-wander-ai/cosmo-edge/blob/5ec280a93071d66027a8f3ae10715dab5dae1424/tools/scenario-bench/src/metrics-sampler.js">sampler</a> explicitly handles a subtle trap: a shared detector’s counter can contain aggregate work and appear in several task records. Adding those counters would overstate throughput.</p>
<p>Event Report is excluded from this FPS floor. That makes sense: a healthy helmet task might process frames continuously and produce no violation event for an hour. Treating its alarm rate as inference throughput would make the quietest scene look like a failure.</p>
<p>This also explains why a task reporting 5 FPS is not enough to establish how quickly an operator receives an alarm. Frame processing, temporal rules, capture, and downstream delivery need separate observations.</p>
<h2>Increase load with a declared pass condition</h2>
<p>For the short runs, the <a href="https://github.com/cosmo-wander-ai/cosmo-edge/blob/cdf549c68881eaea58871970597dc2739ab6a964/docs/benchmarks/scenario-bench/v1.1/methodology.md">published protocol</a> adds one channel per step, holds it for 30 seconds, and samples roughly every three seconds. The report uses the second half of each step as its steady window.</p>
<p>The processing-FPS gate is 80% of the requested rate. For a 5 FPS task, the floor is 4 FPS; for a 24 FPS task, it is 19.2 FPS. The remaining gates cover missing telemetry, discard rate, and the reported node-duration metrics: no missing task telemetry, average discard at most 5%, detector duration at most 150 ms, and critical-path duration at most 200 ms when available.</p>
<p>That 80% threshold deserves attention. A configuration can pass while delivering less than its configured target. If an application needs 24 processed frames per second on every channel, its acceptance threshold should say so.</p>
<p>The setup was an RK3576 EVB using RKNN inference and Rockchip MPP/RGA media. Each channel replayed the same 15-second H.264 1920 × 1080, 24 FPS clip locally, with preview disabled. These conditions apply to the curves below.</p>
<p><img src="https://cdn.hashnode.com/uploads/covers/6ac8e11af442adb88853a676/f35cd831-88ef-4771-8bba-3a2be224d8be.png" alt="Two plots from the published RK3576 records: the mixed 5 FPS workload passes all eight configured channel counts, while the person-only 24 FPS workload passes six, fails at seven, and stops at eight." /></p>
<p><em>Figure 2. Recorded processing rates at each load step. Dashed amber lines show the 80% FPS gates; gray dotted lines mark the targets. The panels use different vertical scales.</em></p>
<h2>Read the last passing step carefully</h2>
<p>The <a href="https://github.com/cosmo-wander-ai/cosmo-edge/blob/cdf549c68881eaea58871970597dc2739ab6a964/docs/benchmarks/scenario-bench/v1.1/results/rk3576/cases.json">canonical RK3576 records</a> contain all eight steps of the mixed run. Every step passes. At eight channels, the minimum reported rates are 5.08 FPS for person detection and 5.07 FPS for helmet analysis, with zero reported missing telemetry and discard.</p>
<p>Eight was the highest configured step. The result establishes a lower bound of eight passing channels for this workload. There is no ninth-channel failure in that run from which to infer a maximum.</p>
<p>The 24 FPS person-only run provides a different kind of result. It reports 24.23 FPS at five channels, 21.55 at six, and 18.95 at seven. Six passes the 19.2 FPS floor. Seven falls below it and is marked FAIL.</p>
<p>The run continued to eight, where it reports 16.46 FPS and STOP, with a discard-protection reason. The first failed report gate and the point where execution stopped are different rows. Keeping both matters: reporting only the final stop would hide where the declared throughput requirement was first missed.</p>
<p>This is why “six channels” and “at least eight channels” can both be correct for the same platform. The task mix, requested rates, and acceptance threshold are part of the answer.</p>
<h2>What the latency fields actually contain</h2>
<p>At eight channels in the mixed run, the report gives 24.0 ms for detector duration. Its critical-path fields are 25.7 ms for person detection and 45.1 ms for helmet analysis.</p>
<p>The <a href="https://github.com/cosmo-wander-ai/cosmo-edge/blob/5ec280a93071d66027a8f3ae10715dab5dae1424/tools/scenario-bench/src/task-strategies.js">latency reducer</a> builds those values from node-duration telemetry. For the critical path it adds selected node mean durations. The <a href="https://github.com/cosmo-wander-ai/cosmo-edge/blob/5ec280a93071d66027a8f3ae10715dab5dae1424/tools/scenario-bench/src/step-evaluator.js">step evaluator</a> averages the sampled values per binding, then takes the largest binding average.</p>
<p>So 45.1 ms is a summary of processing time in the selected nodes. It is neither a P95 nor a capture-to-event stopwatch measurement. Queue waiting and a rule that requires a condition to persist can make an event arrive much later.</p>
<p>Those fields are still useful. In the 24 FPS run, the detector-duration summary rises from 24.0 ms at one channel to 47.3 ms at six and 55.2 ms at seven, alongside falling processing FPS. That shows degradation as load rises. Identifying its exact cause would require further profiling of scheduling, media work, and inference.</p>
<h2>Hold a chosen workload over time</h2>
<p>A staircase test helps locate a throughput boundary. A longer run asks whether a chosen configuration continues operating.</p>
<p>The separate <a href="https://github.com/cosmo-wander-ai/cosmo-edge/blob/cdf549c68881eaea58871970597dc2739ab6a964/docs/benchmarks/scenario-bench/v1.1/results/dual-cv-72h.json">72-hour RK3576 observation</a> held eight channels and sixteen mixed-task bindings at 5 FPS per task. It collected 4,316 of 4,320 expected minute samples, with a minimum processing rate of 5.00 FPS and an average of 5.098 FPS. Observed discard and missing-binding counts were zero.</p>
<p>Sampling coverage belongs beside the FPS result. Otherwise, a stable average could hide a gap in observation. Here the largest reported gap was about 60.06 seconds, close to the one-minute sampling interval.</p>
<p>This run used a different recorded source revision and kept scheduled restarts disabled. It adds sustained-processing evidence for its fixed configuration. Camera reconnection and restart recovery remain separate tests for the actual installation.</p>
<h2>Turn the result into a deployment decision</h2>
<p>For an existing IP camera that supplies a compatible stream, start by writing down the resolution, codec, task mix, requested rates, and acceptable delay. Include the busiest useful clip, not only the cleanest demo scene.</p>
<p>Then repeat the load steps with your models and settings. Keep per-task results so one fast task cannot conceal a slow one. Record the first failed requirement as well as the eventual stop, and run the intended operating load for longer with the previews and output integrations people will actually use.</p>
<p>Visual orchestration is useful at this point. CosmoEdge’s <a href="https://www.cosmowander.ai/docs/tutorials/04-pipeline-orchestration/pipeline-orchestration">pipeline view</a> makes the detection, filtering, classification, and rule chain inspectable. Moving a filter or changing which targets reach the classifier changes the workload; save that configuration with the result and rerun the test.</p>
<p>A useful capacity answer includes the workload and the curve behind it. For these records: at least eight mixed-task channels at the 5 FPS setting passed, while the 24 FPS person-only run first missed its 80% throughput requirement at seven. That is enough detail to start an engineering discussion about a deployment.</p>
<p>To try a workload of your own, start with the <a href="https://github.com/cosmo-wander-ai/cosmo-edge">CosmoEdge repository</a> and <a href="https://www.cosmowander.ai/docs/tutorials/01-quickstart/quickstart">quickstart</a>.</p>
]]></content:encoded></item></channel></rss>