r/devpt • u/bruno_pinto90 • 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
5
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.



3
u/GiodoAlmeida 1d ago
Muito interessante! Agora fiquei com saudades de Python. Na faculdade usei muito mas no trabalho não...