Pabloler21 Claude Opus 5.5 commited on
Commit
e575738
·
1 Parent(s): ea02b78

Limitar el video subido a 1 GB (OWASP LLM06)

Browse files

El 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>

Files changed (2) hide show
  1. camguard/config.py +25 -0
  2. 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)