Versiones más recientes (renombradas):
Versiones anteriores:
Destacanos en GitHub: ¡nos motiva mucho!
Similari es un marco de Rust con enlaces de Python que ayuda a crear sistemas de seguimiento sofisticados. Con Similari se pueden desarrollar SORT, DeepSORT y otros motores de seguimiento sofisticados de un solo observador (por ejemplo, Cam) o de múltiples observadores, altamente eficientes y en paralelo.
El objetivo principal de Similari es proporcionar medios para construir sofisticados motores de seguimiento de múltiples objetos en memoria.
El marco ayuda a construir varios tipos de motores de búsqueda de seguimiento y similitudes: el más simple contiene características vectoriales y permite comparar nuevos vectores con los que se mantienen en la base de datos. Motores más sofisticados operan sobre pistas: una serie de observaciones para la misma característica recopiladas durante el ciclo de vida. Estos sistemas se utilizan a menudo en el procesamiento de vídeo u otros sistemas en los que el observador recibe resultados de observación borrosos o cambiantes.
Similari es un marco para crear rastreadores personalizados; sin embargo, proporciona ciertos algoritmos como funcionalidad para el usuario final:
El filtro Kalman de cuadro delimitador , que predice cuadros delimitadores rectangulares alineados con el eje de la escena, también admite cuadros delimitadores orientados (girados).
Filtro Kalman de punto 2D , que predice el movimiento de puntos 2D.
Filtro de Kalman de vector de puntos 2D , que predice el vector de movimiento de puntos 2D independientes (utilizado en el Keypoint Tracker).
Recorte de cuadro delimitador , que permite calcular el área de intersección para cuadros delimitadores alineados y orientados (girados) con ejes.
Supresión no máxima (NMS) : filtra cuadros delimitadores rectangulares coaxiales a la escena y admite cuadros delimitadores orientados.
Algoritmo de seguimiento SORT (se admiten cuadros orientados y alineados con ejes): se admiten distancias IoU y Mahalanobis.
Algoritmo de seguimiento SORT por lotes (se admiten cuadros orientados y alineados con ejes): se admiten distancias IoU y Mahalanobis. El rastreador por lotes permite pasar varias escenas al rastreador en un solo lote y recuperarlas. Si la plataforma admite procesamiento por lotes (como Nvidia DeepStream o Intel DL Streamer), es más beneficioso utilizar el rastreador de lotes.
Seguimiento VisualSORT : un algoritmo similar a DeepSORT (se admiten cuadros orientados y alineados con ejes). Las distancias IoU y Mahalanobis se admiten para el seguimiento posicional; las distancias euclidianas y coseno se utilizan para el seguimiento visual de vectores de características.
Batch VisualSORT : versión de VisualSORT por lotes;
Aunque Similari permite crear varios motores de seguimiento y similitud, existen herramientas competitivas que a veces pueden adaptarse mejor. La sección explicará dónde es aplicable y qué alternativas existen.
Similari se adapta mejor a las tareas de seguimiento en las que los objetos se describen mediante múltiples observaciones para una determinada clase de entidad, no un único vector de características. Además, su comportamiento es dinámico: los elimina del índice o los modifica con tanta frecuencia como agrega otros nuevos. Este es un punto muy importante: es menos eficiente que las herramientas que trabajan con espacios de objetos estáticos o en crecimiento.
Ajuste : rastrea a la persona en la habitación: la ReID de la persona, la edad/género y las características de la cara se recopilan varias veces durante el seguimiento y se utilizan para fusionar pistas o proporcionar resultados agregados al final de la pista;
No apto : base de datos de plagio, cuando un solo documento se describe mediante un número (o solo uno) de vectores ReID constantes, los documentos se agregan pero no se eliminan. La tarea es encontrar los X documentos más similares a uno marcado.
Si su tarea parece No encajar , puede usar Similari, pero probablemente esté buscando implementaciones HNSW
o NMS
:
Óxido HNSW - Enlace
HNSW C/Python - enlace
NMSLib - enlace
Los objetos similares admiten las siguientes características:
Seguimiento del ciclo de vida : el objeto está representado por su ciclo de vida (pista): aparece, evoluciona y desaparece. Durante su vida, el objeto evoluciona de acuerdo con sus propiedades de comportamiento (atributos y observaciones de características).
Observaciones : Similari supone que un objeto es observado por una entidad observadora que recopila sus características (vectores uniformes) y atributos de observación personalizados (como GPS o posición del cuadro de pantalla) varias veces. Esas características se presentan mediante vectores de números flotantes y atributos de observación. Cuando ocurrió la observación, la pista se actualiza con las características recopiladas. Las observaciones futuras se utilizan para encontrar pistas similares en el índice y fusionarlas.
Atributos de seguimiento : los atributos arbitrarios describen propiedades de seguimiento adicionales además de las observaciones de entidades. El seguimiento de atributos es una parte crucial cuando se comparan objetos en la naturaleza, porque puede haber una disposición de atributos cuando los objetos son incompatibles, como animal_type
que le prohíbe comparar dogs
y cats
entre sí. Otro uso popular de los atributos es una característica espacial o temporal de un objeto; por ejemplo, los objetos que están situados en lugares distantes al mismo tiempo no se pueden comparar. Los atributos en Similari son dinámicos y evolucionan con cada adición de observación de características y cuando se fusionan objetos. Se utilizan tanto en cálculos de distancia como en adivinanzas de compatibilidad (lo que reduce el espacio de cálculo al omitir objetos incompatibles).
Si planea utilizar Similari para buscar en un índice grande, considere los atributos del objeto para dividir el espacio de búsqueda. Si los atributos de las dos pistas no son compatibles, se omiten los cálculos de distancia.
El Similari es rápido. Suele ser más rápido que los rastreadores creados con Python y NumPy.
Para ejecutar cálculos de características visuales de manera eficiente, el marco utiliza ultravioleta, la biblioteca para cálculos SIMD rápidos.
Los cálculos paralelos se implementan con fragmentación de índices y cálculos paralelos basados en un grupo de trabajadores de subprocesos dedicado.
El rendimiento de las operaciones vectoriales depende en gran medida del nivel de optimización definido para la compilación. En niveles de optimización bajos o predeterminados, es posible que Rust no utilice la vectorización f32, por lo que cuando ejecute pruebas comparativas, tenga cuidado de configurar los niveles de optimización adecuados.
Utilice RUSTFLAGS="-C target-cpu=native"
para habilitar todas las funciones de la CPU como AVX, AVX2, etc. Es beneficioso para los rayos ultravioleta.
Alternativamente, puede agregar instrucciones de compilación a .cargo/config
:
[build] rustflags = "-C target-cpu=native"
Eche un vistazo a los puntos de referencia para conocer los números.
Aquí se presentan algunos números de puntos de referencia: Puntos de referencia
Puede ejecutar sus propios puntos de referencia mediante:
rustup default nightly cargo bench
Es posible que deba agregar las siguientes líneas en su ~/.cargo/config
para crear el código en Apple Silicone:
[build] rustflags = "-C target-cpu=native" # Apple Silicone fix [target.aarch64-apple-darwin] rustflags = [ "-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup", ]
La interfaz de Python expone funciones y clases de Similari listas para usar. Por ahora, la interfaz de Python proporciona:
el filtro de Kalman para la predicción de cuadros alineados y orientados (girados) con ejes;
el filtro de Kalman para la predicción del movimiento de puntos 2D;
el filtro Kalman de vector de puntos 2D, que predice el vector de movimiento de puntos 2D independientes (utilizado en el Keypoint Tracker);
NMS (supresión no máxima);
el área de intersección de recorte de Sutherland-Hodgman para cuadros orientados (girados);
ORDENAR con IoU y métrica Mahalanobis;
BatchSORT con IoU y métrica Mahalanobis;
VisualSORT: rastreador tipo DeepSORT con métrica euclidiana/coseno para características visuales y métrica IoU/Mahalanobis para seguimiento posicional (VisualSort).
BatchVisualSORT: sabor VisualSORT por lotes;
Las clases y funciones de la API de Python se pueden explorar en la documentación de Python y en los pequeños ejemplos proporcionados.
También se proporciona un kit de evaluación MOTChallenge que puede utilizar para evaluar simplemente el rendimiento y las métricas de los rastreadores.
Tenga en cuenta que el paquete PyPi está diseñado para adaptarse a una amplia gama de plataformas, por lo que puede no ser tan rápido como el que crea localmente para su plataforma (consulte las siguientes secciones).
Plataformas:
Linux: X86_64, ARM64, ARMv7;
Ventanas: X86_64;
Mac OS: X86_64, ARM64.
pip3 install similari-trackers-rs
Puede crear la rueda en Docker y, si desea instalarla en el sistema host, copie el paquete resultante en el sistema host como se demuestra en los siguientes ejemplos.
Si utiliza otras bibliotecas de Rust, puede resultarle beneficioso compilarlas con el contenedor básico de Rust (y Python 3.8):
docker build -t similari-trackers-rs -f docker/rust_1.67/Dockerfile . # optional: copy and install to host system docker run --rm -it -v $(pwd)/distfiles:/tmp similari-trackers-rs cp -R /opt/dist /tmp pip3 install --force-reinstall distfiles/dist/*.whl
Python 3.8 todavía se usa con mucha frecuencia. Aquí se explica cómo construir Similari con él:
docker build -t similari-trackers-rs -f docker/python_3.8/Dockerfile . # optional: copy and install to host system docker run --rm -it -v $(pwd)/distfiles:/tmp similari-trackers-rs cp -R /opt/dist /tmp pip3 install --force-reinstall distfiles/dist/*.whl
Si utiliza el entorno Python más reciente, puede compilar con el contenedor base de Python:
docker build -t similari-trackers-rs -f docker/python_3.10/Dockerfile . # optional: copy and install to host system docker run --rm -it -v $(pwd)/distfiles:/tmp similari-trackers-rs cp -R /opt/dist /tmp pip3 install --force-reinstall distfiles/dist/*.whl
NOTA : Si recibe el error pip3
como:
ERROR: similari-trackers-rs-0.26.4-cp38-cp38-manylinux_2_28_x86_64.whl is not a supported wheel on this platform.
Significa que la versión de Python en el sistema host no coincide con la que está en la imagen utilizada para construir la rueda.
Instale el kit de herramientas Rust actualizado:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shsource $HOME/.carga/env actualización oxidada
Instale herramientas esenciales de compilación apt install build-essential -y
.
Instale Python3 (>= 3.8) y los archivos de desarrollo ( python3-dev
).
Instalar Maturín:
pip3 install --upgrade maturin~=0.15
No en VENV . Construya el módulo de Python:
RUSTFLAGS=" -C target-cpu=native -C opt-level=3" maturin build --release --out dist pip3 install --force-reinstall dist/*.whl
En VENV . Construya el módulo de Python:
RUSTFLAGS=" -C target-cpu=native -C opt-level=3" maturin develop
Los ejemplos de uso se encuentran en Python.
La imagen de MOT Challenge Docker para rastreadores Similari y rastreadores convencionales está aquí. Puede crear fácilmente una imagen de Docker todo en uno y probar nuestros rastreadores.
Artículos recopilados sobre cómo se puede utilizar Similari para resolver problemas específicos.
Ejemplo de rastreador de objetos IoU;
Ejemplo de rastreador de objetos de reidentificación;
Ejemplo de rastreador de objetos SORT;
Ejemplo de rastreador de objetos SORT de Python;
Ejemplo de rastreador de objetos SORT rotado de Python;
Por qué necesita sistemas de seguimiento de alto rendimiento para el seguimiento de múltiples objetos.
Eche un vistazo a las muestras en el repositorio:
simple.rs: una idea de uso sencillo.
track_merging.rs: una idea de fusión de pistas dentro de la cámara.
incremental_track_build.rs: rastreador basado en funciones muy simple.
simple_sort_iou_tracker.rs: rastreador SORT (con filtro Kalman, IoU).
simple_sort_iou_tracker_orientado.rs: rastreador SORT orientado (girado) (con filtro Kalman, IoU).
simple_sort_maha_tracker.rs: rastreador SORT (con filtro Kalman, Mahalanobis).
simple_sort_maha_tracker_oriented.rs: rastreador SORT orientado (con filtro Kalman, Mahalanobis).
middleware_sort_tracker.rs: rastreador SORT (con filtro Kalman, implementación de middleware).