Difuminado de rostros en pantalla con el plugin Deface
Un plugin de privacidad: un worker Python detecta rostros con CenterFace y el overlay del reproductor los difumina, mosaica o enmascara del lado cliente. Leé la advertencia de privacidad antes de confiar en él.
Privacidad en la capa de presentación
El plugin Deface difumina rostros en el reproductor. Un worker Python corre CenterFace sobre el stream HLS en vivo de la app, transmite cajas de rostro normalizadas al canal de datos en vivo del plugin, y el overlay del reproductor ofusca cada región del lado cliente — difuminado, mosaico o una máscara sólida.
Está modelado sobre el open-source ORB-HD/deface, adaptado al framework de workers de StreamHub para que el ciclo de vida del proceso lo gestione el sistema por vos.
Leé esta advertencia primero
Deface anonimiza solo el reproductor. Las máscaras las dibuja el navegador del espectador encima del elemento de video, lo que significa:
- el stream crudo (WebRTC, segmentos HLS, restreams RTMP) todavía contiene los rostros;
- las grabaciones, VODs y capturas todavía contienen los rostros — el pipeline de grabación queda intacto;
- un espectador con DevTools puede quitar el overlay.
Tratalo como una función de privacidad de la capa de presentación — pantallas de kiosco, embeds públicos, pantallas de demo — no como anonimización del medio en sí. El grabado (burn-in) de las máscaras del lado servidor no está implementado.
Instalar y configurar
curl -X POST $BASE/apps/live/plugins/deface/install \
-H "Authorization: Bearer $TOKEN"
curl -X PATCH $BASE/apps/live/plugins/deface \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"enabled": true, "config": {"room": "lobby", "replacewith": "blur"}}'
room es el único campo requerido. Perillas útiles de config:
replacewith—blur|mosaic|solid|none(solo detectar).thresh— umbral de detección (default0.2).maskScale— agrandar las cajas para cubrir pelo/mentón (default1.3).fps— cuadros muestreados por segundo (default2).boxes— rectángulos en lugar de las elipses por defecto.
Por qué no parpadea
El worker hace POST en cada cuadro muestreado — una lista de rostros vacía limpia activamente las máscaras. Es deliberado: una máscara vieja que persiste es un bug de render, mientras que una máscara faltante es un bug de privacidad. El overlay mapea las cajas normalizadas de CenterFace sobre el elemento de video real (contemplando letterbox/pillarbox), y aplica debounce a los payloads vacíos antes de limpiar, así una detección inestable en una escena estática no titila.
La CPU suele alcanzar
CenterFace es mucho más liviano que YOLO. Mantené fps bajo (1–4) y reducí la escala de fuentes HD con scale alrededor de 640x360, y la CPU maneja la mayoría de las salas cómodamente. CUDA solo rinde por encima de ~10fps o con muchas salas simultáneas, y el worker nunca entra en crash-loop por una GPU ausente — cae a CPU con una nota en el log. El modelo de ~7MB se descarga en la primera corrida y se comparte entre apps.