Spaces:
Build error
Build error
Commit
·
9abbee1
1
Parent(s):
1b820c5
Corregir duplicación de IDs en botones y añadir keys únicas
Browse files- streamlit_app.py +93 -90
streamlit_app.py
CHANGED
|
@@ -2307,23 +2307,101 @@ def main():
|
|
| 2307 |
fps_metric.metric("FPS", 0)
|
| 2308 |
time_metric.metric("Status", "Stopped")
|
| 2309 |
|
| 2310 |
-
st.info("
|
| 2311 |
-
st.warning("
|
| 2312 |
|
| 2313 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2314 |
st.markdown("---")
|
| 2315 |
-
st.markdown("###
|
|
|
|
| 2316 |
col1, col2 = st.columns(2)
|
| 2317 |
-
|
| 2318 |
-
|
| 2319 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2320 |
if demo_mode:
|
| 2321 |
st.session_state.demo_running = True
|
| 2322 |
st.session_state.upload_mode = False
|
|
|
|
| 2323 |
elif upload_mode:
|
| 2324 |
st.session_state.upload_mode = True
|
| 2325 |
st.session_state.demo_running = False
|
| 2326 |
-
|
|
|
|
| 2327 |
# Modo de demostración con imágenes simuladas
|
| 2328 |
if st.session_state.get('demo_running', False):
|
| 2329 |
# Cargar algunas imágenes de ejemplo (usar tus propias imágenes si es posible)
|
|
@@ -2357,10 +2435,10 @@ def main():
|
|
| 2357 |
time_metric.metric("Status", "Demo")
|
| 2358 |
|
| 2359 |
st.success("Modo de demostración activado. En un entorno local, el reconocimiento facial en tiempo real funcionaría correctamente.")
|
| 2360 |
-
|
| 2361 |
# Modo de carga de imagen
|
| 2362 |
if st.session_state.get('upload_mode', False):
|
| 2363 |
-
uploaded_file = st.file_uploader("Sube una imagen con rostros", type=["jpg", "jpeg", "png"])
|
| 2364 |
|
| 2365 |
if uploaded_file is not None:
|
| 2366 |
# Leer imagen
|
|
@@ -2368,8 +2446,7 @@ def main():
|
|
| 2368 |
image = cv2.imdecode(np.frombuffer(image_bytes, np.uint8), cv2.IMREAD_COLOR)
|
| 2369 |
|
| 2370 |
# Detectar rostros
|
| 2371 |
-
|
| 2372 |
-
_, bboxes = process_face_detections(image, detections, confidence_threshold)
|
| 2373 |
|
| 2374 |
# Dibujar rostros detectados
|
| 2375 |
result_img = image.copy()
|
|
@@ -2385,84 +2462,10 @@ def main():
|
|
| 2385 |
# Actualizar métricas
|
| 2386 |
faces_metric.metric("Faces detected", len(bboxes))
|
| 2387 |
time_metric.metric("Status", "Processed")
|
| 2388 |
-
|
| 2389 |
-
|
| 2390 |
-
|
| 2391 |
-
|
| 2392 |
-
|
| 2393 |
-
# Añadir opción de cámara alternativa para entornos donde WebRTC no funciona bien
|
| 2394 |
-
st.markdown("---")
|
| 2395 |
-
st.markdown("### Modo de cámara alternativo")
|
| 2396 |
-
|
| 2397 |
-
col1, col2 = st.columns(2)
|
| 2398 |
-
if col1.button("Usar cámara simple"):
|
| 2399 |
-
st.session_state.simple_camera = True
|
| 2400 |
-
st.session_state.demo_running = False
|
| 2401 |
-
st.session_state.upload_mode = False
|
| 2402 |
-
|
| 2403 |
-
if col2.button("Detener cámara simple"):
|
| 2404 |
-
st.session_state.simple_camera = False
|
| 2405 |
-
|
| 2406 |
-
if st.session_state.get('simple_camera', False):
|
| 2407 |
-
# Contenedor para la cámara
|
| 2408 |
-
camera_container = st.container()
|
| 2409 |
-
|
| 2410 |
-
# Configurar métricas
|
| 2411 |
-
faces_metric.metric("Faces detected", 0)
|
| 2412 |
-
fps_metric.metric("FPS", "0.0")
|
| 2413 |
-
time_metric.metric("Status", "Running")
|
| 2414 |
-
|
| 2415 |
-
# Cámara simple que toma una imagen a la vez
|
| 2416 |
-
with camera_container:
|
| 2417 |
-
st.info("Cámara simple activada. Cada imagen se procesa individualmente.")
|
| 2418 |
-
|
| 2419 |
-
# Usar imagen de la cámara
|
| 2420 |
-
captured_image = st.camera_input("Tomar foto para reconocimiento", key="camera_simple")
|
| 2421 |
-
|
| 2422 |
-
# Procesar la imagen si está disponible
|
| 2423 |
-
if captured_image is not None:
|
| 2424 |
-
# Leer imagen
|
| 2425 |
-
image_bytes = captured_image.getvalue()
|
| 2426 |
-
image = cv2.imdecode(np.frombuffer(image_bytes, np.uint8), cv2.IMREAD_COLOR)
|
| 2427 |
-
|
| 2428 |
-
# Detectar rostros
|
| 2429 |
-
bboxes = detect_face_dnn(face_net, image, confidence_threshold)
|
| 2430 |
-
|
| 2431 |
-
# Actualizar métricas
|
| 2432 |
-
faces_metric.metric("Faces detected", len(bboxes))
|
| 2433 |
-
fps_metric.metric("FPS", "N/A")
|
| 2434 |
-
|
| 2435 |
-
# Dibujar resultados
|
| 2436 |
-
result_img = image.copy()
|
| 2437 |
-
for i, bbox in enumerate(bboxes):
|
| 2438 |
-
x1, y1, x2, y2, _ = bbox
|
| 2439 |
-
cv2.rectangle(result_img, (x1, y1), (x2, y2), (0, 255, 0), 2)
|
| 2440 |
-
cv2.putText(result_img, f"Face {i+1}", (x1, y1-10),
|
| 2441 |
-
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
|
| 2442 |
-
|
| 2443 |
-
# Mostrar resultado
|
| 2444 |
-
st.image(result_img, channels="BGR", caption="Rostros detectados", use_column_width=True)
|
| 2445 |
-
|
| 2446 |
-
if len(bboxes) > 0:
|
| 2447 |
-
st.success(f"Se detectaron {len(bboxes)} rostros")
|
| 2448 |
-
else:
|
| 2449 |
-
st.warning("No se detectaron rostros. Intente con una iluminación mejor o una posición diferente.")
|
| 2450 |
-
|
| 2451 |
-
# Opción alternativa en caso de problemas con WebRTC (mantenemos esta opción también)
|
| 2452 |
-
st.markdown("---")
|
| 2453 |
-
st.markdown("### Otras opciones")
|
| 2454 |
-
col1, col2 = st.columns(2)
|
| 2455 |
-
demo_mode = col1.button("Usar modo de demostración")
|
| 2456 |
-
upload_mode = col2.button("Subir imagen para reconocimiento")
|
| 2457 |
-
|
| 2458 |
-
if demo_mode:
|
| 2459 |
-
st.session_state.demo_running = True
|
| 2460 |
-
st.session_state.upload_mode = False
|
| 2461 |
-
st.session_state.simple_camera = False
|
| 2462 |
-
elif upload_mode:
|
| 2463 |
-
st.session_state.upload_mode = True
|
| 2464 |
-
st.session_state.demo_running = False
|
| 2465 |
-
st.session_state.simple_camera = False
|
| 2466 |
|
| 2467 |
# Si se ejecuta este archivo directamente, llamar a la función main
|
| 2468 |
if __name__ == "__main__":
|
|
|
|
| 2307 |
fps_metric.metric("FPS", 0)
|
| 2308 |
time_metric.metric("Status", "Stopped")
|
| 2309 |
|
| 2310 |
+
st.info("Haga clic en el botón 'START' para activar la cámara y comenzar el reconocimiento en tiempo real.")
|
| 2311 |
+
st.warning("Nota: Si está ejecutando esto en Hugging Face Spaces, puede que WebRTC no funcione correctamente. Utilice las opciones alternativas a continuación.")
|
| 2312 |
|
| 2313 |
+
# WebRTC troubleshooting
|
| 2314 |
+
with st.expander("Ayuda: Problemas con WebRTC"):
|
| 2315 |
+
st.markdown("""
|
| 2316 |
+
### Solución de problemas con WebRTC
|
| 2317 |
+
|
| 2318 |
+
Si el reconocimiento en tiempo real no funciona, puede deberse a las siguientes razones:
|
| 2319 |
+
|
| 2320 |
+
1. **Restricciones de seguridad en Hugging Face Spaces**: Algunos navegadores restringen el acceso a la cámara en entornos como este.
|
| 2321 |
+
2. **Problemas de conexión**: WebRTC requiere establecer una conexión que puede ser bloqueada por firewalls o proxies.
|
| 2322 |
+
3. **Permisos de cámara**: Es posible que deba conceder permisos explícitos al navegador para acceder a su cámara.
|
| 2323 |
+
|
| 2324 |
+
### Qué hacer:
|
| 2325 |
+
|
| 2326 |
+
1. Intente usar otro navegador (Chrome suele funcionar mejor)
|
| 2327 |
+
2. Asegúrese de que ha concedido permisos de cámara cuando el navegador los solicita
|
| 2328 |
+
3. Si sigue sin funcionar, use las opciones alternativas que se muestran a continuación
|
| 2329 |
+
""")
|
| 2330 |
+
|
| 2331 |
+
# Añadir opción de cámara alternativa para entornos donde WebRTC no funciona bien
|
| 2332 |
st.markdown("---")
|
| 2333 |
+
st.markdown("### Modo de cámara alternativo")
|
| 2334 |
+
|
| 2335 |
col1, col2 = st.columns(2)
|
| 2336 |
+
if col1.button("Usar cámara simple", key="simple_camera_button1"):
|
| 2337 |
+
st.session_state.simple_camera = True
|
| 2338 |
+
st.session_state.demo_running = False
|
| 2339 |
+
st.session_state.upload_mode = False
|
| 2340 |
+
|
| 2341 |
+
if col2.button("Detener cámara simple", key="stop_camera_button1"):
|
| 2342 |
+
st.session_state.simple_camera = False
|
| 2343 |
+
|
| 2344 |
+
if st.session_state.get('simple_camera', False):
|
| 2345 |
+
# Contenedor para la cámara
|
| 2346 |
+
camera_container = st.container()
|
| 2347 |
+
|
| 2348 |
+
# Configurar métricas
|
| 2349 |
+
faces_metric.metric("Faces detected", 0)
|
| 2350 |
+
fps_metric.metric("FPS", "0.0")
|
| 2351 |
+
time_metric.metric("Status", "Running")
|
| 2352 |
+
|
| 2353 |
+
# Cámara simple que toma una imagen a la vez
|
| 2354 |
+
with camera_container:
|
| 2355 |
+
st.info("Cámara simple activada. Cada imagen se procesa individualmente.")
|
| 2356 |
+
|
| 2357 |
+
# Usar imagen de la cámara
|
| 2358 |
+
captured_image = st.camera_input("Tomar foto para reconocimiento", key="camera_simple_input")
|
| 2359 |
+
|
| 2360 |
+
# Procesar la imagen si está disponible
|
| 2361 |
+
if captured_image is not None:
|
| 2362 |
+
# Leer imagen
|
| 2363 |
+
image_bytes = captured_image.getvalue()
|
| 2364 |
+
image = cv2.imdecode(np.frombuffer(image_bytes, np.uint8), cv2.IMREAD_COLOR)
|
| 2365 |
+
|
| 2366 |
+
# Detectar rostros
|
| 2367 |
+
bboxes = detect_face_dnn(face_net, image, confidence_threshold)
|
| 2368 |
+
|
| 2369 |
+
# Actualizar métricas
|
| 2370 |
+
faces_metric.metric("Faces detected", len(bboxes))
|
| 2371 |
+
fps_metric.metric("FPS", "N/A")
|
| 2372 |
+
|
| 2373 |
+
# Dibujar resultados
|
| 2374 |
+
result_img = image.copy()
|
| 2375 |
+
for i, bbox in enumerate(bboxes):
|
| 2376 |
+
x1, y1, x2, y2, _ = bbox
|
| 2377 |
+
cv2.rectangle(result_img, (x1, y1), (x2, y2), (0, 255, 0), 2)
|
| 2378 |
+
cv2.putText(result_img, f"Face {i+1}", (x1, y1-10),
|
| 2379 |
+
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
|
| 2380 |
+
|
| 2381 |
+
# Mostrar resultado
|
| 2382 |
+
st.image(result_img, channels="BGR", caption="Rostros detectados", use_column_width=True)
|
| 2383 |
+
|
| 2384 |
+
if len(bboxes) > 0:
|
| 2385 |
+
st.success(f"Se detectaron {len(bboxes)} rostros")
|
| 2386 |
+
else:
|
| 2387 |
+
st.warning("No se detectaron rostros. Intente con una iluminación mejor o una posición diferente.")
|
| 2388 |
+
|
| 2389 |
+
# Opción alternativa en caso de problemas con WebRTC (mantenemos esta opción también)
|
| 2390 |
+
st.markdown("---")
|
| 2391 |
+
st.markdown("### Otras opciones")
|
| 2392 |
+
col1, col2 = st.columns(2)
|
| 2393 |
+
demo_mode = col1.button("Usar modo de demostración", key="demo_button1")
|
| 2394 |
+
upload_mode = col2.button("Subir imagen para reconocimiento", key="upload_button1")
|
| 2395 |
+
|
| 2396 |
if demo_mode:
|
| 2397 |
st.session_state.demo_running = True
|
| 2398 |
st.session_state.upload_mode = False
|
| 2399 |
+
st.session_state.simple_camera = False
|
| 2400 |
elif upload_mode:
|
| 2401 |
st.session_state.upload_mode = True
|
| 2402 |
st.session_state.demo_running = False
|
| 2403 |
+
st.session_state.simple_camera = False
|
| 2404 |
+
|
| 2405 |
# Modo de demostración con imágenes simuladas
|
| 2406 |
if st.session_state.get('demo_running', False):
|
| 2407 |
# Cargar algunas imágenes de ejemplo (usar tus propias imágenes si es posible)
|
|
|
|
| 2435 |
time_metric.metric("Status", "Demo")
|
| 2436 |
|
| 2437 |
st.success("Modo de demostración activado. En un entorno local, el reconocimiento facial en tiempo real funcionaría correctamente.")
|
| 2438 |
+
|
| 2439 |
# Modo de carga de imagen
|
| 2440 |
if st.session_state.get('upload_mode', False):
|
| 2441 |
+
uploaded_file = st.file_uploader("Sube una imagen con rostros", type=["jpg", "jpeg", "png"], key="upload_image_input")
|
| 2442 |
|
| 2443 |
if uploaded_file is not None:
|
| 2444 |
# Leer imagen
|
|
|
|
| 2446 |
image = cv2.imdecode(np.frombuffer(image_bytes, np.uint8), cv2.IMREAD_COLOR)
|
| 2447 |
|
| 2448 |
# Detectar rostros
|
| 2449 |
+
bboxes = detect_face_dnn(face_net, image, confidence_threshold)
|
|
|
|
| 2450 |
|
| 2451 |
# Dibujar rostros detectados
|
| 2452 |
result_img = image.copy()
|
|
|
|
| 2462 |
# Actualizar métricas
|
| 2463 |
faces_metric.metric("Faces detected", len(bboxes))
|
| 2464 |
time_metric.metric("Status", "Processed")
|
| 2465 |
+
|
| 2466 |
+
# Add a note about privacy
|
| 2467 |
+
st.markdown("---")
|
| 2468 |
+
st.markdown("**Privacy Note**: Video is processed in your browser and on the server. No video data is stored permanently.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2469 |
|
| 2470 |
# Si se ejecuta este archivo directamente, llamar a la función main
|
| 2471 |
if __name__ == "__main__":
|