Exploración de datos interactivos para proyectos de visión por computadora con Rerun

Herramientas para la visualización y exploración de datos me han permitido iterar mucho más rápido en los proyectos de mi visión por computadora, especialmente cuando los problemas que me enfrentan no son sencillos y necesito que tomar decisiones de algoritmo o diseño basadas en señales dinámicas variables en el tiempo. Estas señales a menudo pueden ser difíciles de analizar solo observar los números que cambian rápidamente en la pantalla o guardados en una tabla.

Mientras trabajaba en algunos de estos problemas, exploré los elementos interactivos incorporados de OpenCVpero aparte de algunos controles deslizantes, las opciones hay muy limitadas, especialmente cuando se trata de integrar algunas tramas animadas. Hay algunos truco formas de obtener gráficos dinámicos de matplotlib en OpenCVque exploré en este correo.

También exploré diferentes marcos de interfaz de usuario como tkinterque usé en mi último proyecto Para una visualización de análisis de sentimientos. Construí un componente personalizado que me permitió mostrar marcos dinámicos. Sin embargo, todavía no se sentía como la herramienta adecuada para la tarea, especialmente cuando se trata de trabajar con tramas interactivas.

Y luego me topé Repetición. De vez en cuando descubro una herramienta o marco que realmente me emociona, y este fue exactamente uno de esos tiempos. Rerun es una herramienta de código abierto para visualizar datos que típicamente se encuentran en el dominio de Robótica que va desde simples datos de series de tiempo e imágenes estáticas hasta nubes complejas de puntos 3D, flujos de video u otros tipos de datos multimodales. Las demostraciones se ven realmente impresionantes y las muestras de configuración y código son tan simples que inmediatamente me enganché.

Rerun demo ejecutándose en un navegador web

Así que decidí reelaborar mi demostración de seguimiento de la pelota de un proyecto anterior y trazar los datos utilizando Rerun. ¡Déjame mostrarte lo fácil que es usar y crear aplicaciones interactivas!

Inicio rápido

Puede instalar Rerun en cualquiera de sus proyectos de Python utilizando PIP o UV:

pip install rerun-sdk
uv add rerun-sdk

Puede iniciar el visor después de instalar el SDK simplemente ejecutándolo desde la línea de comando:

rerun

El espectador será su ventana principal donde se mostrarán sus experimentos. Puede dejarlo abierto o cerrarlo entre sus experimentos.

Para instanciar a un espectador de repetición de un script de Python, debe generar una instancia con un nombre de experimento:

import rerun as rr

rr.init("ball_tracking", spawn=True)

Demostración de seguimiento de la pelota

Las grabaciones del experimento de reanicamiento se pueden guardar y cargar desde .rrd grabación de archivos. Puede descargar el archivo de grabación para la demostración de seguimiento de la pelota desde aquí. Prensa Ctrl + O o seleccionar Open... en el menú en la parte superior izquierda del espectador Rerun y cargue el archivo de grabación descargado.

Verá la reproducción de demostración de seguimiento de la pelota una vez y luego el video se detiene. En la parte inferior del espectador, tiene la línea de tiempo. Puede fregar a través de la línea de tiempo haciendo clic y arrastrando el mango.

Estos archivos de grabación solo contienen los datos del experimento, incluido el video, sus anotaciones y la serie temporal del seguimiento. El diseño del espectador se almacena por separado en un .rbl Archivo de BluePrint. Descargue el archivo de BluePrint para la demostración aquí y ábralo en la parte superior del archivo de datos existente.

Ahora tenemos una descripción ligeramente mejor con la posición, la velocidad y las parcelas de aceleración separadas y el video se centró prominentemente.

En el marco de video puede hacer clic en las anotaciones y en la izquierda Blueprint Panel puede ocultarlos o mostrarlos individualmente.

Rapas de las series de tiempo

Para analizar una gráfica específica, puede hacer clic en el botón Vista de expansión en la parte superior derecha de cualquier ventana, por ejemplo, el diagrama de posición.

Este es un TimeSeriesView. Esta vista se puede usar para trazar datos en un gráfico 2D con el eje X que representa el dominio de tiempo, en nuestro caso, el índice de cuadro discreto del video. En esta demostración de seguimiento de la pelota, iteramos sobre los marcos de video en un bucle, donde podemos establecer el índice de cuadro de nuestra línea de tiempo explícitamente.

frame_index = 0

while True:
    ret, frame = cap.read()
    if not ret:
        break

    frame_index += 1
    if frame_index >= num_frames:
        break

    rr.set_time("frame_idx", sequence=frame_index)

Para crear la gráfica para la posición, debe registrar un valor escalar para la posición de la bola rastreada en cada índice de cuadro. En este caso, después de calcular la posición, simplemente podemos registrarla para volver a ejecutar:

rr.log("ball/position_y", rr.Scalars(pos))

Para configurar el estilo de esta trama, también necesitamos registrar algo en la misma ruta de entidad (ball/position_y), pero como el estilo no cambia, podemos registrarlo una vez antes del bucle y proporcionar un argumento estático.

rr.log(
    "ball/position_y",
    rr.SeriesLines(colors=[0, 128, 255], names="pos y"),
    static=True,
)

Para definir el rango del eje que es visible por valor predeterminado, necesitamos especificar un componente de diseño.

view_pos = rrb.TimeSeriesView(
    origin="ball/position_y",
    axis_y=rrb.ScalarAxis(range=(0, 700)),
)
layout = rrb.Blueprint(view_pos)
rr.send_blueprint(layout)

Transmisión de video

Del mismo modo, podemos crear una vista para los marcos de video registrando la imagen para volver a ejecutar. Dado que Rerun espera una imagen RGB pero OpenCV UES BGR para su pedido de canal de color, necesitamos convertir los marcos de BGR a RGB antes de pasarlas a repetir.

frame_rgb: np.ndarray = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
rr.log("frame", rr.Image(frame_rgb))

Para agregar anotaciones a la vista de imagen, necesitamos registrar elementos espaciales a una ruta sub de la ruta de entidad especificada. Por ejemplo, podemos dibujar el centro de la pelota rastreada:

rr.log(
    "frame/points",
    rr.Points2D(
        positions=[center],
        colors=[0, 0, 255],
        radii=4.0,
    ),
)

Para incluir la vista de cuadro de video en el diseño, podemos usar un Spatial2DView nodo:

view_frame = rrb.Spatial2DView(origin="frame")

Luego podemos apilar la gráfica de antes verticalmente con la vista de marco utilizando un Vertical Componente de diseño:

layout = rrb.Blueprint(
    rrb.Vertical(
        view_pos,
        view_frame,
        row_shares=[0.33],
    ),
)
rr.send_blueprint(layout)

Las acciones de la fila especifican cuánto ocupa cada una de las filas en porcentajes. Podemos omitir la entrada de compartir la segunda fila para la vista de cuadro ya que las acciones tienen que sumar 1.

Limitaciones

Mientras trabajaba en este proyecto, me encontré con algunas limitaciones de Rerun. En el proyecto original, visualicé una predicción de la trayectoria en cada paso de tiempo, pero actualmente esto no es posible en una vista de serie. Además, los diseños y la configuración de los datos trazados son limitados, por ejemplo, no hay una forma incorporada de dibujar un círculo sin relleno. Pero dado que el proyecto se está desarrollando muy activamente, existe una buena posibilidad de que algunos de estos puedan ser posibles en el futuro.

Conclusión

La experiencia del desarrollador con esta herramienta como ingeniero de visión por computadora es extremadamente agradable, la interfaz de usuario se carga casi al instante y el fregado de la línea de tiempo puede ser increíblemente útil para comprender o depurar señales en las parcelas de series temporales o en videos. ¡Definitivamente seguiré usando y explorando este proyecto y solo puedo recomendarle que lo pruebe usted mismo!


Para obtener más detalles y la implementación completa, consulte el código fuente de este proyecto en src/ball_tracking/trajectory_rerun.py.

https://github.com/trflorian/ball-tracking-live-plot


Todas las visualizaciones en esta publicación fueron creadas por el autor.