Why pixelate?
Pixelation reads as “a person, doing something” to a human reviewer — unlike stick figures which vanish on occlusion, low light or unusual poses. It also doesn’t need a pose model, cutting per-frame CPU cost by roughly 2× on edge devices. See the Privacy caveat below — pixelation is visual obscuring, not cryptographic de-identification.Pieces
| Layer | Component | Notes |
|---|---|---|
| Model | yolov8n (catalog) | Plain detector; no pose head. Auto-downloaded on first cw.models.load(). |
| Anonymisation | cyberwave.vision.anonymize_frame() | Pixelates each person’s bbox. Mode is configurable ("pixelate" / "redact" / "blur" / "bbox"). Skeleton overlay disabled. |
| Frame substitution | Frame substitution | Driver consults FILTERED_FRAME_CHANNEL (frames/filtered) before WebRTC encoding when CYBERWAVE_METADATA_FRAME_FILTER_ENABLED=true on the twin. |
| Routing | twin_uuid=ctx.twin_uuid on cw.data.publish() | Same worker, two independent streams. See Multi-Camera Detection Routing. |
Worker
The same gate is applied automatically to workers generated from an
anonymize workflow
node, so workflows authored in the visual editor get the same
privacy fail-closed behaviour without any code changes.Driver configuration
Enable the frame filter per camera twin (each generic-camera driver container):frames/filtered) and fail-closed blank fallback are hard-coded in the driver. Freshness is tunable per driver via CYBERWAVE_METADATA_FRAME_FILTER_FRESHNESS_MS — raise it (e.g. 400–500) for CPU-bound workers, at the cost of keeping visibly-stale anonymised frames on screen longer. 0 is a valid “force blank” fail-close test mode. To see the raw camera feed for debugging, set CYBERWAVE_METADATA_FRAME_FILTER_ENABLED=false and restart the driver.
Privacy boundary
The Zenoh→MQTT bridge does not forwardframes/* channels by default. Only events (person_too_close, …) and detections cross the WAN. The raw and anonymised frames stay on-device.
Per-zone alerting with Spatial Filter + Timed Condition
For deployments where the pixelation is just the privacy scaffold and the actual alert is “person loitering inside a restricted polygon”, combine this driver setup with a workflow that wiresspatial_filter and
timed_condition downstream of
call_model + anonymize. The polygon also renders as a read-only
overlay on the twin’s WebRTC stream so operators can see which zones
are armed without opening every workflow.
See the
Zone-based intrusion detection tutorial
for the full end-to-end recipe.
Reference implementation
- Worker:
cyberwave-sdks/cyberwave-python/examples/security_pipeline/ - End-to-end test:
cyberwave-edge-nodes/test_security_pipeline.sh