Versões mais recentes (renomeadas):
Versões mais antigas:
Marque-nos no GitHub - isso nos motiva muito!
Similari é uma estrutura Rust com ligações Python que ajuda a construir sistemas de rastreamento sofisticados. Com o Similari, é possível desenvolver SORT paralelizado altamente eficiente, DeepSORT e outros mecanismos sofisticados de rastreamento de observador único (por exemplo, Cam) ou de vários observadores.
O objetivo principal do Similari é fornecer meios para construir mecanismos sofisticados de rastreamento de múltiplos objetos na memória.
A estrutura ajuda a construir vários tipos de mecanismos de busca de rastreamento e similaridade - o mais simples que contém características vetoriais e permite comparar novos vetores com aqueles mantidos no banco de dados. Motores mais sofisticados operam sobre trilhas – uma série de observações para a mesma característica coletadas durante o ciclo de vida. Tais sistemas são frequentemente usados em processamento de vídeo ou outros sistemas onde o observador recebe resultados de observação confusos ou variáveis.
Similari é uma estrutura para construir rastreadores personalizados, mas fornece certos algoritmos como uma funcionalidade para o usuário final:
O filtro Bounding Box Kalman , que prevê caixas delimitadoras retangulares alinhadas ao eixo à cena, também suporta caixas delimitadoras orientadas (giradas).
Filtro Kalman de ponto 2D , que prevê movimento de ponto 2D.
Filtro Kalman de vetor de pontos 2D , que prevê o vetor de movimento de pontos 2D independentes (usado no Keypoint Tracker).
Recorte de caixa delimitadora , que permite calcular a área de interseção para caixas delimitadoras alinhadas ao eixo e orientadas (giradas).
Supressão Não Máxima (NMS) - filtra caixas delimitadoras retangulares coaxiais à cena e oferece suporte às caixas delimitadoras orientadas.
Algoritmo de rastreamento SORT (caixas orientadas e alinhadas ao eixo são suportadas) - distâncias IoU e Mahalanobis são suportadas.
Algoritmo de rastreamento SORT em lote (caixas alinhadas e orientadas por eixo são suportadas) - distâncias IoU e Mahalanobis são suportadas. O rastreador de lote permite passar várias cenas para o rastreador em um único lote e recuperá-las. Se a plataforma suportar lote (como Nvidia DeepStream ou Intel DL Streamer), o rastreador de lote será mais benéfico de usar.
Rastreamento VisualSORT - um algoritmo semelhante ao DeepSORT (caixas orientadas e alinhadas ao eixo são suportadas) - distâncias IoU e Mahalanobis são suportadas para rastreamento posicional, distâncias euclidianas e de cosseno são usadas para rastreamento visual em vetores de recursos.
Batch VisualSORT - sabor VisualSORT em lote;
Embora o Similari permita a construção de vários mecanismos de rastreamento e similaridade, existem ferramentas competitivas que às vezes podem ser mais adequadas. A seção explicará onde é aplicável e quais alternativas existem.
Similari se adapta melhor às tarefas de rastreamento em que os objetos são descritos por múltiplas observações para uma determinada classe de recursos, e não por um único vetor de recursos. Além disso, seu comportamento é dinâmico - você os remove do índice ou os modifica com a mesma frequência que adiciona novos. Este é um ponto muito importante - é menos eficiente do que ferramentas que trabalham com espaços de objetos crescentes ou estáticos.
Ajuste : rastreie a pessoa do outro lado da sala: ReID da pessoa, idade/sexo e características faciais são coletados várias vezes durante o rastreamento e usados para mesclar trilhas ou fornecer resultados agregados no final da trilha;
Não adequado : banco de dados de plágio, quando um único documento é descrito por um número (ou apenas um) vetores ReID constantes, os documentos são adicionados, mas não removidos. A tarefa é encontrar os X documentos mais semelhantes a um verificado.
Se sua tarefa for semelhante a Not fit , você pode usar Similari, mas provavelmente está procurando implementações HNSW
ou NMS
:
Ferrugem HNSW - Link
HNSW C/Python - link
NMSLib - link
Objetos Similari suportam os seguintes recursos:
Rastrear ciclo de vida - o objeto é representado por seu ciclo de vida (rastreamento) - ele aparece, evolui e desaparece. Durante sua vida, o objeto evolui de acordo com suas propriedades comportamentais (atributos e observações de características).
Observações - Similari assume que um objeto é observado por uma entidade observadora que coleta suas características (vetores uniformes) e atributos de observação personalizados (como GPS ou posição da caixa de tela) várias vezes. Essas características são apresentadas por vetores de números flutuantes e atributos de observação. Quando a observação acontece, a trilha é atualizada com as características coletadas. Observações futuras são usadas para encontrar trilhas semelhantes no índice e mesclá-las.
Atributos de trilha - Atributos arbitrários descrevem propriedades adicionais da trilha além das observações de recursos. Rastrear atributos é uma parte crucial quando você está comparando objetos em estado selvagem, porque pode haver disposição de atributos quando os objetos são incompatíveis, como animal_type
que proíbe você de comparar dogs
e cats
entre si. Outro uso popular de atributos é uma característica espacial ou temporal de um objeto, por exemplo, objetos que estão situados em locais distantes ao mesmo tempo não podem ser comparados. Os atributos no Similari são dinâmicos e evoluem a cada adição de observação de recurso e quando os objetos são mesclados. Eles são usados tanto em cálculos de distância quanto em suposições de compatibilidade (o que diminui o espaço de computação ao ignorar objetos incompatíveis).
Se você planeja usar o Similari para pesquisar em um índice grande, considere os atributos do objeto para dividir o espaço de pesquisa. Se os atributos das duas trilhas não forem compatíveis, seus cálculos de distância serão ignorados.
O Similari é rápido. Geralmente é mais rápido que rastreadores criados com Python e NumPy.
Para executar cálculos de recursos visuais com bom desempenho, a estrutura usa ultravioleta - a biblioteca para cálculos SIMD rápidos.
Cálculos paralelos são implementados com fragmentação de índice e cálculos paralelos baseados em um pool de threads dedicado.
O desempenho das operações vetoriais depende muito do nível de otimização definido para a construção. Em níveis de otimização baixos ou padrão, o Rust não pode usar a vetorização f32, portanto, ao executar benchmarks, tome cuidado com os níveis de otimização adequados configurados.
Use RUSTFLAGS="-C target-cpu=native"
para habilitar todos os recursos da CPU como AVX, AVX2, etc. É benéfico para ultravioleta.
Alternativamente, você pode adicionar instruções de construção a .cargo/config
:
[build] rustflags = "-C target-cpu=native"
Dê uma olhada nos benchmarks para números.
Alguns números de benchmarks são apresentados aqui: Benchmarks
Você pode executar seus próprios benchmarks:
rustup default nightly cargo bench
Pode ser necessário adicionar as seguintes linhas ao seu ~/.cargo/config
para criar o código no 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", ]
A interface Python expõe funções e classes prontas para uso do Similari. Por enquanto, a interface Python fornece:
o filtro de Kalman para previsão de caixas alinhadas e orientadas (giradas) ao eixo;
o filtro Kalman para previsão de movimento de pontos 2D;
o filtro 2D Point Vector Kalman, que prevê o vetor de movimento de pontos 2D independentes (usado no Keypoint Tracker);
SNM (supressão não máxima);
o recorte Sutherland-Hodgman, área de interseção para caixas orientadas (giradas);
SORT com métrica IoU e Mahalanobis;
BatchSORT com métrica IoU e Mahalanobis;
VisualSORT - rastreador semelhante ao DeepSORT com métrica euclidiana/cosseno para recursos visuais e métrica IoU/Mahalanobis para rastreamento posicional (VisualSort).
BatchVisualSORT - sabor VisualSORT em lote;
As classes e funções da API Python podem ser exploradas na documentação do Python e em pequenos exemplos fornecidos.
Também é fornecido um kit de avaliação MOTChallenge que você pode usar para avaliar simplesmente o desempenho e as métricas dos rastreadores.
Por favor, tenha em mente que o pacote PyPi é construído para se adequar a uma ampla variedade de plataformas, portanto pode não ser tão rápido quanto aquele que você constrói localmente para sua plataforma (veja as seções a seguir).
Plataformas:
Linux: X86_64, ARM64, ARMv7;
Janelas: X86_64;
Mac OS: X86_64, ARM64.
pip3 install similari-trackers-rs
Você pode construir a roda no Docker e, se desejar instalá-la no sistema host, copie o pacote resultante para o sistema host, conforme demonstrado nos exemplos a seguir.
Se você usar outras bibliotecas Rust, poderá achar benéfico construir com o contêiner Rust base (e 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 ainda é usado com muita frequência. Veja como construir o Similari com ele:
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
Se você usar o ambiente Python mais recente, poderá construir com o contêiner Python base:
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 : Se você estiver recebendo o erro 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.
Isso significa que a versão do Python no sistema host não corresponde àquela que está na imagem usada para construir a roda.
Instale o kit de ferramentas Rust atualizado:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shsource $HOME/.cargo/env atualização de ferrugem
Instale ferramentas essenciais de compilação apt install build-essential -y
.
Instale o Python3 (>= 3.8) e os arquivos de desenvolvimento ( python3-dev
).
Instale Maturin:
pip3 install --upgrade maturin~=0.15
Não na VENV . Construa o módulo python:
RUSTFLAGS=" -C target-cpu=native -C opt-level=3" maturin build --release --out dist pip3 install --force-reinstall dist/*.whl
Na VENV . Construa o módulo python:
RUSTFLAGS=" -C target-cpu=native -C opt-level=3" maturin develop
Exemplos de uso estão localizados em python.
A imagem MOT Challenge Docker para rastreadores Similari e rastreadores convencionais está aqui. Você pode criar facilmente uma imagem Docker completa e experimentar nossos rastreadores.
Artigos coletados sobre como o Similari pode ser usado para resolver problemas específicos.
Exemplo de rastreador de objeto IoU;
Exemplo de rastreador de objeto Re-ID;
Exemplo de rastreador de objeto SORT;
Exemplo de rastreador de objeto Python SORT;
Exemplo de rastreador de objeto SORT girado em Python;
Por que você precisa de sistemas de rastreamento de alto desempenho para rastreamento de vários objetos.
Dê uma olhada nos exemplos no repositório:
simple.rs - uma ideia de uso simples.
track_merging.rs - uma ideia de fusão de trilhas intra-cam.
incremental_track_build.rs - rastreador muito simples baseado em recursos.
simple_sort_iou_tracker.rs - rastreador SORT (com filtro Kalman, IoU).
simple_sort_iou_tracker_oriented.rs - Rastreador SORT orientado (girado) (com filtro Kalman, IoU).
simple_sort_maha_tracker.rs - Rastreador SORT (com filtro Kalman, Mahalanobis).
simple_sort_maha_tracker_oriented.rs - Rastreador SORT orientado (com filtro Kalman, Mahalanobis).
middleware_sort_tracker.rs - rastreador SORT (com filtro Kalman, implementação de middleware).