All Studio apps
Vision & CCTV Edge

Demography

age · gender · emotion

Estimate age, gender and emotion per face — locally with InsightFace, or via an opt-in vision API with a monthly budget cap.

streamhub.studio/studio/demography

Interface preview coming soon

The problem

Understanding who is in front of a camera — rough age band, gender split, mood — usually means a paid cloud analytics contract. Demography does it on an open local model you own, at an interval you set, and only optionally routes snapshots to a vision API when you decide the cost is worth it.

Use cases

Retail

Audience mix

A rough age and gender breakdown of who passes a section or a display, sampled at an interval, to inform merchandising — without a per-face cloud fee.

Signage / Media

Anonymous engagement

Estimate the demographic and mood of viewers in front of a screen to measure engagement, with no identity stored — just aggregate age / gender / emotion.

Venues

Visitor profiling

Sample the crowd periodically for an aggregate profile of attendees over a day or an event.

How it works

Input

Live HLS + optional ROI

A worker samples the live stream over HLS at your configured interval. You can draw an optional region of interest on a live frame so only faces inside it are analysed.

Detect

InsightFace, or a vision API

By default InsightFace (buffalo_l) runs locally for age, gender and emotion. Switch the engine to OpenAI or DeepSeek to send snapshots to a vision API instead, guarded by a monthly budget cap that hard-stops over spend.

Signed callback

demography.face

Each face emits demography.face with age, age range, gender, emotion and the engine used, through the app's HMAC-signed callbacks (webhook + MQTT).

Your system

Overview + your workflow

Recent faces show in the app tab; every record persists in the app's own demography database for your aggregate reporting.

Events it emits

Declared in the plugin manifest and relayed through the app's HMAC-signed callbacks (webhook + MQTT). Anything a worker tries to emit that is not on this list is rejected — no core-event spoofing.

demography.face

Scope & limits

  • It estimates aggregate attributes per face — it is not identity recognition and stores no identity, only age / gender / emotion.
  • Estimates are approximate and degrade with distance, angle and lighting; treat them as aggregate signal, not per-person truth.
  • On an edge node the AI-API key is deliberately withheld from the assignment — API-engine demography stays a co-located concern; the local InsightFace engine distributes freely.

Minimum requirements

  • Local engine: the [demography] extra adds InsightFace + onnxruntime + the buffalo_l model (~300 MB); budget ~1.5 GB RAM per worker. Because it samples at an interval, CPU is viable.
  • AI-API engines (OpenAI / DeepSeek) need neither InsightFace nor a GPU — just the interval, a prompt and a monthly budget cap.
  • GPU optional for the local engine: any CUDA GPU speeds face analysis; the budget guard, not hardware, bounds AI-API cost.

Numbers are the plugin authors' honest measurements, not marketing. GPU is optional on every vision plugin except where noted.

Runs as a full app

Every Studio app is a first-class application, not a config modal — and it does not have to live inside StreamHub.

Full-page dashboard view

Opens as its own page inside the tenant app — zones, live panels, history and settings on one surface, not squeezed into a dialog.

Its own database

Keeps its state in a dedicated per-app SQLite database — reads, alerts, occupancy and evidence rows — that you own and can query.

Exportable bundle

Download the app as a self-contained bundle — worker, Dockerfile, compose and an env template — to self-host on your own infra and extend, talking back over the REST API and signed webhooks.

Have cameras or streams to put to work?

Tell us what you are monitoring and we will scope the right apps, wire them into your systems and run them with you. The software is open source — the deployment and operation is what we do.