Como explicar BEV e SLAM na direção autônoma de maneira fácil de entender?

Autor | Dare Story Editor | Autobots

Link original: https://zhuanlan.zhihu.com/p/646310465

Clique no card abaixo para prestar atenção na conta pública " Automatic Driving Heart "

Produtos secos ADAS Jumbo, você pode obtê-lo

Este artigo é apenas para compartilhamento acadêmico, caso haja alguma infração, favor entrar em contato para deletar o artigo

>> Clique para entrar→ The Heart of Autopilot【Full Stack Algorithm】Technical Exchange Group

Birds-Eyes-View (BEV): Uma visão panorâmica, a palavra em si não tem nenhum significado especial, mas tornou-se um termo nesta indústria depois que gradualmente se tornou popular no campo da direção autônoma (AD).

Localização e mapeamento simultâneos (SLAM): posicionamento simultâneo e mapeamento de mapas, outra tecnologia de percepção relativa ao BEV.

Percepção: Percepção, SLAM e BEV no campo AD são todas tecnologias de percepção que auxiliam o sistema de controle a entender as condições ao redor do veículo: saber onde você está, quais obstáculos existem, onde estão os obstáculos, a que distância estão e quais obstáculos são estáticos estão em movimento, etc. informações relevantes para decisões de direção subsequentes.

SLAM VS BEV: SLAM examina principalmente a estrutura do objeto no espaço circundante por meio de vários sensores e descreve essas informações com dados tridimensionais. O BEV também obtém as condições do ambiente por meio da varredura do sensor e usa principalmente dados bidimensionais para descrever essas informações. Em termos de escopo de aplicação, o SLAM é atualmente mais amplo. Antes de o AD se tornar popular, era usado principalmente em VR/AR e outros campos, e o BEV estava concentrado principalmente na indústria de AD. Do ponto de vista da implementação técnica, o SLAM é tendencioso para ferramentas matemáticas tradicionais, incluindo vários pacotes de software relacionados à teoria geométrica/probabilidade/teoria dos grafos/teoria de grupo, enquanto o BEV é basicamente baseado em redes neurais profundas DNN. É melhor não olhar para os dois em oposição, e eles podem se complementar em muitos casos.

A seguir se concentrará na introdução básica do BEV.

O sensor mais básico e central do SLAM e BEV é a câmera (Camera), então muito poder de computação no processo de cálculo de ambos é consumido na extração/reconhecimento de informações e cálculos de transformação em imagens. O SLAM tende a reconhecer os pontos característicos da imagem, que pertencem às informações de baixo nível nas informações de recursos, e obter a estrutura da cena e a própria pose da câmera (Posição e Pose) calculando as posições desses pontos característicos em diferentes imagens quadros. E o BEV tende a reconhecer informações de recursos avançados, como veículos/estradas/pedestres/obstáculos, que são bons em rede convolucional CNN e Transformer.

A câmera tem dois dados mais básicos: referência interna (Intrínseca) e referência externa (Extrínseca). A referência interna descreve principalmente o tamanho/resolução do filme fotossensível CCD/CMOS da câmera e o coeficiente da lente óptica. A referência externa descreve principalmente o desempenho da câmera no mundo. A posição de posicionamento e o ângulo de orientação no sistema de coordenadas.

Uma matriz comum de parâmetros internos é:

f9dc21d339fb0455cf0d2d79b8a0350e.png

Entre eles, fx e fy representam a distância focal horizontal/vertical (foco) da lente óptica, respectivamente. Em circunstâncias normais, a distância focal não é dividida em horizontal e vertical, mas porque a unidade de pixel na folha fotossensível CCD/CMOS é não é positivo o suficiente, se o pixel é um quadrado absoluto, então fx = fy é realmente muito difícil de conseguir. Há uma pequena diferença, o que leva ao problema de que as coordenadas horizontal e vertical não são equidistantes em distância unitária após a passagem da luz através da lente e é projetado na folha fotossensível. Portanto, o fabricante do módulo da câmera medirá essa diferença. E dar fx e fy, é claro, os desenvolvedores também podem usar o processo de calibração (calibração) para medir esses dois valores.

109191b9f62025042ea18bfb3353871e.png
figura 1
8dbf819e0a7ed46575a1db2b8cacec00.png
Figura 2

Além disso, no campo tradicional da óptica, a unidade padrão de fx e fy é mm:mm, mas neste campo a unidade padrão é pixel: Pixel, fazendo com que muitas pessoas com experiência em fotografia vejam o valor de fx e fy bastante perplexas , especialmente Big, às vezes vários milhares, esse valor está muito além do telescópio astronômico amador. Por que os pixels são usados ​​aqui? Vamos tentar calcular o FOV (Field of View, tamanho do campo de visão, geralmente em ângulo) da câmera através dos parâmetros internos para entender:

6845812183d5e8f25168972f0c6b3670.png
imagem 3
0fffb4ac8202d28043820704d796bf3b.png

Aqui fy é a distância focal longitudinal e h é a altura da foto. Como a unidade de h é pixel, fy também deve ser pixel, o que é conveniente para o processamento do computador, portanto a unidade de fx e fy é unificada em pixel. Na verdade, não há necessidade de um computador.Filme fotossensível CCD/CMOS geralmente precisa integrar outro chip, ISP (Processador de Sinal de Imagem) Este chip precisa converter dados fotossensíveis em imagens digitais, e unidades de pixel podem ser usadas aqui.

Além dessa matriz, a referência interna também possui um conjunto de coeficiente de distorção (distorção) K. Não vou entrar em detalhes sobre isso. Após a geração de imagens normais da lente, a deformação na posição central é pequena e a deformação ao redor é grande Geralmente, depois de obter este parâmetro através da calibração (Calibration), o processamento anti-distorção é executado na foto para restaurar uma foto relativamente "normal". O algoritmo SLAM enfatiza a importância dessa antidistorção, pois a posição absoluta do ponto característico na foto está diretamente relacionada à precisão do posicionamento e mapeamento, e a maior parte do código BEV não vê esse processamento antidistorção. por um lado, é BEV focado em recursos avançados no nível do objeto e pequenos deslocamentos no nível do pixel têm pouco efeito. Por outro lado, muitos projetos BEV são para escrever artigos, usando dados de treinamento como nuScenes/Argoverse e a distorção desses dados é relativamente pequena. Depois de usar lentes estranhas em seu projeto, você ainda precisa fazer o pré-processamento anti-distorção honestamente.

d5bb679925684c803d08ed7773dbcef0.png
Figura 4

O parâmetro externo é muito mais simples, um coeficiente de offset (Transform) mais um coeficiente de rotação (Rotation).

b7924bf5fa94988b260035c408f5021d.png

Existem dois métodos de cálculo comuns para expressar a rotação no espaço tridimensional: matriz (Matrix) e quaternion (Quaternion) Para evitar o problema de gimbal lock (Gimbal Lock) no método da matriz, o quaternion é geralmente usado para cálculo. girar. No entanto, isso raramente é feito no campo AD, porque a câmera é fixada no carro e apenas o eixo perpendicular ao solo (geralmente o eixo Z) pode girar 360 graus, o que não causará problemas com o gimbal em Respeite o estranho requisito de manter a direção automática durante o estágio de capotamento. Portanto, o código de BEV geralmente está na forma de matriz.Como o SLAM também será usado em AR e outros campos, a câmera não é relativamente fixa, então quaternions serão usados. Além disso, o fenômeno da perspectiva não é considerado no campo AD, então os parâmetros externos são todos matrizes afins (Affine Matrix), o que é diferente da renderização 3D no campo CG.

Além disso, ao introduzir os parâmetros internos em artigos gerais, também será considerado o desvio de rotação, porque a folha fotossensível CCD/CMOS é instalada de forma torta pela máquina na fábrica, mas geralmente não é considerada no campo AD. O erro é muito pequeno e a câmera está instalada no veículo. Quando os próprios parâmetros externos têm uma grande rotação relativa, é melhor esquecê-los juntos e, finalmente, entregá-los ao DNN para aprender e filtrá-los. SLAM in o campo AR precisa calcular ativamente os parâmetros externos, e essa garoa não é considerada.

Depois de entender os parâmetros internos e externos, o próximo foco básico é o sistema de coordenadas. Existem vários sistemas de coordenadas do AD, e é um pouco tonto olhar para o código sem esclarecê-lo com antecedência.

  1. O sistema de coordenadas mundiais (coordenação mundial), esta é a posição e o azimute do veículo no espaço do mundo real, geralmente a posição aproximada é obtida pelo sistema de posicionamento por satélite GNSS (Global Navigation Satellite System), GNSS inclui o GPS dos EUA/China BDS/Europa Galileo/Maozi GLONASS/Japão QZSS/Índia IRNSS, cada um tem suas vantagens e desvantagens, e a precisão de posicionamento é difícil de descrever. Geralmente, a precisão nominal refere-se a: quando o veículo está em uma área aberta, existem vários satélites de posicionamento cobrindo você, o veículo está parado e a antena do equipamento de posicionamento é grossa Resultados do teste no caso de interferência de outras fontes de sinal. Se você está em uma cidade, cercado por arranha-céus, várias fontes de interferência de rádio, satélites que aparecem e desaparecem de você e a velocidade do carro não é lenta, nesse caso, é correto compensar você por dezenas de metros. Existem duas soluções comuns para isso: correção de estação base diferencial e correção de big data de tráfego de mapa. Isso pode lhe dar uma ilusão: o posicionamento do satélite é bastante preciso. Não importa como você faça isso, a posição final da coordenada é latitude e longitude, mas comparada com o GIS convencional (Sistema de Informação Geográfica), a latitude e longitude do AD não é um sistema de coordenadas esféricas, mas um sistema de coordenadas que se expande em um 2 - mapa dimensional, portanto, as coordenadas finais no sistema Também existem diferenças entre os sistemas. Por exemplo, o Google converterá a longitude e a latitude de WGS84 no código de fatia retangular de seu próprio mapa. O Uber propôs um código de coordenadas H3 para fatias hexagonais. O Baidu sobrepôs um BD09 com base nas coordenadas de Marte, nas coordenadas da fatia retangular de , e assim por diante. Estas são posições de coordenadas absolutas, e mapas de alta precisão escaneados por tecnologia SLAM similar também introduzirão algumas coordenadas relativas nesta base. De qualquer forma, no final, tudo o que você vê no código é XY. No entanto, nenhum desses sistemas pode obter a orientação do veículo (o norte geográfico é 0 graus, o leste geográfico é 90 graus e assim por diante, que ainda é representado no mapa 2D), portanto, o ângulo do veículo em AD refere-se à "trajetória Orientação", subtraia as coordenadas do momento anterior das coordenadas da posição atual para obter um vetor direcional. Obviamente, com o auxílio de mapas de alta precisão, é possível calcular o azimute instantâneo do veículo por meio da tecnologia SLAM. Quando houver falta de posicionamento GNSS, como passar por um túnel, é necessário utilizar o IMU (Inertial Measurement

  2. O sistema de coordenadas mundiais do conjunto de dados de treinamento BEV (coordenação mundial nuScenes, outros conjuntos de treinamento não são explicados especificamente), é diferente do sistema de coordenadas absolutas do GNSS:

9bdec138675a6a1a372b68839768cdde.png
Figura 5

Este é um mapa nuScenes. Seu sistema de coordenadas mundiais é o sistema de coordenadas de imagem. A origem está no canto inferior esquerdo da imagem e a unidade é metros. Portanto, ao usar o conjunto de dados de treinamento, a latitude e a longitude não são consideradas. O conjunto de dados dará a posição instantânea do veículo de acordo com a série temporal, ou seja, XY nesta foto.

  1. Ego Coordination (Coordenação do Ego), em BEV, este Ego se refere especificamente ao próprio veículo, que é usado para descrever a câmera/Lidar (Lidar, detecção de luz e alcance)/radar de ondas milimétricas (referido como Radar no código geral ) /A posição de instalação da IMU na carroceria do veículo (a unidade padrão é metros) e o ângulo de orientação. A origem das coordenadas geralmente está no meio da carroceria do veículo. A orientação é mostrada na figura:

375f90b3495ab58455a49f6443746cd1.png
Figura 6

Portanto, a câmera na frente do carro padroniza para o Yaw (eixo Z) como 0 graus, e a matriz extrínseca descreve principalmente esse sistema de coordenadas.

  1. O sistema de coordenadas da câmera (Coordenação da câmera), lembre-se, este não é um sistema de coordenadas de fotos, a origem das coordenadas está no centro do filme fotossensível CCD/CMOS, a unidade é pixel e a referência interna (Matriz Intrínseca) descreve principalmente isso sistema de coordenadas.

  2. Sistema de coordenadas de foto (coordenação de imagem), a origem da coordenada está no canto superior esquerdo da imagem, a unidade é pixel e os eixos de coordenadas horizontal e vertical geralmente não são escritos como XY, mas uv.

1588cb52abfffe3d34cb75a4246f7c9e.png
Figura 7

Os três conjuntos de sistemas de coordenadas à esquerda, ao meio e à direita são: Coordenação do Ego, Coordenação da Câmera, Coordenação da Imagem.

Portanto, ao fazer LSS (Lift, Splat, Shoot) no BEV, quando você precisar converter a posição do pixel na foto para o sistema de coordenadas do mundo, deverá passar por:

Image_to_Camera, Camera_to_Ego, Ego_to_World, representado por uma matriz:

Position_in_World = Inv_World_to_Ego * Inv_Ego_to_Camera * Inv_Camera_to_Image * (Position_in_Image)

onde Inv_ representa o inverso da matriz. No código atual, Camera_to_Image é geralmente a matriz de parâmetros Intrinsics e Ego_to_Camera é a matriz de parâmetros Extrinsics.

Uma coisa a observar aqui é: fx, fy, eles são realmente calculados assim:

a0c4d143c17f0673a3b3bb447839cb00.png

Fx e Fy são as distâncias focais horizontal/vertical da lente, mas a unidade é metros, Dx e Dy são a largura e a altura de um pixel, respectivamente, e as unidades de fx e fy são pixels. Quando as coordenadas do espaço do Ego são multiplicadas pela matriz (Ego_to_Camera * Camera_to_Image), ela será projetada no espaço da foto em pixels. Quando as coordenadas do espaço da foto são multiplicadas pela matriz (Inv_Ego_to_Camera * Inv_Camera_to_Image), será projetado no espaço Ego em metros. Não haverá problemas com as unidades.

A maioria dos BEVs tem várias câmeras, o que significa que os pixels das fotos tiradas por várias câmeras precisam ser convertidos para o Ego ou sistema de coordenadas mundiais de uma só vez:

c9f0bc9909b8c80b098e94a20ac4d52b.png
Figura 8

Sob um sistema de coordenadas unificado, as fotos de vários ângulos podem "envolver" corretamente a cena ao redor. Além disso, existem algumas soluções de BEV de câmera monocular (Monocular), algumas das quais não consideram o sistema de coordenadas Ego, porque há apenas uma câmera voltada para a frente (Yaw, Pitch, Roll são todos 0) e a origem é o própria câmera, então salte diretamente do sistema de coordenadas da câmera para o sistema de coordenadas do mundo.

Frustum, isso geralmente é chamado de "cone de visão" no campo de renderização 3D e é usado para representar o alcance visível da câmera:

d157c237951eb69f2915ed4b68a0df7f.png
Figura 9

O espaço delimitado pela superfície vermelha, a superfície verde e a estrutura de arame é o cone de visualização. A superfície verde é geralmente chamada de plano próximo (plano próximo), a superfície vermelha é chamada de plano distante (plano distante) e o ângulo formado pelo quadro de arame é chamado de FOV. Se CCD/CMOS Se a altura e a largura da imagem forem iguais, então o plano próximo e o plano distante são quadrados e um FOV é suficiente para representar, caso contrário, é necessário para distinguir entre FOVx e FOVy, e objetos além do escopo deste frustum não são considerados no cálculo. Na Figura 7, o alcance de visualização combinado é composto por 6 faces triangulares. Na verdade, deveria ser composto por 6 cones de visualização. Pode-se observar que existem áreas sobrepostas entre os cones de visualização. Essas áreas são propícias ao DNN durante o treinamento /raciocínio, 6 conjuntos de dados são corrigidos mutuamente para melhorar a precisão do modelo. Se você deseja expandir a área de sobreposição sem aumentar o número de câmeras, deve escolher uma câmera com um FOV maior, mas uma câmera com um FOV maior é geralmente Quanto mais grave será a distorção da lente (não importa quanta antidistorção seja feita, a imagem só pode ser corrigida até certo ponto), e a área de imagem do objeto na imagem será menor, o que irá interferir no reconhecimento do DNN e na extração de recursos na imagem.

BEV é uma enorme família de algoritmos e tende a escolher algoritmos em diferentes direções. Grosso modo, há um gênero de percepção visual dominado por Tesla. O algoritmo principal é construído em várias câmeras. Outra grande categoria é lidar + radar de onda milimétrica + multicanal Road camera fusion (Fusion) escola, muitas empresas domésticas de AD são escola de fusão, Waymo do Google também é.

A rigor, a Tesla está em transição de BEV (Hydranet) para uma nova tecnologia: Occupancy Network, de 2D para 3D:

9b8f4d34aa813832f9194295b95fecc7.png
Figura 10

Quer seja 2D ou 3D, eles estão tentando descrever a ocupação do espaço circundante, mas um usa um tabuleiro de xadrez 2D para expressar a ocupação e o outro usa blocos de construção 3D para expressar a ocupação. A DNN usa probabilidade ao medir esse tipo de ocupação. Por exemplo, intuitivamente vemos que há um carro em uma determinada grade, e o resultado original dado pela DNN é: há 80% de probabilidade de que essa grade seja um carro, e ela é a superfície da estrada.A probabilidade de ser pedestre é de 5% e a probabilidade de ser pedestre é de 3%. . . . . Portanto, no código BEV, vários objetos possíveis são geralmente divididos em categorias, geralmente em duas categorias:

  1. Alteração frequente: área de comunicação do veículo (Dirigível), superfície da estrada (Road), faixa (Lane), edifício (Edifício), vegetação (Folhagem/Vegetação), área de estacionamento (Parking), semáforo (Semáforo) e alguns objetos estáticos não classificados (Estático), o relacionamento entre eles pode conter um ao outro, como Dirigível pode conter Estrada/Pista e assim por diante.

  2. Variável, ou seja, objetos em movimento: pedestres (Pedestrian), carros (Car), caminhões (Truck), sinais de trânsito em cone/barris de segurança (Traffic Cone), etc.

O objectivo desta classificação é facilitar o posterior planeamento da condução (Planeamento, alguns traduzidos em tomada de decisão) e controlo (Controlo) da condução do AD. Na etapa de percepção (Perception) do BEV, é pontuada a probabilidade destes objetos aparecerem na grade, e por fim a probabilidade é normalizada através da função Softmax para tirar a maior possibilidade conforme o tipo de objeto que ocupa esta grade.

Mas há um pequeno problema: na fase de treinamento do modelo DNN (Model) do BEV, é necessário indicar o que é cada objeto da foto? Ou seja, é necessário rotular vários objetos nos Labeled Data:

46f9393a21e0e0a84e1d65ec055277c3.png
Figura 11

Vamos pegar o da direita como dados rotulados e o da esquerda é a foto correspondente. O modelo DNN treinado de acordo com essa classificação de objeto realmente precisa ser executado na estrada. O que devemos fazer se encontrarmos um tipo de objeto que não aparece no conjunto de treinamento? E se o modelo não funcionar bem, por exemplo, um corpo humano em uma pose estranha não for reconhecido como pedestre e outros tipos conhecidos? A Occupancy Network mudou sua estratégia de percepção por esse motivo, não enfatizando mais a classificação (não nenhuma classificação, mas o foco mudou), e o foco principal é se existem obstáculos na estrada (Obstacle), apenas certifique-se de não bater nele , independentemente do seu tipo . É mais apropriado expressar esse tipo de obstáculo em um bloco de construção tridimensional. Em alguns lugares, o conceito comum no campo da renderização tridimensional (renderização/sombreamento) é emprestado e essa expressão tridimensional é chamada de voxel (Voxel) Imagine meu mundo (MineCraft) é fácil.

2dec520a6eb6ed962da1c178d77c26e0.png
Figura 12

O texto acima é uma breve descrição do gênero visual, o que a escola híbrida está fazendo? Além da câmera, eles também focam nos dados do lidar. O radar de ondas milimétricas se retira gradualmente devido à má qualidade dos dados, e os deixados para trás são usados ​​​​como radares de estacionamento. Não se pode dizer que seja é inútil. Embora Tesla enfatize o processamento visual, ele também retém todo o radar de ondas milimétricas voltado para a frente, e a tecnologia no campo de AD está mudando muito rápido. De repente, um novo algoritmo surgirá e o valor da onda milimétrica radar será levado adiante.

Quais são as vantagens do lidar: Ele pode medir diretamente a distância dos objetos e a precisão é muito maior do que a profundidade da cena estimada pela visão. Geralmente, ele será convertido em dados de profundidade (Depth) ou nuvem de pontos (Point Cloud ), e o algoritmo de correspondência dos dois tem uma longa história, portanto, o AD pode ser emprestado diretamente para reduzir a quantidade de desenvolvimento. Além disso, o lidar pode funcionar à noite ou em condições climáticas adversas, e a câmera será capturada às cegas.

Mas, nos últimos dias, surgiu uma nova tecnologia de percepção HADAR (Heat-Assisted Detection and Ranging), uma tecnologia de percepção em nível de sensor que pode ser comparada com câmeras/lidar/radar de ondas milimétricas. Caracteriza-se por usar um algoritmo especial para converter as imagens tiradas por imagens térmicas convencionais à noite na textura e profundidade do ambiente/objetos circundantes. Essa coisa e a câmera podem resolver o problema da percepção da visão noturna.

Por que o BEV anterior não mencionou imagens térmicas/câmeras infravermelhas, porque o algoritmo tradicional tem alguns defeitos óbvios: ele só pode fornecer a distribuição de calor da cena, formar uma imagem em tons de cinza (Gray), falta textura (Texture) e o os dados originais carecem de informações de profundidade. A precisão da profundidade calculada é ruim. Se apenas o contorno (Contorno) e a transição de brilho (Gradiente) extraídos da imagem em tons de cinza forem usados, será difícil restaurar com precisão as informações de volume da cena/objeto e o atual reconhecimento de objetos 2D é muito dependente de textura e cor. O surgimento desse HADAR pode justamente resolver esse problema: extrair a profundidade e a textura da cena em um ambiente mais escuro:

5fb7f9cc47d560979c48dbb0b987581e.png
Figura 13

Coluna da esquerda, de cima para baixo:

  1. Imagens térmicas básicas, conhecidas como T

  2. Profundidade extraída de T com algoritmos convencionais de imagem térmica

  3. Mapa de textura extraído de T com algoritmo HADAR

  4. Profundidade extraída de T com algoritmo HADAR

  5. Profundidade de Cenas Reais

Coluna da direita, de cima para baixo:

  1. Foto desta cena tirada com uma câmera de luz visível durante o dia

  2. Profundidade de raciocínio por meio de fotos

  3. Profundidade de Cenas Reais

As informações de profundidade do HADAR são tão antigas, basta comparar o efeito do lidar:

3ba969da92cb20d62b6879155be996e7.png
Figura 14

O alcance de varredura do lidar é limitado, geralmente com um raio de 100 metros. Como pode ser visto na figura acima, não há informações de textura e a cena à distância não tem profundidade. A linha de varredura faz com que seus dados sejam um estrutura esparsa (Sparse), e é necessário cobrir o raio Maior e mais denso (Dense) deve comprar modelos mais caros, é melhor parar e varrer um pouco. É claro que os fabricantes de módulos LiDAR devem fornecer imagens melhores ao exibir seus produtos. Somente o pessoal de P&D da AD sabe como é difícil.

Os conceitos acima são básicos. Como introdução ao algoritmo BEV, LSS (Lift, Splat, Shoot) deve ser mencionado primeiro:

https://link.zhihu.com/?target=https%3A//github.com/nv-tlabs/lift-splat-shoot

Old Huang's, muitos artigos o listaram como o trabalho inovador da BEV. Ele constrói um processo simples e eficiente:

Projete a foto da câmera de dados 2D para dados 3D e, em seguida, achate-a como uma mosca e, em seguida, olhe para essa cena achatada da perspectiva de Deus, que está especialmente alinhada com o modo intuitivo das pessoas que olham para os mapas. Geralmente, você terá dúvidas ao ver isso: os dados da cena 3D foram estabelecidos, o 3D não é bom? Por que você ainda quer achatar? Não é que eu não queira 3D, mas não tem jeito, não é um dado 3D perfeito:

83ac3d200220135636ecb3581835ac1e.png
Figura 15

Você já viu isso? É a essência do LSS. Vista de frente, pode formar uma foto 2D. Esta foto é ampliada para o espaço 3D pelo LSS, que é a imagem acima. Da perspectiva do BEV, é diretamente para cima e para baixo. O que será? Nada pode ser visto, então o acompanhamento do splat (Splat), o processo específico é o seguinte:

c3469e7613cd6da54322ef117241c829.png
Figura 16

Primeiro extraia os recursos e a profundidade da imagem (Feature e Depth, que são extraídos ao mesmo tempo no LSS, serão explicados em detalhes posteriormente), e o mapa de profundidade é semelhante:

cb701ba9b59775f296aa941ef85458c5.png
Figura 17

Pode-se apenas dizer que é semelhante, mas não é preciso, e será explicado em detalhes posteriormente. Essas informações de profundidade podem construir um modelo pseudo 3D (modo de nuvem de pontos de nuvem de pontos), semelhante à Figura 15:

5b44d9eadd1c48207f44ee3dd4959fe3.png
Figura 18

Parece bom, mas se você virar este modelo 3D para a visão superior do BEV, estima-se que a mãe não o reconhecerá:

91c9184b02e53f3b1599dbcfd28a1c10.png
Figura 19

Após o achatamento, combinado com o recurso Feature para fazer outro reconhecimento semântico, formando:

9dd967b747c04ab96c1398db4003208d.png
Figura 20

Este é o popular mapa BEV. O acima é a cognição intuitiva do LSS, como é realizado no nível do algoritmo?

Primeiro construa uma gaiola de arame em forma de cubo (8 de altura, 22 de largura e 41 de profundidade) para o campo de tiro de uma única câmera e use o grande Blender matador:

e2f4ee25982d173a26a2340e30efeace.png
Figura 21

Aqui está um diagrama esquemático, não se preocupe com o número e tamanho da grade. Esta grade 3D representa o tronco (Frustum) de uma câmera em todo o caminho. A forma do tronco é colada na frente (Figura 9). :

c0d5a96efc9a8318952b344a7c93cba3.png
Figura 22

À direita está um diagrama esquemático da câmera voltada para o cubo da grade, depois que a profundidade é extraída da foto (o tamanho real do pixel do mapa de profundidade é 8 de altura e 22 de largura):

a50a0c2493b08d754760a8c517fd142f.png
Figura 23

Depois de expandir o mapa de profundidade na direção da linha vermelha de acordo com a profundidade de cada pixel (Lift):

daff9cf9a7f5b1978745e9dab8e8cf12.png
Figura 24

Pode-se ver que alguns pixels de profundidade excederam o intervalo do frustum, porque o LSS assume um intervalo tão limitado de gaiolas desde o início e o excesso é filtrado diretamente. Deve ser lembrado aqui: o LSS não calcula diretamente a profundidade de cada pixel, mas infere a probabilidade de cada pixel estar em cada grade da gaiola. A Figura 24 extraiu em qual grade cada pixel provavelmente está localizado por meio do Softmax , e depois colocá-lo no resultado esquemático da grade correspondente, que é fácil de entender. Uma descrição mais precisa é a seguinte:

6ea2ebb1db3a9edf03575824e4804de0.png
Figura 25

Selecione um determinado pixel do mapa de profundidade na Figura 25 (a grade vermelha, na verdade, a resolução do mapa de profundidade LSS é muito pequena, o padrão é apenas 8*22 pixels, então aqui você pode usar uma grade como um pixel) , pertence à grade de profundidade da gaiola A na borda inferior (essa grade na verdade representa uma linha de visão que a câmera olha para a distância ao longo da profundidade):

949177bd1542a81521f8b153acab85b3.png
Figura 26

A distribuição de probabilidade do pixel vermelho de profundidade na Figura 25 ao longo da grade de linha de visão na Figura 26 é:

c30438a8286b4ebdcd5cd21c52e60444.png
Figura 27

Os altos e baixos da linha amarela representam a distribuição de probabilidade dos pixels do mapa de profundidade 2D ao longo da profundidade 3D da linha de visão após o levantamento (Distribuição de profundidade, eu desenho esquematicamente, não estritamente de acordo com os dados reais). Equivalente a esta imagem no papel LSS:

af63689a3c80b4bfd0d46e128a2118ea.png
Figura 28

O código para construir uma gaiola cúbica em LSS está localizado em:

class LiftSplatShoot(nn.Module):
    def __init__(self, grid_conf, data_aug_conf, outC):
        self.frustum = self.create_frustum()
    def create_frustum(self):
        # D x H x W x 3
        frustum = torch.stack((xs, ys, ds), -1)
        return nn.Parameter(frustum, requires_grad=False)
    def get_geometry(self, rots, trans, intrins, post_rots, post_trans):
        """Determine the (x,y,z) locations (in the ego frame)
        of the points in the point cloud.
        Returns B x N x D x H/downsample x W/downsample x 3
        """
        B, N, _ = trans.shape

        # undo post-transformation
        # B x N x D x H x W x 3
        points = self.frustum - post_trans.view(B, N, 1, 1, 1, 3)
        points = torch.inverse(post_rots).view(B, N, 1, 1, 1, 3, 3).matmul(points.unsqueeze(-1))

        # cam_to_ego
        points = torch.cat((points[:, :, :, :, :, :2] * points[:, :, :, :, :, 2:3],
                            points[:, :, :, :, :, 2:3]
                            ), 5)
        combine = rots.matmul(torch.inverse(intrins))
        points = combine.view(B, N, 1, 1, 1, 3, 3).matmul(points).squeeze(-1)
        points += trans.view(B, N, 1, 1, 1, 3)

        return points

Para facilitar a análise, cortei o código. O tamanho do tronco de uma única câmera é: D x A x L x 3 (profundidade D: 41, altura A: 8, largura L: 22), ou seja, um contêiner D x A x L é criado e cada grade de o container Os valores das coordenadas (X, Y, Z) desta grade são armazenados.

e680b1c26260c487152374e2505e8613.png
Figura 29

De fato, um novo sistema de coordenadas composto de profundidade Z é expandido no sistema de coordenadas foto (uv). Como o padrão do LSS é 5 câmeras, enviar 5 Frustums para a função get_geometry produzirá uma gaiola combinada composta por 5 Frustums e seu tamanho de tensor se tornará: B x N x D x A x L x 3, onde B É batch_size, o padrão são 4 conjuntos de dados de treinamento e N é o número de câmeras 5.

Em get_geometry, um deve ser feito no início

# undo post-transformation

Para que serve esta coisa? Isso está relacionado ao conjunto de treinamento. No aprendizado profundo, existe um método para aprimorar as amostras de treinamento existentes, geralmente chamado de Augmentation (na verdade, o A em tecnologia AR é Augmentation, que significa aprimoramento). de: Flip/Pan /Zoom/Crop, adicione algum ruído aleatório (Noise) à amostra. Por exemplo, antes do aprimoramento da amostra, o ângulo da câmera permanece inalterado. Após o treinamento, o modelo reconhece apenas as fotos desse ângulo e, após o treinamento após o aprimoramento aleatório, o modelo pode aprender a adaptabilidade dentro de um determinado intervalo de ângulos, ou seja, Robustez.

42f9e486630d9057bb47811e24019ce7.png
Figura 30

A tecnologia de aumento também tem teorias e métodos relacionados, então vou postar uma foto aqui e não entrar em detalhes. O código para aprimoramento de dados geralmente está localizado no DataLoader:

class NuscData(torch.utils.data.Dataset):
   def sample_augmentation(self):

Voltando ao get_geometry agora, o aprimoramento de dados adicionará algumas alterações aleatórias às fotos, mas a própria câmera deve ser corrigida, para que o modelo DNN possa aprender as regras dessas alterações aleatórias e se adaptar a elas. Portanto, ao colocar o Frustum de 5 vias no sistema de coordenadas do corpo, você deve primeiro remover (desfazer) essas alterações aleatórias.

Então passe:

# cam_to_ego
        points = torch.cat((points[:, :, :, :, :, :2] * points[:, :, :, :, :, 2:3],
                            points[:, :, :, :, :, 2:3]
                            ), 5)
        combine = rots.matmul(torch.inverse(intrins))
        points = combine.view(B, N, 1, 1, 1, 3, 3).matmul(points).squeeze(-1)
        points += trans.view(B, N, 1, 1, 1, 3)

Transfira cada Frustum do sistema de coordenadas da câmera para o próprio sistema de coordenadas do veículo. Observe que os intrins aqui são os parâmetros internos da câmera, e os rots e trans são os parâmetros externos da câmera. Eles são fornecidos pelo conjunto de treinamento nuScenes. Aqui, apenas o os intrínsecos usam a matriz inversa, enquanto os externos não há parâmetro, porque o nuScenes primeiro coloca cada câmera na origem do corpo, e depois realiza o offset trans e depois a rotação apodrece de acordo com a pose de cada câmera, então não há necessidade de fazer cálculos inversos aqui. Se você alterar o conjunto de dados ou configurar sua própria câmera para coletar dados, precisará descobrir a definição e a ordem de cálculo dessas matrizes de transformação.

As quatro visualizações são mais ou menos assim:

a0a2516341499fca5f3ffde1cc26fb4a.png
Figura 31

Os módulos para inferir características de profundidade e foto no LSS estão localizados em:

class CamEncode(nn.Module):
    def __init__(self, D, C, downsample):
        super(CamEncode, self).__init__()
        self.D = D
        self.C = C

        self.trunk = EfficientNet.from_pretrained("efficientnet-b0")

        self.up1 = Up(320+112, 512)
        self.depthnet = nn.Conv2d(512, self.D + self.C, kernel_size=1, padding=0)

Trunk é usado para inferir a profundidade original e recursos de imagem ao mesmo tempo. Depthnet é usado para interpretar a saída de dados original pelo tronco nas informações exigidas pelo LSS. Embora o depthnet seja uma rede convolucional, o tamanho do kernel de convolução (Kernel) é apenas 1 pixel e a função é próxima. Uma rede totalmente conectada FC (Full Connected), o trabalho diário do FC é: classificação ou ajuste. Para recursos de imagem, é semelhante à classificação aqui. Para recursos profundos, é semelhante para ajustar uma distribuição de probabilidade de profundidade. EfficientNet é uma ResNet otimizada, basta olhar para ela como uma rede convolucional avançada (CNN). Para esta rede convolucional, não há diferença lógica entre feições de imagem e feições de profundidade , ambas localizadas na mesma dimensão no tronco, apenas distinguindo o canal.

Isso leva a outro tópico: como raciocinar/extrair recursos profundos de uma única imagem 2D. Este tipo de problema é geralmente chamado de: Estimativa de profundidade monocular, estimativa de profundidade monocular. Geralmente, há dois estágios neste tipo de sistema: processamento grosseiro (previsão grosseira) e processamento fino (previsão refinada). com base nisso e extrapolar para profundidades mais finas. Isso é semelhante a um pintor que primeiro desenha o contorno da cena com pinceladas simples e depois desenha a imagem parcial em detalhes.

Além de usar redes convolucionais para resolver esse tipo de problema de estimativa de profundidade, existem também redes convolucionais de grafos (GCN) e Transformers, bem como modelos DNN que dependem de equipamentos rangefinder (RangeFinder). nada menos complicado do que o próprio BEV.

Então o LSS aqui só usa um trunk para pegar os recursos profundos, é muito infantil, na verdade é. A precisão de profundidade e a resolução estimadas pelo LSS são extremamente ruins. Consulte vários relatórios de teste sobre problemas de profundidade do LSS no projeto BEVDepth:

https://link.zhihu.com/?target=https%3A//github.com/Megvii-BaseDetection/BEVDepth

No teste BEVDepth, descobriu-se que se os parâmetros da parte de estimativa de profundidade LSS forem substituídos por um número aleatório e o processo de aprendizado (Back Propagation) não estiver envolvido, o efeito geral do teste BEV é apenas ligeiramente reduzido. Mas deve ser explicado que o mecanismo de elevação em si é muito forte. Este método inovador em si é bom, mas o link de estimativa de profundidade pode ser ainda mais fortalecido.

Há outro problema no processo de treinamento do LSS: cerca de metade dos dados na foto contribuem com 0. Na verdade, esse problema existe na maioria dos algoritmos BEV :

53b35db2b5e82f1c8c92845f5e5418c1.png
Figura 32

Os dados rotulados à direita, na verdade, descrevem apenas a área abaixo da linha vermelha da foto. A metade da linha vermelha é desperdiçada. Você deve perguntar o que o modelo em LSS calcula para a metade superior. Não sei, porque não há dados rotulados. Correspondentemente, a maioria dos BEVs são treinados dessa maneira, portanto, esse é um fenômeno comum. Durante o treinamento, o BEV escolherá um intervalo fixo de dados de rotulagem ao redor, e as fotos geralmente capturam cenas mais distantes. Os dois são inerentemente incompatíveis no escopo. Por outro lado, parte do conjunto de treinamento se concentra apenas na rotulagem da superfície da estrada, sem arquitetura, porque atualmente o BEV resolve principalmente problemas de direção e não se preocupa com edifícios / vegetação.

É por isso que o mapa de profundidade na Figura 17 é inconsistente com o mapa de profundidade real dentro do LSS. O mapa de profundidade real possui apenas dados válidos próximos à superfície da estrada:

8b59fc620f397b42535ef55ee8fed8ee.png
Figura 33

Portanto, parte do poder de computação de todo o modelo BEV DNN está fadado a ser desperdiçado. Eu não vi nenhum trabalho de pesquisa sobre este aspecto até agora.

Em seguida, continue a aprofundar o processo de cálculo do Lift-Splat do LSS:

def get_depth_feat(self, x):
        x = self.get_eff_depth(x)
        # Depth
        x = self.depthnet(x)

        depth = self.get_depth_dist(x[:, :self.D])
        new_x = depth.unsqueeze(1) * x[:, self.D:(self.D + self.C)].unsqueeze(2)

        return depth, new_x    
   def get_voxels(self, x, rots, trans, intrins, post_rots, post_trans):
        geom = self.get_geometry(rots, trans, intrins, post_rots, post_trans)
        x = self.get_cam_feats(x)

        x = self.voxel_pooling(geom, x)

        return x

O new_x aqui é multiplicar diretamente a distribuição de probabilidade de profundidade pelo recurso de textura da imagem. Para compreensão intuitiva, assumimos que o recurso de imagem tem 3 canais: c1, c2, c3 e a profundidade é de apenas 3 grades: d1, d2, d3 . Tomamos um determinado pixel da imagem e os significados que eles representam respectivamente são: c1: há 70% de possibilidade de que esse pixel seja um carro, c2: há 20% de possibilidade de que seja uma estrada, c3: há a 10% de possibilidade É um sinal de luz, d1: há uma probabilidade de 80% de que este pixel esteja na profundidade 1, d2: há uma probabilidade de 15% de que esteja na profundidade 2 e d3: há uma probabilidade de %5 que está na profundidade 3. Se você multiplicá-los, obterá:

d3f8206f31272734b91e675775405505.png

Então a probabilidade máxima desse pixel é: um carro na profundidade 1. Isto é o que está no LSS:

560989720b063e9edad3b9182e0b19d2.png

O significado da fórmula, observe que ele chama o recurso de imagem c (Contexto), o significado de a_d é a distribuição de probabilidade da profundidade ao longo da linha de grade de visão e d é a profundidade. new_x é o resultado desse cálculo. Como mencionado anteriormente, como os recursos de imagem e profundidade são treinados pelo tronco, eles estão localizados na mesma dimensão, mas ocupam canais diferentes, a profundidade ocupa o primeiro self.D (41) canais e o contexto ocupa o segundo self. canal C (64).

Como new_x é calculado separadamente de acordo com o Frustum de cada câmera, e os cinco Frustums possuem áreas sobrepostas, a fusão de dados é necessária, então o índice da grade e a posição espacial correspondente são calculados em voxel_pooling. Por meio dessa correspondência, o new_x O conteúdo é carregado na grade do índice especificado um por um.

O poder computacional do LSS em voxel_pooling apresenta o mecanismo de cumsum. Embora existam muitos artigos explicando, não é recomendado gastar muito esforço aqui. É apenas um pequeno truque de cálculo, que é a cereja do bolo para todo o LSS e não é necessário.

① Cursos em vídeo exclusivos em toda a rede

Percepção BEV, fusão de visão de radar de ondas milimétricas, calibração multissensor, fusão multissensor, detecção multimodal de objetos 3D, detecção de objetos 3D em nuvem de pontos, rastreamento de objetos, ocupação, implementação de modelo cuda e TensorRT, percepção colaborativa, segmentação semântica, simulação de direção autônoma, implantação de sensor, planejamento de decisão, previsão de trajetória e outros vídeos de aprendizado (aprendizagem de código de varredura)

ca19b5b7b29e59c89e3dec92977c29cd.png Site oficial do vídeo: www.zdjszx.com

② A primeira comunidade de aprendizado de direção autônoma na China

Uma comunidade de comunicação de quase 2.000 pessoas, envolvendo mais de 30 rotas de aprendizado de pilha de tecnologia de direção autônoma, que desejam aprender mais sobre a percepção de direção autônoma (detecção 2D, segmentação, linhas de faixa 2D/3D, percepção BEV, detecção de objeto 3D, ocupação, multi- fusão de sensores, calibração multissensor, rastreamento de alvo, estimativa de fluxo óptico), posicionamento e mapeamento automático de direção (SLAM, mapa de alta precisão, mapa online local), controle automático de planejamento de direção/previsão de trajetória e outras soluções técnicas, implantação de modelo AI em combate real, tendências da indústria, anúncio de emprego, bem-vindo ao digitalizar o código QR abaixo para ingressar no planeta do conhecimento do coração da direção autônoma, este é um lugar com produtos secos reais, comunique-se com os líderes de campo sobre vários problemas para começar, estudar , trabalhando e trocando de emprego e compartilhando papéis + códigos diariamente + Vídeo , ansioso pela comunicação!

055491ffe36d198bb3283cae1f67e251.png

③【Heart of Autopilot】Grupo de intercâmbio técnico

The Heart of Autopilot é a primeira comunidade de desenvolvedores de piloto automático, com foco na detecção de objetos, segmentação semântica, segmentação panorâmica, segmentação de instância, detecção de pontos-chave, linhas de faixa, rastreamento de objetos, detecção de objetos 3D, percepção BEV, percepção multimodal, ocupação, multi -fusão de sensores, transformador, modelo grande, processamento de nuvem de pontos, direção automática de ponta a ponta, SLAM, estimativa de fluxo óptico, estimativa de profundidade, previsão de trajetória, mapa de alta precisão, NeRF, controle de planejamento, implantação de modelo, teste de simulação de direção automática , gerente de produtos, configuração de hardware, pesquisa e comunicação de empregos de IA , etc. Digitalize o código QR para adicionar o WeChat do Autobot Assistant para convidar para entrar no grupo, observe: escola/empresa + direção + apelido (maneira rápida de entrar no grupo)

bfabfab2b6f5c0a1fa38df8fcac21768.jpeg

④【Automatic Driving Heart】Platform matrix, entre em contato conosco!

5f7f6b7f6257c617b3eb41bf87ebf3a9.jpeg

Acho que você gosta

Origin blog.csdn.net/CV_Autobot/article/details/132114702
Recomendado
Clasificación