본문 바로가기
  • 경제적 자유를 얻는 그날까지
기술과학

AI Day를 통해 살펴본 테슬라 자율주행 기술 분석(1)

by 베니스상인 2021. 8. 23.

이 글에 게시된 모든 자료는 테슬라 공식 AI Day Streaming 자료에서 발췌해 온 것임을 밝혀드립니다.

 

테슬라는 정말 놀라운 회사라는 생각이 드는데요. 어떤 회사도 자신들이 하는 일들을 아주 디테일하게 공개적으로 소개하는 회사는 아직 본적이 없는 것 같습니다. 대부분 회사 IP(지적재산권)로 규정하여 다른 사람들이 도용하지 못하게 하는 것이 현실이죠.

 

그런데 테슬라는 놀랍게도 최고의 엔지니어들이 개발한 성과물을 세미나 하듯이 발표를 합니다. 뉴럴 네트워크, 자율주행, 컴퓨터 비전 쪽 전공자 분들에게는 정말 반가운 일이 아닐까 합니다.

 

저도 테슬라 AI day를 그냥 듣고 넘기기 보다는 기술적인 의미를 심도있게 이해하려고 이번 포스팅을 하게 되었습니다. 앞으로는 테슬라의 방법으로 자율주행을 구현하는 회사들이 많아질거라 생각합니다. 그런 의미에서 이번 AI Day를 깊이 관찰하는 것은 좋은 접근 방법이라고 생각합니다.

 

분량이 많아서 몇번에 걸쳐 다룰 예정인데요. 오늘은 테슽라 AI 팀 리더인 안드레 카파시가 발표한 내용을 정리해보도록 하겠습니다.

 

 

자율주행 부문 발표

발표자: 안드레 카파시(Andrej Karpathy) 

직책: AI Director in Tesla

출신: Computer science at Stanford univ.

 

 

안드레 카파시는 스탠퍼드 대학졸업후 테슬라에 조인하였고, 현재는 AI 팀 디렉터를 맡고 있습니다. 스탠퍼드 대학시절 딥러닝의 대가이며 ImageNet을 개발한 페이페이 리 교수님 밑에서 박사과정을 마쳤습니다. 이후에는 딥마인드 인턴을 거쳐 OpenAI에서 하였습니다. 

 

그의 블로그를 방문해보면 " like to train deep neural nets on large datasets" 라고 적혀있습니다. 딥러닝 알고리즘도 중요하지만 무엇보다 학습할 수 있는 데이터의 량과 품질의 문제를 중요시하고 있는 것 같습니다.

 

아래는 안드레 카파시의 블로그와 github 입니다. 시간이 되시면 한번씩 방문해보시는 것도 좋을 것 같습니다.

 

https://karpathy.ai/

 

Andrej Karpathy

IJCV 2015 Olga Russakovsky, Jia Deng, Hao Su, Jonathan Krause, Sanjeev Satheesh, Sean Ma, Zhiheng Huang, Andrej Karpathy, Aditya Khosla, Michael Bernstein, Alexander C. Berg, Li Fei-Fei

karpathy.ai

 

https://karpathy.github.io/

 

Andrej Karpathy blog

 

karpathy.github.io

 

https://karpathy.medium.com/

 

Andrej Karpathy – Medium

Read writing from Andrej Karpathy on Medium. I like to train deep neural nets on large datasets. Every day, Andrej Karpathy and thousands of other voices read, write, and share important stories on Medium.

karpathy.medium.com

 

 

https://github.com/karpathy

 

karpathy - Overview

I like to train Deep Neural Nets on large datasets. - karpathy

github.com

 

 

 

 

 

테슬라 SW중 Autopilot Stack의 비전관련 분야입니다.

 

테슬라는 자율주행을 위해 8개의 카메라를 사용합니다. 테슬라 자율주행의 목표는 카메라로부터 받은 raw 이미지를 처리하기 위한 Neural Networks를 설계하는 것이 목표입니다.  

 

테슬라는 이 이미지를 백터화하여 처리하고 있습니다. 이미지를 백터화한 이유는 도로의 커브, 신호등, 표지판이나 차량등의 물체를 인식하고 이것들의 방향, 위치, 속도에 대한 정보를 얻기 위함입니다. 상세한 내용은 아래에 다시 언급하겠습니다. 

 

아무튼 테슬라가 사용자에게 보여주는 자율주행의 결과는 랜더링처리되어 백터화된 정보가 스크린으로 나타나게 됩니다.

 

 

 

 

인공지능 신경계

 

테슬라는 자동차는 주변환경을 인지하며 돌아다니는 생명체와 같다고 말하고 있습니다.  그리고 인지능력이 있어 판단하며, 반응합니다. 이러한 인지구조를 생물학적인 Human brain을 통하여 설명하고 있습니다. 

 

왼쪽에 있는 그림은 인간의 생물학적인 시각처리 매커니즘을 보여주고 있습니다. 빛정보가 망막(Retina)에 닿게 되면 외측슬상액(LGN)을 거쳐 시각피질(Visual Cortex)에 정보가 전달됩니다. 시각피질은 눈으로 들어오는 정보를 체계화하기 위한 시각구조를 가지고 있습니다.

 

테슬라는 카메라 영상정보의 처리방식을 인간의 생물학적 시각구조를 바탕으로 디자인하였습니다. 그리고 시각정보를 처리하는 방식을 Neural Network 아키텍쳐를 이용하여 디자인하였습니다. 아래 그림의 오른쪽은 림의 인간의 시각처리 매커니즘을 Network의 Task로 도식화 해놓은 것입니다.

   

테슬라 Network 구조 설계: 하이드라넷

 

4년전 자율주행방식은 하나의 차로에서만 사용이 가능했습니다. 당시 다수의 차로를 인식하기는 훨씬 어려웠습니다. 고속도로에서 직진할 때도 앞뒤 차와의 간격을 유지해야 했습니다. 그리고 모든 이미지 처리는 Single Frame 기반으로 처리하였습니다. 한 장의 영상을 입력으로 받아 객체를 검출하고 정보로 이용하였습니다.

 

이러한 접근방법으로는 문제를 해결하기는 어려웠습니다. 그래서 생각해낸 방법이 여러대의 카메라를 이용하여 입력받은 이미지를 벡터 공간으로 변환하여 처리하는 방법을 고안해 냈습니다. 하나의 이미지가 Nueral Network에 의해 분석되고 특징을 추출하여 벡터공간에서 처리되도록 하는 방식입니다.

 

각각의 카메라는 1280x960 해상도의12 비트 raw 이미지를 36Hz 로 스트리밍합니다.raw 이미지는 RegNet을 통하여 작은 타일 형태의 특징정보로 추출이 됩니다. Backbone은 Network 구조에서 가장 많이 사용하고 처리되는 부분을 말하는데요 여기서는 RegNet이 테슬라 Network의 Backbone이 됩니다.

 

 

다음은 BiFPN(Bi-directional Feature Pyramid Network)에서 여러장의 피라미드 이미지를 형성하여 멀티 스케일의 특징정보를 처리합니다. BiFPN은 테슬라 Netowk 구조에서 Neck 부분에 해당됩니다. 멀티 스케일 처리가 왜 필요한지 물으신다면 현실세계에서 물체의 크기는 동일하지만 사람의 시각처리 메커니즘처럼 카메라를 통하여 입력받는 영상은 크기가 다양합니다. 따라서 크기가 작은 물체를 검출하기 위해서는 낮은 스케일의 이미지에서 여러가지 특징들을 보다 섬세하게 찾아볼 수 있습니다. 반면 높은 스케일의 이미지에서는 넓은 시야각의 이미지를 처리하게 되므로 전체 내용을 큰 맥락에서 판단할 수 있습니다.  

 

따라서 다양한 물체를 검출하고 판단하기 위해 멀티 스케일 기법을 이용하고 서로 다른 해상도의 정보를 활용하기 위해 Feature Fusion 과정을 수행하게 됩니다.

 

예를 들어서 아래 사진처럼 고속도로 끝에 있는 물체가 무엇인지 아직 판단하기 어렵습니다. 차인지 아니면 다른 물체인지를 빨리 판단해야 하는데 높은 스케일 이미지에서는 디테일한 정보를 파악하기 어렵습니다. 이러한 경우에는 낮은 스케일의 이미지를 이용하여 차인지 아닌지를 판단하는데 도움을 줄 수 있습니다. 상황에 따라 높은 해상도 이미지와 낮은 해상도 이미지를 적절하게 전환하면서 검출을 하게 됩니다.

 

 

다음과정은 Header 부분에서 객체인식과정을 수행합니다.

 

차가 있는지 아닌지를 바이너리 비트로 확인 과정을 거치게 됩니다.  만약 차가 있다면 X, Y축, 높이, 오프셋등 차로 판단하기 위한 여러 특징들을  확인하여 객체 인식과정을 수행합니다. 이러한 인식과정은 하나의 차량만 하는 것이 아니고 입력되는 raw 이미지에 존재하는 모든 물체에 대해 수행하게 됩니다. 인식 결과 신호등, 도로, 차량, 사람들 다양한 물체를 클래스의 형태로 검출하게 됩니다.

 

이런식의 아키텍쳐를 공통 백본에서 많은 헤드로 뻗어나가도록 신경망이 구축되어 있는데 이것을 하드라넷(HydraNets)이라고 명칭합니다.

 

하이드라넷에서 각각의 Task가 Head에 해당되는 부분이고, RegNet은 Raw 이미지를 다수의 특징으로 추출하는 Backbone입니다. 그리고 Head와 Backbone을 연결해주는 Neck에 해당되는 부분이 BiFPN입니다.

 

 

 

하이드라넷과 같은 구조가 가지는 장점이 있습니다.

 

먼저 첫번재로 서로 특징들을 공유하기 때문에서 테스트차량에서 계산과 추론과정을 줄일 수 있습니다. Backbone이 공통적으로 있기 때문에 효율적입니다.

 

두번째는 모든 작업은 모듈화로 설계되어 각각 독립적으로 수행할 수 있습니다.

예를 들어 특정한 데이터셋으로 운영할 수도 있고 아키텍쳐의 헤더를 변경할수도 있습니다. 하지만 다른 모듈에 영향을 주지는 않습니다. 재검증하기 위해 많은 비용이 들 필요도 없습니다.

 

세번째는 Neck 부분에서 병목현상이 생길수 있습니다. 이 부분에서 생성한 특징들을 캐쉬에 저장해 놓습니다. 파인 튜닝을 할 때에는 캐쉬에 있는 것을 이용하여 해드망 튜닝을 수행합니다. 

 

 

 

초기 FSD의 문제점 및 개선방안

 

아래 영상은 FSD의 초기모델입니다. FSD의 처음 모델은 이미지 기반이었습니다. 모든 과정이 하나의 이미지에서 이루어졌습니다.  이 과정에서도 정지신호, 신호등, 차선, 도로곙계, 주차된 차들읃 잘 예측하는 것을 볼 수 있습니다.  잘 동작하는 편이었지만 부족한 점이 있었습니다.

 

첫번재 문제는 8개의 이미지를 이용하여 도로의 커브를 인식하는 문제입니다.

아래 영상은 차량을 호출한 주인을 찾기위해 주차장을 돌아다니는 있는 영상입니다. 영상을 보시면 대부분 영상이 비슷하게 보이며 영상에서는 맵 정보를 찾을 수 없기 때문에 보이므로 이미지의 공간 예측만으로는 직접 주행을 할수 없습니다. 따라서 이러한 문제점은 차량 주변을 벡터공간으로 구성하여 맵을 만들수 있어야 합니다. 

 

 

그래서 당시 C++을 이용하여 occupancy tracker를 개발했습니다. 아래 영상은 개발된 occupancy Tracker로 맵을 형성하여 주행하고 있는 영상입니다. 커브를 인식하고 카메라별 영역에 대한 장면들을 계속해서 스티칭해나가고 있습니다.

 

하지만 occupancy Tracker도 몇가지 문제가 있습니다. 

첫번째는 튜닝과 하이퍼 파라미터가 엄청 복잡하다는 것입니다. 일일이 수작업으로 하는 것은 불가하고 Neural Network로 학습해야 합니다.

 

두번째는 이미지 공간이 실제가 아니라는 점입니다. 실제가 아니기 대문에 현실과 매핑할 수 있는 벡터공간이 필요하게 됩니다.

 

 

Occpancy Tracker를 이용하여 벡터공간으로 변환하였을 때 아래와 같은 영상을 얻었습니다.

각각의 카메라에서 검출된 커브와 도로들은 제법 잘 인식한 것처럼 보이지만 이것을 벡터공간으로 변환하면 엉망으로 나타나 버립니다. 원인은 픽셀별로 정확한 깊이를 예측할 수 없기 때문입니다. 그리고 각각의 카메라에서 획득한 영상을 Single Frame기반으로 처리하기 때문에 가려진 부분을 예측하는 것도 불가능합니다.

 

 

카메라에서 이미지만 사용할 경우 또 한가지 문제는 한 대의 차량이 여러대의 카메라에 나타나면서 다른 차량으로 인식할 수 있습니니다. 아래 영상에서 트럭이 5개의 카메라에 서로 다른 모습으로 나타나게 되는데 카메라가 차량 전체를 다 볼 수 없기 때문에 서로 다른 차량으로 인식할 수 있습니다.

 

 

이러한 문제점들을 보완하기 위하여 이 이미지들을  백터공간으로 변환할 수 있는 Network를 설계했습니다.

 

하지만 이 구조를 사용하기 위해서는 해결해야 할 과제가 있습니다.

첫번째, 이미지 공간에서 벡터 공간으로 변환하기 위한 Network는 어떻게 만들 것인가?

두번째, 트레이닝을 하기 위해서 벡터공간의 데이터셋을 어떻게 구할 것인가? 이미지 공간의 레이블링으로는 안되고 벡터공간의 레이블링이 필요합니다. 

 

 

Vector Space Network 설계

 

벡터공간 변환을 위한 Network 에 대한 설명입니다. 

아래 그림은 카메라의 영상을 기반으로 버드 아이뷰를 구성한 것입니다. 버드 아이뷰에서 노란색 픽셀은 각 카메라의 영상에서 어디에 해당될까요? 이 노란색 블럭은 실제로는 영상에서 커브에 있는 일부를 가지고 온 것입니다. 카메라의 물리적인 위치와 내/외부 파라미터를 알고 있으면 대략적으로 위치 추정은 가능합니다만 프로젝션이 정확하게 이루어지지 못하면 정확한 위치를  알 수 없습니다 . 그리고 이것인 커브인지 아닌지도 판단하기는 어렵습니다. 주변에 있는 도로는 선형적인데다가 도로면 경사가 오르막이나 내리막일 수도 있습니다.  데이터 자체의 오차때문에서 판단이 어려울수도 있고 다른 차가 지나가면서 가려지기만 해도 판단은 어렵게 됩니다.   

 

 

이 문제를 해결하기 위해 Multi-Headed Self-Attention을 사용하는 Transformer를 사용합니다.

 

원하는 출력 공간 만큼의 래스터이미지를 초기화하고 출력 공간에서 sin,cos함수를 이용한 위치 정보를 인코딩합니다.  그리고 이것을 MLP(Multi-Layer Perceptron)와 query 백터 속으로 인코딩합니다. 이미지와 특징들은 고유의 ket와 value를 가지고 있습니다. Key와 value에 대한 쿼리가 Transformer로 입력됩니다.  모든 이미지 조각들이 각자의 key를 가지고 매칭을 시작합니다.

 

 

여기서 한가지 고려해야할 것이 있습니다.

이미지 정보를 벡터공간으로 변환하기 위해서는 정확한 카메라 캘리브레이션이 필요합니다. 대부분의 차량들은 살짝 서로 다르게 각도차가 있을 수 있습니다. 캘리브레이션이 정확하지 않으면 이러한 각도차를 구별할 수 없습니다. 그래서 이미지 공간에서 벡터공간으로 변환을 할 때에는 정확한 캘리브레이션을 수행하고 그 파라미터를 Network에 반영해주어야 합니다.

 

정리하자면 모든 이미지의 특수한 변환과정을 통하여 합성된 하나의 가상카메라로 변환됩니다.

 

 

아래 영상은 위 설명과 같이 카메라 캘리브레이션이후 이미지를 벡터공간으로 구현하였을 때를 이전 결과와 비교한 영상입니다. 차선인식이나 도로 인식 면에서 놀라울만큼 정확도라 향상된 것을 보실수 있습니다.

 

 

 

Spatial Recurrent Neural Network 설계

 

다음은 싱글 카메라와 멀티 카메라의 객체검출 성능을 비교해보겠습니다.  오렌지색이 싱글 카메라이고 파란색은 멀티 카메라입니다. 싱글 카메라는 하나씩 있는 객체는 잘 검출해 낼 수 있지만 겹치거나 부분적으로만 보이는 객체에 대해서는 높은 오차를 나타냅니다.

 

그 이유는 기본적으로 싱글카메라를 사용할 경우 화각이 좁아서 큰 물체를 제대로 인식하기 어렵습니다. 반면 멀티 카메라는 여러대의 카메라를 사용하여 넓은 화각을 구성할 수 있기 때문에 상대적으로 훨씬 정확한 예측이 가능합니다. 

 

 

싱글 카메라는 프레임마다 발생하는 독립적인 이벤트에 대한 처리하는 방식입니다. 과거의 기억이나 이어져온 정보가 없다는 것인데요. 아래 그림에서 보이는 차량들이 주행중인 차들인가요? 정지된 차들일까요?

 

싱클 카메라를 기반으로는 이러한 상황을 판단할 수 없습니다. 따라서 프레임간의 시간적인 정보가 필요합니다. 객체의 상태를 과거로부터 추적할 수 있는 정보를 가지고 있어야 전후 맥락을 파악하여 예측이 가능합니다. 

 

따라서 Neural Network 구조에 비디오 모듈을 추가하였습니다. 비디오 모듈에서는 Feature queue에 캐쉬화하여 저장된 특징정보들을 주기적으로 공급받아 객체를 인식하기 위한 정보로 사용합니다.

 

그 외 kinematics 정보도 사용하게 되는데 검출된 객체의 속도와 가속도 정보를 사용합니다. 예전카메라에서부터 어떻게 주행했는지를 살펴볼 수 있을 뿐아니라 현재의 주행상태도 파악할 수 있습니다. 

 

 

Feature Queue의 레이아웃입니다. 차량의 운동정보 kinematics, 위치정보 인코딩, features등을  연결시켜서 feature queue에 저장되고 이 정보를 비디오 모듈이 사용하게 됩니다. 

 

pop과 push 과정에 대해 살펴보겠습니다.  

 

주행을 하다가 교차로를 만나게 되면 교차신호가 떨어질때 지나가는 차들을 만나게 됩니다. 전방 차량들이 지나가면서 차량의 일부가 가리는 경우가 발생합니다.   

 

Feature queue에서는 push를 보내고자 할 때 시간 기준으로 queue를 이용하려고 합니다. 매 주기마다 queue에 Feature를 집어 넣습니다. 그래서 다른 차량이 일시적으로 가려지면 비디오 모듈은 과거 캐시 중 비슷한 경우를 찾아서 객체를 식별하는 작업을 합니다.

 

도로의 지형과 구조를 미리 예측하고자 한다면 Lane geometry mark를 참조하여 차선을 예측할 수 있습니다. 차선을 정확하게 인식하는 것도 중요하지만 한참 전에 인식된 정보가 교차로에서 기다리는 동안 사라졌을 수도 있기 때문에 시간 베이스만 이용하지 않고 공간 베이스의 정보도 활용하게 됩니다. 차가 움직이는 일정거리마다 계속 push를 보내게 됩니다. 

 

 

이 비디오 모듈들의 정보를 융합할 수 있는 방법을 고민했습니다.  3D Conv, Transfomers, Axial Transformers 등

RNN(Recurrnt Neural Networks)Spatial RNN을 선택했습니다. 

 

 

구조적 문제 때문에 2차원 표면에서 주행을 하고 보이지 않는 부분의 상황을 격자위에 체계화합니다. 주행을 하다가 차량 주변에 보이기 시작하는 부분만 업데이트 합니다. 차가 주행할 때에는 차량위치와 숨겨진 특징들을 통합하기 위해 kinematics 정보를 이용합니다.  차량 가까운 곳이 보이기 시작할 때에만 RNN을 업데이트해줍니다.

 

 

 RNN이 시간대별로 상황을 계속추적하면서 얼마나 성능이 좋아지는지 알 수 있습니다. Neural Network가 메모리에서 선택적으로 읽고 쓸 수 있는 능력이 생겼다는 것을 알 수 있습니다.  다른 차량에 의 해 가려져서 잠깐동안 도로의 일부가 보이지 않더라도 그 위치를 그대로 저장하지 않고 차량이 지나가고 나면 명확하게 보이는 정보를 저장하게 됩니다. 

 

 

Spatial RNN을 통하여 백터 공간으로 변환된 영상입니다. 도로는 적색, 교채로는 청색, 도로중앙선 등에 대한 예측을 보여줍니다. 

많은 트립이 있지만 매우 많은 차량과 클립들의 데이터를 통해 SPNN이 맵 정보를 만들 수 있습니다.    

 

 

비디오 모듈을 통한 객체 인식 능력 향상하였습니다.

싱글 프레임과 비디오 프레임의 비디오 객체 인식 능력을 비교하고 있습니다. 앞쪽에 두대의 차량이 교차로에 있습니다. 앞쪽이 가려지지 않은 상황에서는 싱글 프레임과 비디오 프레임 좋은 인식 성능을 나타냅니다.  하지만 교차로 앞쪽의 다른 차량으로 인해 가려지게 되면 싱글 프레임은 검출을 해내지 못합니다. 그리고 차가 지나가면서 일부가 보이게 되면  예측을 최대한 하려고 하지만 오차가 너무 심하게 나타납니다. 

비디오 프레임은 차량의 일부가 가려졌다는 것을 알고 있기 때문에 잘 보이지 않는 차랑은 업데이트 하지 않습니다.

 

 

 

거리와 속도에 대한 인식 능력도 매우 향상되었습니다. 측정하기 위해 레이다를 사용하였습니다. 레이다가 측정한 거리와 속도 값은 녹색입니다. 오렌지색은 싱글 프레임이고, 파란색은 비디오 프레임입니다. 비디오 프레임은 레이다와 동등을 성능을 나타내고 있습니다. 

 

 

 

와~~ 아주 긴 내용이죠?

 

지금까지의 내용을 다시 한번 요약해볼게요.

 

8대의 카메라로부터   raw 이미지가 들어오면 Rectify Layer에서 카메라 캘리브레이션 과정을 수행합니다. 캘리브레이션이 완료되면 그냥 일반적인 가상의 카메라가 됩니다. 각각 이미지는 RegNet을 통하여 특징을 추출하고 BiFPN에서 이용해 멀티스케일 정보로 융합되고, Tranfermer 모듈을 통해 벡터공간으로 변환됩니다. 이 정보들은 시공간 feature queue로 보내게 되고 SPNN과 같은 비디오 모듈에 의해 처리됩니다. 

 

이후에는 다른 작업들을 위한 tunk와 head등과 함께 HydraNet에서 구조화가 진행됩니다. 오른쪽 위 부분이 벡터공간에서 보여지는 예측결과, 아래쪽이 이미지 공간에서 처리 결과를 보여주고 있습니다. 

 

 

 

향후에는 성능개선을 위한 몇가지 작업들이 이루어질 예정입니다.

 

Neural Network 관점에서 보면 시공간의 fusion이 시간이 많이 걸립니다. 이 부분은 다른 Network를 사용하거나 Optical Flow를대체 사용하는 것으로 변경될 수 있습니다.

 

테슬라에서 사용하는 결과물은 조밀한 형태의 래스터이미지입니다. 하지만 조밀한 이미지를 차량에서 처리하기에는 자원소모가 너무 많습니다. 게다가 레이턴시도 최대한 줄여야 하기 때문에 정보를 최소화하거나 point by point 방식으로 처리하여 자원 소모를 줄이는 다른 방안도 고려하고 있습니다. 

 

 

 

 

 

 

 

 

 

 

728x90

댓글