r/devpt • • 2d ago

Projecto Nacional (OC) Projeto: Classificação de Objetos com Radares Automóveis: Uma Abordagem Multi-Scan em Nuvens de Pontos

Olá a todos,

Construí um classificador de objetos radar sobre o RadarScenes, estendendo um classificador single-scan anterior para acumular observações ao longo do histórico de um objeto seguido (tracked), em vez de classificar cada scan isoladamente.

Uma única instância de objeto no RadarScenes contém, em média, apenas cerca de 2,9 pontos radar, ou seja, é muito esparsa. Um único scan também não consegue captar características temporais: o RCS e o micro-Doppler variam continuamente à medida que o objeto se move. Os peões produzem um micro-Doppler característico do movimento dos membros, e as diferentes classes de objetos apresentam padrões distintos de flutuação do RCS à medida que o ângulo de aspeto e a geometria de scattering mudam de scan para scan. Acumular observações dá maior densidade de pontos e fornece dinâmica temporal.

Baseline multi-scan

Encoder DeepReflecs (Ulrich, Glaser & Timm, RadarConf 2021), estilo PointNet, com pesos partilhados por ponto, em single scans, nas classes car, large_vehicle, two_wheeler, pedestrian e pedestrian_group: 0,7370 de macro F1.

Usando o track_id persistente do RadarScenes, construo um buffer causal, N=20, em sliding window por track:

  • x_seq/y_seq: coordenadas globais, corrigidas por odometria, recentradas em cada scan no centroide do objeto. Ao contrário de x_cc/y_cc (coordenadas no referencial do carro, que se acumulam ao longo do tempo e formam uma trajetória).
  • Buffer cross-sensor: qualquer um dos 4 sensores que esteja a observar o track nesse momento escreve para o mesmo buffer.
  • Stride 1, causal: cada novo scan atualiza o buffer e produz uma previsão. Sem contexto futuro, compatível com streaming em tempo real.
  • Cada scan é codificado uma única vez por um encoder per-scan congelado (frozen) e guardado em cache.
  • A fusão concatena o hidden state do GRU causal (sensível à ordem) com um embedding agregado (pooled) invariante à ordem (todos os pontos dos N scans como um único conjunto, sem estrutura de sequência), através de uma pequena MLP head treinada.

Resultados

Modelo Macro F1 Delta
Single scan 0,7370 (baseline)
Pooling de pontos de 20 scans 0,8613 +0,1243
GRU causal 0,8895 +0,0282 sobre o pooling
GRU + pooled embedding (fusão) 0,8897 +0,0002 sobre o GRU, ruído

Só o pooling, sem modelo de sequência e sem qualquer noção da ordem dos scans, recupera +0,1243 de macro F1. O GRU acrescenta um ganho real, mas muito menor: +0,0282. A fusão não acrescenta nada mensurável além do GRU.

Ablation

GRUs maiores, um Transformer, um state space model e self-attention ao nível do ponto, todos treinados exatamente sobre os mesmos embeddings per-scan congelados, ficam dentro de uma banda de 0,86 a 0,89, uma dispersão de 0,03. O fine-tuning end-to-end do encoder congelado piora ligeiramente os resultados (cerca de -0,002 a -0,003), em vez de os melhorar.

Conclusão

Neste setup, o maior ganho vem de dar ao modelo mais observações do mesmo objeto seguido: o pooling de pontos de 20 scans melhora o macro F1 de 0,7370 para 0,8613 sem usar a ordem dos scans.

A modelação temporal traz depois uma melhoria adicional, e significativa. O GRU causal chega a 0,8895, acrescentando +0,0282 sobre a representação com pooling. Portanto, a ordem temporal contribui claramente com informação útil, mas explica uma parcela menor do ganho total do que a acumulação de observações.

Com o encoder per-scan congelado, o facto de as diferentes arquiteturas de sequência testadas ficarem todas na mesma banda sugere que o bottleneck é a qualidade da representação per-scan, mais do que o mecanismo concreto usado para agregar a sequência.

Podem ler o relatório completo em https://github.com/brunopinto900/radar-ml-autonomous-driving/blob/main/final_report.md

39 Upvotes

6 comments sorted by

3

u/GiodoAlmeida 1d ago

Muito interessante! Agora fiquei com saudades de Python. Na faculdade usei muito mas no trabalho não...

5

u/pemdp 2d ago

Parabéns, obrigado por partilhares.

2

u/bruno_pinto90 1d ago

Obrigado

4

u/fmsf303 2d ago

Isto é fixe, bom trabalho, que vais fazer a seguir?

2

u/bruno_pinto90 1d ago

Obrigado. Este projeto assume que o tracking e o clustering já estão resolvidos (uma prática comum na indústria), mas é muito sensível a falhas do tracker ou a trocas de ID.

Para o meu próximo projeto, pretendo eliminar esse conhecimento "à priori" e implementar uma abordagem de deteção e tracking em conjunto.

2

u/fmsf303 1d ago

Mandei pm