Spaces:
Build error
Build error
Commit
·
9077361
1
Parent(s):
c2a7084
Implementar visualización en tiempo real de la detección de rostros dentro del componente JavaScript
Browse files- streamlit_app.py +46 -1
streamlit_app.py
CHANGED
|
@@ -14,6 +14,7 @@ from sklearn.metrics.pairwise import cosine_similarity # type: ignore
|
|
| 14 |
import pandas as pd
|
| 15 |
import av
|
| 16 |
from streamlit_webrtc import webrtc_streamer, VideoProcessorBase, RTCConfiguration, WebRtcMode
|
|
|
|
| 17 |
|
| 18 |
# Importar las utilidades para la base de datos de rostros
|
| 19 |
try:
|
|
@@ -2432,11 +2433,14 @@ def main():
|
|
| 2432 |
<div style="margin-bottom: 20px;">
|
| 2433 |
<video id="webcam" autoplay playsinline width="640" height="480" style="border-radius: 5px;"></video>
|
| 2434 |
<canvas id="canvas" width="640" height="480" style="display: none;"></canvas>
|
|
|
|
| 2435 |
</div>
|
| 2436 |
<script>
|
| 2437 |
const video = document.getElementById('webcam');
|
| 2438 |
const canvas = document.getElementById('canvas');
|
|
|
|
| 2439 |
const ctx = canvas.getContext('2d');
|
|
|
|
| 2440 |
let captureInterval;
|
| 2441 |
|
| 2442 |
// Configuración dinámica del FPS (desde Streamlit)
|
|
@@ -2473,6 +2477,9 @@ def main():
|
|
| 2473 |
// Dibujar el video en el canvas
|
| 2474 |
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
|
| 2475 |
|
|
|
|
|
|
|
|
|
|
| 2476 |
// Convertir a base64
|
| 2477 |
const imageData = canvas.toDataURL('image/jpeg', 0.8);
|
| 2478 |
|
|
@@ -2484,6 +2491,34 @@ def main():
|
|
| 2484 |
}
|
| 2485 |
}
|
| 2486 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2487 |
// Arrancar todo
|
| 2488 |
async function initCapture() {
|
| 2489 |
await setupCamera();
|
|
@@ -2537,12 +2572,22 @@ def main():
|
|
| 2537 |
# Calcular FPS real (actualizar cada segundo)
|
| 2538 |
current_time = time.time()
|
| 2539 |
elapsed = current_time - st.session_state.start_time
|
| 2540 |
-
|
| 2541 |
if current_time - st.session_state.last_fps_update >= 1.0:
|
| 2542 |
fps = st.session_state.frames_processed / elapsed
|
| 2543 |
fps_metric.metric("FPS", f"{fps:.1f}")
|
| 2544 |
st.session_state.last_fps_update = current_time
|
| 2545 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2546 |
# Dibujar resultados
|
| 2547 |
result_img = image.copy()
|
| 2548 |
for i, bbox in enumerate(bboxes):
|
|
|
|
| 14 |
import pandas as pd
|
| 15 |
import av
|
| 16 |
from streamlit_webrtc import webrtc_streamer, VideoProcessorBase, RTCConfiguration, WebRtcMode
|
| 17 |
+
import json
|
| 18 |
|
| 19 |
# Importar las utilidades para la base de datos de rostros
|
| 20 |
try:
|
|
|
|
| 2433 |
<div style="margin-bottom: 20px;">
|
| 2434 |
<video id="webcam" autoplay playsinline width="640" height="480" style="border-radius: 5px;"></video>
|
| 2435 |
<canvas id="canvas" width="640" height="480" style="display: none;"></canvas>
|
| 2436 |
+
<canvas id="display" width="640" height="480" style="border-radius: 5px; display: block; margin: 0 auto;"></canvas>
|
| 2437 |
</div>
|
| 2438 |
<script>
|
| 2439 |
const video = document.getElementById('webcam');
|
| 2440 |
const canvas = document.getElementById('canvas');
|
| 2441 |
+
const display = document.getElementById('display');
|
| 2442 |
const ctx = canvas.getContext('2d');
|
| 2443 |
+
const displayCtx = display.getContext('2d');
|
| 2444 |
let captureInterval;
|
| 2445 |
|
| 2446 |
// Configuración dinámica del FPS (desde Streamlit)
|
|
|
|
| 2477 |
// Dibujar el video en el canvas
|
| 2478 |
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
|
| 2479 |
|
| 2480 |
+
// Mostrar el video en el canvas de visualización
|
| 2481 |
+
displayCtx.drawImage(video, 0, 0, display.width, display.height);
|
| 2482 |
+
|
| 2483 |
// Convertir a base64
|
| 2484 |
const imageData = canvas.toDataURL('image/jpeg', 0.8);
|
| 2485 |
|
|
|
|
| 2491 |
}
|
| 2492 |
}
|
| 2493 |
|
| 2494 |
+
// Recibir datos de detección de rostros y dibujarlos
|
| 2495 |
+
window.addEventListener('message', function(event) {
|
| 2496 |
+
const message = event.data;
|
| 2497 |
+
|
| 2498 |
+
// Verificar si es un mensaje con cajas de rostros
|
| 2499 |
+
if (message && message.type === 'faceBoxes') {
|
| 2500 |
+
const boxes = message.boxes;
|
| 2501 |
+
|
| 2502 |
+
// Limpiar el canvas y dibujar el frame actual
|
| 2503 |
+
displayCtx.drawImage(video, 0, 0, display.width, display.height);
|
| 2504 |
+
|
| 2505 |
+
// Dibujar cada caja
|
| 2506 |
+
boxes.forEach(box => {
|
| 2507 |
+
const [x1, y1, x2, y2, confidence] = box;
|
| 2508 |
+
|
| 2509 |
+
// Dibujar rectángulo
|
| 2510 |
+
displayCtx.strokeStyle = '#00FF00';
|
| 2511 |
+
displayCtx.lineWidth = 2;
|
| 2512 |
+
displayCtx.strokeRect(x1, y1, x2-x1, y2-y1);
|
| 2513 |
+
|
| 2514 |
+
// Dibujar etiqueta
|
| 2515 |
+
displayCtx.fillStyle = '#00FF00';
|
| 2516 |
+
displayCtx.font = '16px Arial';
|
| 2517 |
+
displayCtx.fillText(`Rostro: ${confidence.toFixed(2)}`, x1, y1-5);
|
| 2518 |
+
});
|
| 2519 |
+
}
|
| 2520 |
+
});
|
| 2521 |
+
|
| 2522 |
// Arrancar todo
|
| 2523 |
async function initCapture() {
|
| 2524 |
await setupCamera();
|
|
|
|
| 2572 |
# Calcular FPS real (actualizar cada segundo)
|
| 2573 |
current_time = time.time()
|
| 2574 |
elapsed = current_time - st.session_state.start_time
|
|
|
|
| 2575 |
if current_time - st.session_state.last_fps_update >= 1.0:
|
| 2576 |
fps = st.session_state.frames_processed / elapsed
|
| 2577 |
fps_metric.metric("FPS", f"{fps:.1f}")
|
| 2578 |
st.session_state.last_fps_update = current_time
|
| 2579 |
|
| 2580 |
+
# Enviar las cajas detectadas al componente JavaScript para dibujarlas en tiempo real
|
| 2581 |
+
face_boxes_js = f"""
|
| 2582 |
+
<script>
|
| 2583 |
+
window.parent.postMessage({{
|
| 2584 |
+
type: 'faceBoxes',
|
| 2585 |
+
boxes: {json.dumps(bboxes.tolist() if isinstance(bboxes, np.ndarray) else bboxes)}
|
| 2586 |
+
}}, '*');
|
| 2587 |
+
</script>
|
| 2588 |
+
"""
|
| 2589 |
+
st.components.v1.html(face_boxes_js, height=0, width=0)
|
| 2590 |
+
|
| 2591 |
# Dibujar resultados
|
| 2592 |
result_img = image.copy()
|
| 2593 |
for i, bbox in enumerate(bboxes):
|