Spaces:
Sleeping
A newer version of the Gradio SDK is available: 6.15.2
title: Bat Tracker
emoji: 🦇
colorFrom: yellow
colorTo: gray
sdk: gradio
app_file: app.py
pinned: false
bat_tracker
Proyecto Python para Linux orientado a CPU (con opcion CUDA cuando esta disponible) que procesa videos IR monocromos de cueva y genera:
background.png: fondo por mediana temporalvalid_region/: mascara vertical de zona valida estimada por perfil de iluminacion o profundidadtracks.csv: trayectorias 2D por objetotrack_candidates.csv: evaluacion de todos los tracks candidatos con score y motivos de rechazoevents.csv: resumen por track con direccion, duracion, desplazamiento y estadisticastracks.svg: artefacto vectorial autocontenido con las trayectorias 2D en coordenadas originalestracks_render.json: geometria normalizada por track para consumo externotracks_overlay.png: trayectorias sobre el fondometa.json: parametros y metricas de ejecucion
No genera video anotado y no usa modelos entrenados.
Instalacion
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Opcionalmente, instalacion como paquete:
pip install -e .
Uso
bat-tracker --input /path/video.mp4 --output /path/out_dir --config /path/config.yaml
O sin --config para usar defaults.
Tambien puede ejecutarse sin instalar entrypoint:
python -m bat_tracker --input /path/video.mp4 --output /path/out_dir --config /path/config.yaml
Generacion standalone de mascara vertical valida:
bat-valid-region \
--input /path/out_dir/background.png \
--output /path/out_dir/valid_region \
--blur-kernel-size 151 \
--threshold-ratio 0.45 \
--safety-margin 10
Alternativamente:
python -m bat_tracker.valid_region --input /path/out_dir/background.png --output /path/out_dir/valid_region
Ejemplo de Resultados
El pipeline genera visualizaciones de depuración y tracking como:
valid_region/overlay.png: máscara de zona válida superpuesta sobre el fondo.tracks_overlay.png: trayectorias 2D sobre el fondo calculado.
Entradas
--input(obligatorio): ruta a video IR monocromo, por ejemplo.mp4.--output(obligatorio): carpeta de salida donde se escriben resultados.--config(opcional): YAML con parametros; si no se pasa, usa defaults internos.
Ejemplos de configuracion incluidos:
config.yaml.example(base)config.out3_clean.yaml(perfil limpio para escenas tipo out3 con menos ruido)
Salidas
Se escriben en la carpeta indicada por --output:
background.png: fondo estimado por mediana temporal.valid_region/mask.png: mascara binaria vertical (255 zona valida, 0 laterales invalidos).valid_region/overlay.png: debug visual de banda valida sobre la imagen.valid_region/gate_overlay.png: debug visual del gate real usado en tracking tras aplicarvalid_region_gate_dilate_px.valid_region/profile.png: debug de region valida (perfil horizontal en modohorizontal_illumination_profile; mapa de profundidad en modoscentral_deep_layer/hybrid_deep_layer_profile).tracks.csv: trayectorias 2D por deteccion y frame.track_candidates.csv: auditoria opcional de todos los tracks candidatos tras merge, conaccepted,scoreyreject_reasons.events.csv: resumen por track con inicio/fin, duracion, desplazamiento, recorrido, straightness y direccion.tracks.svg: export vectorial autocontenido de todas las trayectorias en el sistema de coordenadas original del video, con el mismo color portrack_idy las mismas etiquetas opcionales quetracks_overlay.png.tracks_render.json: export JSON conwidth,height, puntos por track y metadatos minimos (track_id,frame_start,frame_end,duration_sec,direction,point_start,point_end).directionusa el vocabularioentry,exit,inside,outside,unknown.
tracks_overlay.png: trayectorias dibujadas sobrebackground.png.tracks_overlay_raw.pngytracks_overlay_smoothed.png(opcionales): overlays adicionales cuandooutput.trajectory_smoothing_enabledesta activo.track_clips/(opcional): clips de video por track (track_0001_000120-000186.mp4, etc.).meta.json: metadatos del video, parametros efectivos y metricas de ejecucion.- incluye bloques
video,parameters,background,valid_region,metrics,execution,performance,outputs,trajectory_smoothingypostprocess. postprocessresume tambien cuantos candidatos se aceptaron/rechazaron y las causas mas frecuentes.
- incluye bloques
Formato de tracks.csv
Columnas exactas:
video_id,track_id,frame,time_sec,x,y,vx,vy,bbox_x1,bbox_y1,bbox_x2,bbox_y2,area
Formato de events.csv
Columnas exactas:
video_id,track_id,time_start_sec,time_end_sec,duration_sec,frame_start,frame_end,num_detections,x_start,y_start,x_end,y_end,displacement_px,path_length_px,straightness,mean_speed_px_sec,mean_area,start_in_valid_region,end_in_valid_region,direction
direction usa el vocabulario entry, exit, inside, outside, unknown.
Pipeline implementado
- Lectura del video y metadatos.
- Generacion de
background.pngpor mediana temporal de un muestreo de frames. - Deteccion de foreground por diferencia absoluta con el fondo.
- Umbral binario (fijo u Otsu) + morfologia (open/close) + contornos.
- Filtrado de blobs por area minima/maxima.
- Tracking 2D frame a frame con asignacion greedy por distancia maxima y prediccion por velocidad para reducir cortes.
- Merge automatico opcional de tracks fragmentados antes del filtrado final.
- Evaluacion centralizada de tracks candidatos (score + motivos de rechazo) y export de
tracks.csv,events.csv,tracks.svg,tracks_render.jsony render finaltracks_overlay.png. - Si
valid_region.enabled, calculo de banda vertical valida desde iluminacion horizontal y guardado envalid_region/*. - Export de
meta.jsoncon parametros, metadatos y metricas.
- incluye
postprocess.auto_merges_appliedcuandotracking.auto_merge_suggestedesta activo. - incluye
trajectory_smoothing.enabled/windowy rutas extra de overlay cuando el suavizado esta activado.
Configuracion
Usa config.yaml.example como base.
background.sample_frames: numero de frames para mediana temporalbackground.uniform_sampling: muestreo uniforme en todo el videobackground.input_image: si se define, reutiliza un fondo precomputado y omite la mediana temporalbackground.context_start_sec: segundo inicial de la ventana usada para estimarbackground.pngbackground.context_duration_sec: duracion de esa ventana;-1usa el video enterodetection.*: parametros de blur, threshold, morfologia y areadetection.threshold_mode:fixedootsudetection.otsu_offset: ajuste fino sobre umbral Otsu (negativo = mas sensible)detection.max_global_intensity_shift: descarta frame si el brillo medio difiere demasiado del fondo (-1desactiva)detection.max_foreground_ratio: descarta frame si el porcentaje de foreground es demasiado alto (-1desactiva)detection.max_detections_per_frame: descarta frame si supera este numero de blobs (0desactiva)detection.roi_x_min/roi_x_max/roi_y_min/roi_y_max: limita detecciones a una ROI por centroide (-1desactiva cada limite)detection.temporal_burst_*: gate temporal por rafagas de detecciones (desactiva con0)temporal_burst_min_detections: umbral de detecciones altas por frametemporal_burst_window_frames: tamano de ventana temporaltemporal_burst_trigger_frames: frames altos dentro de ventana para activar suppressiontemporal_burst_cooldown_frames: frames suprimidos tras activacion
tracking.*: distancia maxima de asociacion, tolerancia a frames perdidos y filtros minimos por trayectoriatracking.min_track_length: minimo de puntos por trayectoriatracking.min_track_duration_sec: duracion minima en segundos (si se define, se combina conmin_track_length)tracking.min_track_displacement: desplazamiento neto minimo (pixeles)tracking.min_track_path_length: recorrido acumulado minimo (pixeles)tracking.min_track_straightness: rectitud minimadesplazamiento/recorrido(0..1)tracking.require_start_or_end_in_valid_region: conserva solo tracks que empiezan o acaban dentro de la mascara validatracking.valid_region_gate_dilate_px: dilata la mascara valida en pixeles antes de aplicar el filtro inicio/fintracking.auto_merge_suggested: fusion automatica postproceso de tracks potencialmente duplicadostracking.export_track_candidates: escribetrack_candidates.csvcon todos los tracks evaluados, incluidos los rechazadostracking.merge_max_gap_framesytracking.merge_max_endpoint_distance: merge por handoff cercano (fin->inicio)tracking.merge_overlap_min_common_frames: minimo de frames comunes para evaluar merge por solapetracking.merge_overlap_max_mean_distance: distancia media maxima en frames comunestracking.merge_overlap_min_direction_cosine: coherencia minima de direccion entre tracks solapados
valid_region.*: mascara vertical valida para eliminar vignette lateral IR sin recortar interior oscuro de cuevavalid_region.enabled: activa/desactiva etapavalid_region.method:horizontal_illumination_profile(default),central_deep_layerohybrid_deep_layer_profile(perfil primero y profundidad despues, sin laterales)valid_region.apply_to_detection: aplica mascara en deteccion por frame (si no, se usa solo para filtros de track)valid_region.hybrid_combine_mode:and/orpara combinar capa de profundidad + umbral por perfilvalid_region.input_image: si se define, usa esta imagen en vez debackground.pngvalid_region.input_mask: si se define, reutiliza exactamente esta mascara y omite su estimacionvalid_region.context_start_secyvalid_region.context_duration_sec: permiten estimar la mascara con una ventana temporal distinta a la del fondo de deteccionvalid_region.blur_kernel_sizeyvalid_region.profile_smooth_window: deben ser imparesvalid_region.threshold_ratio: fraccion del pico del perfil para definir region validavalid_region.safety_margin: recorte adicional en pixeles por ladovalid_region.min_region_width_ratio: evita regiones absurdamente estrechasvalid_region.depth_percentile/depth_morph_kernel/depth_min_area_ratio: parametros del modocentral_deep_layervalid_region.depth_layer_percentiles+valid_region.depth_layer_dilate_px: expansion no uniforme por capas de profundidad (listas emparejadas)valid_region.bottom_contour_*: refinado opcional del borde inferior ajustandolo al gradiente vertical de profundidad (*_search_*define ventana de busqueda,*_smooth_windowsuaviza la curva,*_gradient_quantilecontrola sensibilidad,*_regularization/*_max_step_pxreducen muescas,*_downward_biaspermite bajar cuando hay empate,*_regularization_mixmezcla ajuste local/global,*_deepest_strong_ratiofavorece el borde fuerte mas profundo frente a crestas intermedias)
output.*: estilo del overlay y artefactos de salidaoutput.overlay_line_thickness: grosor de linea entracks_overlay.pngytracks.svgoutput.overlay_start_radius: radio del marcador del primer punto del trackoutput.overlay_alpha: alpha del overlay rastertracks_overlay.pngoutput.overlay_draw_track_labels: dibuja el numero detrack_idjunto al inicio de cada track entracks_overlay.pngytracks.svgoutput.overlay_draw_track_labels_at_end: dibuja el numero detrack_idal final del track entracks_overlay.pngytracks.svgoutput.overlay_label_font_scaleyoutput.overlay_label_thickness: estilo de etiqueta compartido portracks_overlay.pngytracks.svgoutput.progress_enabled: muestra trazas de avance global por consola durante todo el pipeline (etapas + frames)output.progress_step_percent: porcentaje global entre trazas (1..100, por defecto5)output.export_track_clips: exporta clips por track en una carpetaoutput.track_clips_subdir: nombre de la carpeta de clips dentro del outputoutput.track_clips_padding_frames: frames extra antes/despues del rango del trackoutput.trajectory_smoothing_enabled: genera una version suavizada de las trayectorias para overlays yevents.csvoutput.trajectory_smoothing_window: ventana impar >= 3 usada en el suavizado
execution.*: seleccion de backend de computoexecution.device:auto(default),cpuocudaexecution.strict_parity: cuando esta entrue, compara mascara CPU/GPU y conserva la salida CPU para mantener resultados equivalentes al pipeline original- etapa extra GPU: el calculo de
background.pngpor mediana usa CuPy si esta instalado; si no, cae automaticamente a CPU
Ajuste rapido para mejorar recall/continuidad
Si faltan sujetos o aparecen tracks cortados:
- subir
tracking.max_distance(ej.70-90) - subir
tracking.max_missed(ej.15-25) - bajar
detection.min_area(ej.4-8) - usar
detection.threshold_mode: otsuy ajustardetection.otsu_offset(ej.-6mas sensible)
Si aparecen demasiados tracks de ruido:
- subir
tracking.min_track_displacement(ej.20-40) - subir
tracking.min_track_path_length(ej.30-80) - subir
tracking.min_track_straightness(ej.0.1-0.3) - subir
background.sample_frames(ej.100-300) para estabilizarbackground.png - activar gates anti-flicker en
detection:max_global_intensity_shift,max_foreground_ratio,max_detections_per_frame - activar gate temporal
detection.temporal_burst_*para suprimir rafagas cortas de ruido
Tests minimos
pytest
Los tests cubren deteccion, tracking y export/render de salida.
Agradecimientos / Referencias
Parte de los parámetros y perfiles de uso incluidos en este proyecto se han inspirado en el enfoque y resultados de la herramienta ThruTracker desarrollada por Aaron J. Corcoran. Recomendaos consultar su repositorio en GitHub.
Licencia
Este proyecto está bajo la licencia Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
Esto significa que eres libre de compartir, copiar, distribuir, ejecutar y comunicar públicamente la obra, así como hacer obras derivadas, bajo las siguientes condiciones:
- Atribución (Attribution): Debes reconocer adecuadamente la autoría, proporcionar un enlace a la licencia e indicar si se han realizado cambios.
- No Comercial (NonCommercial): No puedes utilizar el material para una finalidad comercial.
Para ver una copia de esta licencia, visita https://creativecommons.org/licenses/by-nc/4.0/ o revisa el archivo LICENSE incluido en este repositorio.