A two-camera privacy-preserving worker. YOLOv8 detects each person, the worker pixelates their bbox, and the driver substitutes the anonymised frame into the WebRTC stream before the bytes leave the edge.Documentation Index
Fetch the complete documentation index at: https://docs.cyberwave.com/llms.txt
Use this file to discover all available pages before exploring further.
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