Spaces:
Sleeping
Sleeping
Commit ·
e575738
1
Parent(s): ea02b78
Limitar el video subido a 1 GB (OWASP LLM06)
Browse filesEl análisis usa como máximo 60 s, pero el archivo se copiaba y
decodificaba entero sin importar su tamaño. Gradio rechaza los más
grandes con HTTP 413 (MAX_UPLOAD en config).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- camguard/config.py +25 -0
- camguard/ui.py +2 -2
camguard/config.py
CHANGED
|
@@ -7,3 +7,28 @@ from pathlib import Path
|
|
| 7 |
# vacía cada vez que arranca y Gradio borra sus copias a la hora (ver ui.main).
|
| 8 |
TEMP_DIR = Path(tempfile.gettempdir()) / "camguard"
|
| 9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
# vacía cada vez que arranca y Gradio borra sus copias a la hora (ver ui.main).
|
| 8 |
TEMP_DIR = Path(tempfile.gettempdir()) / "camguard"
|
| 9 |
|
| 10 |
+
# Tamaño máximo del video que se puede subir. El análisis solo usa MAX_SECONDS, pero el archivo
|
| 11 |
+
# se copia y se decodifica entero.
|
| 12 |
+
MAX_UPLOAD = "1gb"
|
| 13 |
+
|
| 14 |
+
# Cuadros analizados por segundo. Una persona caminando no cruza una zona en menos de 0,2 s,
|
| 15 |
+
# así que alcanza y es 5-6 veces más rápido que analizar los 25-30 cuadros del video.
|
| 16 |
+
# ponytail: CPU-only (~0.5 s/cuadro en 1080p); si es lento, exportar RF-DETR a ONNX +
|
| 17 |
+
# onnxruntime-directml para usar la GPU AMD.
|
| 18 |
+
FPS = 5
|
| 19 |
+
|
| 20 |
+
# Segundos de video que se analizan como máximo, para que en CPU no tarde una eternidad.
|
| 21 |
+
MAX_SECONDS = 60
|
| 22 |
+
|
| 23 |
+
# Confianza mínima para contar una detección. Más bajo aparecen "personas" falsas;
|
| 24 |
+
# más alto se pierden las que están lejos. Con cámaras altas el modelo da confianzas bajas
|
| 25 |
+
# incluso a personas claras: en el video de ejemplo, 0.4 detectaba al 70% de la gente dentro
|
| 26 |
+
# de la zona y 0.25 al 96%, sin sumar falsos (medido contra RF-DETR Large como referencia).
|
| 27 |
+
CONF = 0.25
|
| 28 |
+
|
| 29 |
+
# Si alguien "desaparece" de la zona menos que esto (el detector lo pierde un cuadro, alguien
|
| 30 |
+
# le pasa por delante), sigue siendo el mismo evento en vez de partirse en varios.
|
| 31 |
+
MAX_GAP_S = 1.0
|
| 32 |
+
|
| 33 |
+
# Id de "person" entre las 80 clases COCO que reconoce RF-DETR.
|
| 34 |
+
PERSON_ID = 1
|
camguard/ui.py
CHANGED
|
@@ -9,7 +9,7 @@ import shutil
|
|
| 9 |
import gradio as gr
|
| 10 |
import numpy as np
|
| 11 |
|
| 12 |
-
from camguard.config import FPS, MAX_SECONDS, TEMP_DIR
|
| 13 |
from camguard.detection import load_model
|
| 14 |
from camguard.pipeline import analyze
|
| 15 |
from camguard.video import first_frame
|
|
@@ -157,4 +157,4 @@ def main() -> None:
|
|
| 157 |
# ponytail: los videos de la última sesión quedan en disco hasta el próximo arranque.
|
| 158 |
shutil.rmtree(TEMP_DIR, ignore_errors=True)
|
| 159 |
load_model() # al arrancar, para que el primer análisis no espere la carga
|
| 160 |
-
build_demo().launch(inbrowser=True)
|
|
|
|
| 9 |
import gradio as gr
|
| 10 |
import numpy as np
|
| 11 |
|
| 12 |
+
from camguard.config import FPS, MAX_SECONDS, MAX_UPLOAD, TEMP_DIR
|
| 13 |
from camguard.detection import load_model
|
| 14 |
from camguard.pipeline import analyze
|
| 15 |
from camguard.video import first_frame
|
|
|
|
| 157 |
# ponytail: los videos de la última sesión quedan en disco hasta el próximo arranque.
|
| 158 |
shutil.rmtree(TEMP_DIR, ignore_errors=True)
|
| 159 |
load_model() # al arrancar, para que el primer análisis no espere la carga
|
| 160 |
+
build_demo().launch(inbrowser=True, max_file_size=MAX_UPLOAD)
|