Repository navigation
feat(engine): temporal validation of alerts on the Pi - #415
Open
MateoLostanlen wants to merge 17 commits into
Open
MateoLostanlen wants to merge 17 commits into
MateoLostanlen wants to merge 17 commits into
Conversation
…X temporal model
POST /jobs takes a window of frames plus YOLO boxes for one camera pose
and returns a job id at once; a worker thread scores it with
OnnxTemporalModel and GET /jobs/{id} serves the verdict. No torch.
With TEMPORAL_API_URL set, the engine keeps the last 10 inference frames and boxes per camera pose, submits them when an alert becomes ongoing and reads the verdict on the next round. Negative verdicts resubmit the longer window; service errors fail open.
bullseye LTS ended in August 2026: its security repo now serves an expired release file and apt-get update fails in every build.
…ge, compose profile Per-frame size limit and pending-job cap on POST /jobs, service bound to 127.0.0.1 on the host network, image added to the build-and-push matrix so make run can pull it, and the service placed behind the temporal compose profile so disabled stacks do not start it.
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## develop #415 +/- ##
===========================================
+ Coverage 80.51% 82.85% +2.33%
===========================================
Files 6 7 +1
Lines 847 968 +121
===========================================
+ Hits 682 802 +120
- Misses 165 166 +1
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
MateoLostanlen
force-pushed
the
feat/temporal-validator
branch
from
September 12, 2026 10:43
0374031 to
a87b779
Compare
MateoLostanlen
force-pushed
the
feat/temporal-validator
branch
from
September 12, 2026 14:07
2026c1f to
ebcfe93
Compare
An event ending while the temporal job was pending was dropped by _end_event, so a positive verdict never uploaded the frames held during scoring. The state now survives until the verdict: positive stages the held frames, negative drops the event without resubmitting.
MateoLostanlen
force-pushed
the
feat/temporal-validator
branch
from
September 12, 2026 14:08
ebcfe93 to
131d4ec
Compare
# Conflicts: # pyro_camera_api/Dockerfile
This was referenced Oct 2, 2026
…split export Pins temporal-model-core to 7c1500e (feat/onnx-embedding-cache): the ONNX package is now backbone + head, the runtime embeds only real slots and keeps an LRU of per-slot embeddings keyed by (frame id, crop box). The engine resubmits the same window one frame longer each round, so a job now mostly pays the ViT for the new frame. The verdict reports embeddings_cached / embeddings_new; a fused (format 1) package still loads with a warning. README points at the model 0.6.0 release (pyro-dataset v4.7.0), to be re-exported with temporal-export-onnx for the split graphs.
- clear the job on every fail-open path so a lost job cannot keep an event alive - fail open when a job stays pending longer than temporal_job_timeout (120 s) - submit the engine's own prediction window (widened to 10 frames) instead of a second buffer - service: at most 10 frames per job, box and JPEG validation, duplicate frame ids rejected - service: /health is 503 when the worker died or is stuck, results published under the lock - 5 s client timeout, temporal API tests in CI and make test, make run-no-temporal
…hreshold Matches pyro-api PR 723 (temporal_model_scores on POST /detections): - the service verdict lists each scored tube with its union box and probability - the engine scores the window every round while an alert is ongoing, uploads the boxes covered by a tube above temporal_min_score (0.1) with that probability, drops the others - fail open (service down, lost or stuck job) sends the frames without scores so the API scores the sequence itself - pyroclient pinned to the PR 723 commit (repoint to main once merged), requirements regenerated with uv 0.13.4
…frames for good - a job remembers the frame ids it submitted; its verdict stages those frames only, frames captured afterwards wait for the next verdict - a verdict rejecting an ended event marks the held frames as consumed so a later event cannot upload them under its own score - window of 11 frames, all submitted (service MAX_FRAMES=11)
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
pyro_temporal_api, reads the verdict on the next round) and uploads each box with the probability of the tube covering it (temporal_model_scores, feat: accept the temporal score computed on the device pyro-api#723, which applies its own threshold instead of scoring the sequence). Boxes below 0.1 or outside every scored tube are dropped; only the frames a verdict scored are uploaded on it, and frames of an ended event the model rejected are dropped for good. A service error, a lost job or a job pending longer than 120 s fails open: the frames go out without scores and the API scores them itself. An event that ends while its job is still pending is kept until the verdict is in, so the last alert of an event is never dropped.model_onnx.zip), behind the compose profiletemporal. UnsetTEMPORAL_API_URLkeeps today's behaviour.make run-no-temporalstarts the stack without it whatever.envsays./healthreturns 503 when the scoring worker died or is stuck.model_onnx.zipmust be exported from the merged code: the graph now has a dynamic batch axis and older exports fail with more than one tube. A format 2 package (split backbone/head) lets the service cache ViT embeddings across jobs.make test.Tested on a Pi 5 by replaying 8 dataset sequences (5 smokes, 3 non-smoke) through the real engine and the service, one per camera pose, with the format 2 0.6.0 package. Every smoke was held one round and uploaded on the next after a positive verdict, the 3 non-smoke sequences never reached the gate, 0 errors. Scoring takes about 9 s per 10-frame job on 4 cores, the service uses about 530 MB of RSS and the host peaks at 2.4 GB of 4 GB with the engine running.