Chapter 19

인지와 측위

센서가 내놓는 것은 픽셀 수백만 개, 점 수십만 개, 반사 신호 수백 개다. 그 어디에도 "앞에 보행자가 있다"는 문장은 없다. 인지는 이 숫자 더미에서 물체와 도로를 찾아내고, 그것이 어디에 있으며 어떻게 움직이는지를 불확실성과 함께 추정하는 일이다. 측위는 같은 질문을 자기 자신에게 던진다. 이 장에서는 두 문제를 푸는 핵심 알고리즘을 직접 돌려 본다.

인지가 답해야 하는 질문

18장에서 본 센서들은 세상을 재기만 한다. 카메라는 밝기를, 라이다는 거리를, 레이더는 거리와 상대 속도를 잰다. 다음 단계인 계획(20장)이 필요로 하는 것은 측정값이 아니라 장면에 대한 서술이다. 그 사이를 잇는 인지(perception)와 측위(localization)는 네 가지 질문에 답한다.

센서 데이터 영상·점·반사 18장 검출 무엇이, 어디에 프레임마다 추적·융합 어떻게 움직이나 시간에 걸쳐 주변 모델 물체 목록 + 위치·속도·불확실성 → 20장 예측·계획 GNSS·IMU 휠 속도 자기 운동 지도 차선·표지·형상 미리 만든 기억 측위 나는 어디에 위치 + 자세 관측한 차선·표지를 지도와 맞춘다 지도 좌표로 옮긴다
그림 19-1. 인지와 측위의 흐름. 위쪽은 남을 보는 일, 아래쪽은 나를 아는 일이다. 두 결과가 합쳐져 계획 단계가 쓰는 주변 모델이 된다.

이 장 전체를 꿰는 생각은 하나다. 인지의 출력은 사실이 아니라 추정이다. "42.3 m 앞에 차가 있다"가 아니라 "약 42 m 앞에, 표준편차 0.5 m 정도의 오차로, 92 % 확률로 차인 물체가 있다"가 올바른 출력이다. 뒤에 나오는 신뢰도, 공분산, 로그 오즈, 입자 분포는 모두 이 불확실성을 숫자로 적는 서로 다른 방법이다.

카메라 인지: 합성곱에서 객체 검출까지

영상은 숫자로 채운 격자다. 격자 한 칸의 숫자는 그 자체로는 아무 뜻이 없고, 이웃한 칸과의 관계에서 뜻이 생긴다. 밝기가 갑자기 바뀌는 곳이 경계선이고, 경계선이 모여 윤곽이 되고, 윤곽이 모여 바퀴나 사람의 다리가 된다. 이 "이웃과의 관계"를 계산하는 가장 기본 연산이 합성곱(convolution)이다.

작은 숫자판(커널, 보통 3×3)을 영상 위에 올려놓고, 겹친 칸끼리 곱해 모두 더한 값을 출력의 한 칸에 적는다. 커널을 한 칸씩 옮기며 이것을 전체 영상에 반복한다.

$$y_{i,j} = \sum_{u=-1}^{1}\sum_{v=-1}^{1} k_{u,v}\, x_{i+u,\,j+v} + b$$
여기서 \(x\)는 입력 영상, \(k\)는 3×3 커널, \(b\)는 편향, \(y\)는 출력(특징 맵)이다.

커널의 숫자가 무엇을 찾을지 정한다. 왼쪽 열이 음수, 오른쪽 열이 양수인 커널은 왼쪽이 어둡고 오른쪽이 밝은 곳, 곧 세로 경계에서 큰 값을 낸다. 밝기가 고른 곳에서는 양수와 음수가 상쇄되어 0이 된다. 모든 칸이 1/9인 커널은 주변 평균을 내므로 영상이 흐려진다.

SIMULATOR

3×3 합성곱 필터

커널 선택
커널 값(직접 고칠 수 있다)
커널 합—
가리킨 화소 입력—
가리킨 화소 출력—
해볼 것: 왼쪽 입력 영상 위에서 포인터를 움직이면 그 위치의 3×3 계산이 아래에 나온다. "세로 경계"와 "가로 경계"를 바꿔 가며 차선과 차의 지붕선 중 어느 쪽이 살아남는지 본다. 커널 합이 0이면 고른 면은 사라지고 경계만 남는다(이때는 절댓값을 표시한다). 가운데 값을 5, 상하좌우를 −1로 두면 샤픈이 된다.

커널을 사람이 정하지 않는다: CNN

소벨 커널은 사람이 설계한 것이다. 합성곱 신경망(Convolutional Neural Network, CNN)은 커널의 숫자를 사람이 정하지 않고, 정답이 달린 영상 수백만 장으로부터 학습한다. 한 층에 커널을 수십~수백 개 두어 그만큼의 특징 맵을 만들고, 음수를 0으로 자르는 비선형 함수(ReLU)를 거친 뒤, 그 결과에 다시 합성곱을 적용한다. 중간중간 해상도를 절반으로 줄인다.

층이 깊어질수록 한 칸이 바라보는 원본 영상의 범위(수용 영역)가 넓어진다. 그래서 앞쪽 층은 경계와 색 변화 같은 국소 특징에, 뒤쪽 층은 바퀴, 창문, 사람의 상체처럼 넓은 범위를 봐야 알 수 있는 특징에 반응한다. 같은 커널을 영상 전체에 미끄러뜨리므로 차가 화면 어디에 있어도 같은 방식으로 찾아낸다.

입력 영상 H × W × 3 경계·색 1/4 해상도 모서리·질감 1/8 바퀴·창·다리 1/16 ~ 1/32 박스 (x, y, w, h) 클래스 (차·사람·자전거) 신뢰도 0 ~ 1 검출 헤드의 출력 해상도는 줄고, 채널 수와 한 칸이 보는 범위는 늘어난다
그림 19-2. 검출용 CNN의 구조. 앞쪽 층의 특징 맵은 크고 단순하며, 뒤쪽은 작고 추상적이다. 마지막의 검출 헤드가 특징 맵 각 위치에서 박스와 클래스, 신뢰도를 내놓는다.

객체 검출: 박스, 클래스, 신뢰도

객체 검출(object detection)의 출력은 물체마다 세 가지다. 물체를 둘러싼 직사각형인 바운딩 박스, 종류(클래스), 그리고 그 판단을 얼마나 믿는지를 나타내는 0~1 사이의 신뢰도(confidence score)다. 검출이 맞았는지 따지려면 예측 박스가 정답 박스와 얼마나 겹치는지를 재야 한다. 이 척도가 IoU(Intersection over Union)다.

$$\mathrm{IoU} = \frac{|A \cap B|}{|A \cup B|} = \frac{|A \cap B|}{|A| + |B| - |A \cap B|}$$
여기서 \(A\)는 예측 박스, \(B\)는 정답 박스, \(|\cdot|\)는 넓이다. 완전히 일치하면 1, 전혀 겹치지 않으면 0이다.
계산 예: 20픽셀 어긋난 박스

폭 100, 높이 50픽셀인 정답 박스가 있고, 예측 박스는 같은 크기인데 옆으로 20픽셀 밀렸다. 교집합은 \(80 \times 50 = 4{,}000\), 합집합은 \(5{,}000 + 5{,}000 - 4{,}000 = 6{,}000\)이므로 IoU는 약 0.67이다. 폭의 20 %만 어긋났는데 IoU는 3분의 1이 깎인다. 흔히 쓰는 합격 기준인 0.5는 생각보다 느슨하지 않다.

검출기는 한 물체에 대해 조금씩 다른 박스를 여러 개 내놓는 경우가 많다. 특징 맵의 이웃한 위치들이 모두 같은 차를 보고 반응하기 때문이다. 이를 정리하는 후처리가 비최대 억제(Non-Maximum Suppression, NMS)다. 신뢰도가 가장 높은 박스를 채택하고, 그 박스와 IoU가 임계값을 넘는 나머지를 같은 물체로 보아 지운다. 남은 박스 가운데 다시 최고 신뢰도를 골라 같은 일을 반복한다.

SIMULATOR

IoU와 비최대 억제(NMS)

모드
교집합—
합집합—
IoU—
판정—
해볼 것: IoU 모드에서 박스 안쪽을 끌면 이동, 오른쪽 아래 손잡이를 끌면 크기가 바뀐다. 예측 박스를 정답보다 훨씬 크게 키워 정답을 완전히 덮어도 IoU가 낮다는 것을 확인한다. NMS 모드에는 서로 겹쳐 보이는 차 두 대가 있다. 임계값을 0.2까지 낮추면 뒤차의 박스까지 지워지고, 0.9로 올리면 한 차에 박스가 여러 개 남는다.

NMS 임계값은 혼잡한 장면에서 특히 까다롭다. 나란히 선 보행자나 앞뒤로 겹쳐 보이는 차들은 실제로 다른 물체인데도 박스가 많이 겹친다. 그래서 최근 검출기 가운데에는 물체 하나에 예측 하나만 나오도록 학습해 NMS 자체를 없앤 구조도 많다.

화소마다 답하기: 분할과 차선

박스는 차나 사람처럼 덩어리로 셀 수 있는 물체에는 잘 맞지만, 도로 면, 인도, 차선처럼 모양이 정해지지 않은 것은 담지 못한다. 의미 분할(semantic segmentation)은 모든 화소에 클래스를 하나씩 붙인다. 출력은 입력과 같은 크기의 라벨 지도이고, "주행 가능한 영역이 어디까지인가"를 직접 알려 준다. 같은 클래스 안에서 개체까지 구분하면 인스턴스 분할이라 한다.

차선 검출은 분할의 특수한 경우로 볼 수 있다. 다만 계획 단계가 필요로 하는 것은 화소 덩어리가 아니라 곡선이므로, 차선 화소를 찾은 뒤 3차 다항식 같은 곡선에 맞추거나 처음부터 곡선의 계수나 점열을 출력하도록 학습한다. 17장의 차로 유지 보조가 쓰는 입력이 바로 이 곡선이다. 차선은 닳았거나, 빗물에 반사되거나, 공사 구간에서 이전 선과 겹쳐 보일 때 어려워진다.

얼마나 잘 보는가: 정밀도와 재현율

검출기의 출력을 정답과 비교하면 세 가지 경우가 나온다. 실제 물체를 맞게 찾은 것은 참 양성(TP), 없는 것을 있다고 한 것은 거짓 양성(FP, 오검출), 있는 것을 놓친 것은 거짓 음성(FN, 미검출)이다. 이 셋으로 두 지표를 만든다.

$$\mathrm{Precision} = \frac{TP}{TP + FP}, \qquad \mathrm{Recall} = \frac{TP}{TP + FN}$$
정밀도는 "검출이라고 내놓은 것 중 진짜의 비율", 재현율은 "실제 물체 중 찾아낸 비율"이다.

둘은 서로 당긴다. 신뢰도 임계값을 낮추면 애매한 후보까지 검출로 인정하므로 놓치는 물체가 줄어 재현율이 오르지만, 오검출도 함께 늘어 정밀도가 떨어진다. 임계값을 0에서 1까지 움직이며 두 값을 찍으면 정밀도–재현율(PR) 곡선이 되고, 그 아래 넓이가 평균 정밀도(Average Precision, AP)다. 클래스별 AP를 평균한 값이 mAP이며, 검출기 성능을 한 숫자로 비교할 때 가장 널리 쓴다. IoU 합격 기준을 0.5 하나로 두기도 하고 0.5부터 0.95까지 여러 기준의 평균을 쓰기도 한다. 주행용 3D 데이터셋에서는 IoU 대신 위에서 본 중심 거리로 합격을 정하는 경우도 있다.

SIMULATOR

신뢰도 임계값과 정밀도–재현율

TP—
FP (오검출)—
FN (미검출)—
정밀도—
재현율—
AP—
해볼 것: 실제 물체 120개와 물체가 아닌 후보 160개의 점수 분포다. 임계값 오른쪽에 있는 것만 검출로 인정된다. 임계값을 왼쪽으로 옮기며 미검출이 5개 이하가 되는 지점을 찾고, 그때 오검출이 몇 개인지 본다. 분별력을 올리면 두 분포가 갈라지고 PR 곡선이 오른쪽 위 모서리로 붙는다. 분별력 0은 찍기와 같다.

놓침과 오검출은 값이 다르다

mAP는 FN과 FP를 대등하게 다루지만 도로에서는 그렇지 않다. 진행 경로 위의 보행자를 놓치면 충돌이고, 없는 보행자를 있다고 하면 불필요한 급제동이다. 앞의 것이 훨씬 무겁다. 그렇다고 오검출이 공짜는 아니다. 고속도로에서 이유 없는 급제동은 후방 추돌을 부르고, 잦은 헛제동은 운전자가 기능을 꺼 버리게 만든다. 17장의 AEB가 경고, 부분 제동, 완전 제동을 단계적으로 쓰는 것은 확신이 낮을 때 값싼 행동부터 하기 위해서다.

평균 지표가 가리는 것도 있다. 차 바로 앞 10 m의 보행자와 150 m 밖 반대 차로의 차는 중요도가 다르다. 그래서 실제 개발에서는 거리 구간별, 클래스별, 날씨별로 재현율을 따로 보고, 내 차 경로에 가까운 물체에 가중을 둔다.

계산 예: 재현율 99 %는 충분한가

프레임마다 독립이라고 가정하면, 보행자 한 명을 한 프레임에서 놓칠 확률이 1 %일 때 연속 5프레임을 모두 놓칠 확률은 \(0.01^5 = 10^{-10}\)이다. 실제로는 그렇게 되지 않는다. 미검출은 역광, 가려짐, 드문 옷차림처럼 원인이 있어서 생기고, 그 원인은 다음 프레임에도 그대로 있다. 프레임 간 상관이 높으면 연속 미검출 확률은 1 %에 가깝게 남는다. 그래서 서로 다른 원리의 센서를 겹치고, 프레임을 넘어 물체를 이어 붙이는 추적이 필요하다.

3차원으로: 포인트 클라우드, BEV, 점유 격자

영상 속 박스는 화면 좌표일 뿐이다. 차를 몰려면 물체가 도로 위 어디에 있는지, 곧 3차원 위치와 크기, 방향이 필요하다. 라이다는 거리를 직접 재므로 출발점이 유리하다. 고전적인 처리 순서는 세 단계다.

  1. 지면 제거. 포인트의 절반 가까이는 도로 면에서 온다. 평면을 맞추거나 인접 광선 사이의 높이 변화를 따져 지면 점을 떼어 낸다.
  2. 클러스터링. 남은 점 가운데 서로 가까운 것끼리 묶는다. 어느 점에서 일정 거리 안에 있는 점을 같은 무리에 넣고, 새로 들어온 점에서 다시 같은 일을 반복한다.
  3. 박스 맞춤과 분류. 무리마다 직육면체를 맞춘다. 차는 보이는 두 면이 L자를 이루므로 L자에 맞는 방향을 찾는다. 크기와 점 분포로 종류를 가린다.

클러스터링의 유일한 매개변수는 거리 임계값인데, 한 값으로 모든 경우를 만족시킬 수 없다. 라이다의 점 간격은 거리에 비례해 벌어진다. 각 분해능 0.2°면 50 m에서 이웃 점 사이가 약 17 cm, 100 m에서 35 cm다. 임계값이 작으면 먼 차 한 대가 여러 조각으로 쪼개지고, 크면 가까이 선 두 사람이 한 물체로 합쳐진다.

SIMULATOR

라이다 포인트 클러스터링

포인트 수—
클러스터 / 실제 물체—
상태—
해볼 것: 아래 중앙의 라이다가 부채꼴로 광선을 쏘아 물체 표면에 점을 찍는다(지면은 이미 제거한 상태). 물체는 끌어서 옮길 수 있다. 임계값을 0.2 m로 낮추면 먼 차가 조각나고, 1.5 m로 올리면 붙어 선 보행자 두 명이 한 덩어리가 된다. 보행자를 차 옆으로 끌어다 놓으면 차에 흡수된다. 각 분해능을 2°로 낮추면 같은 임계값으로도 먼 물체가 쪼개진다.

지금의 주류는 이 단계들을 신경망 하나로 대신한다. 공간을 작은 기둥이나 정육면체(복셀)로 나누어 그 안의 점을 요약하고, 위에서 내려다본 격자에 2D CNN을 적용해 3D 박스를 직접 출력한다. 그래도 규칙 기반 클러스터링은 버려지지 않았다. 학습 데이터에 없던 낯선 물체도 "점이 모여 있으면 무언가 있다"는 이유만으로 잡아내므로, 학습 기반 검출이 놓친 것을 받아 주는 안전망으로 쓰인다.

카메라로 깊이를 얻는 법

카메라 영상에는 거리가 없다. 깊이를 되찾는 방법은 몇 가지다. 스테레오 시차(18장), 물체가 지면에 닿는 화소 위치와 카메라 높이로 푸는 기하, 차의 크기에 대한 사전 지식, 그리고 화소마다 깊이를 직접 예측하도록 학습한 신경망이다. 여러 시점의 영상을 시간에 걸쳐 모으면 움직임 시차도 쓸 수 있다. 어느 방법이든 거리 오차가 거리와 함께 빠르게 커진다는 점은 같다.

조감도(BEV) 표현

영상 평면에서는 먼 물체가 작고, 물체끼리 가리고, 카메라마다 좌표가 따로다. 계획은 도로 평면 위에서 이루어진다. 그래서 여러 카메라의 특징을 위에서 내려다본 하나의 격자, 곧 조감도(Bird's-Eye View, BEV)로 옮겨 놓고 그 위에서 검출과 분할을 한다. BEV에서는 물체의 크기가 거리에 따라 변하지 않고, 라이다와 레이더의 데이터도 같은 격자에 올릴 수 있으며, 출력이 그대로 계획의 입력 좌표가 된다. 어려운 부분은 영상 특징을 BEV로 올리는 변환이다. 화소마다 깊이 분포를 예측해 뿌리거나, BEV의 각 칸이 영상의 어느 부분을 볼지 주의(attention) 연산으로 학습하게 한다.

가까운 차 먼 차: 몇 화소 영상 평면 거리에 따라 크기가 달라지고 가려진다 내 차 옆 차로 BEV 격자 크기가 일정하고 계획과 좌표가 같다
그림 19-3. 같은 장면의 두 표현. 영상에서는 먼 차가 몇 화소에 불과하지만 BEV에서는 모든 차가 실제 크기의 사각형이다.

점유 격자: 이름을 몰라도 피할 수 있게

검출은 "이것은 차다"라고 이름을 붙일 수 있을 때만 작동한다. 쓰러진 나무, 떨어진 화물, 처음 보는 모양의 공사 장비에는 이름이 없다. 점유 격자(occupancy grid)는 질문을 바꾼다. 공간을 작은 칸으로 나누고, 칸마다 "여기가 무언가로 차 있을 확률"만 적는다.

광선 하나가 어떤 칸에서 반사되어 돌아왔다면, 그 칸은 차 있을 가능성이 높고 센서와 그 칸 사이의 칸들은 비어 있을 가능성이 높다. 측정 한 번은 믿을 수 없으므로 여러 번의 증거를 쌓아야 한다. 확률을 그대로 곱하면 계산이 번거롭고 0이나 1 근처에서 수치가 불안정하므로, 확률을 로그 오즈(log-odds)로 바꿔 덧셈으로 갱신한다.

$$L = \ln\frac{p}{1-p}, \qquad L_t = L_{t-1} + \ln\frac{p(m \mid z_t)}{1 - p(m \mid z_t)} - L_0$$
여기서 \(p\)는 칸이 점유되었을 확률, \(p(m \mid z_t)\)는 이번 측정만 보았을 때의 점유 확률(역 센서 모델), \(L_0\)는 사전 로그 오즈다. 사전 확률이 0.5면 \(L_0 = 0\)이다.
계산 예: 세 번 맞으면 얼마나 확신하는가

반사가 온 칸의 점유 확률을 0.7로 잡으면 한 번 맞을 때마다 \(\ln(0.7/0.3) \approx +0.85\)가 더해진다. 0에서 출발해 세 번 맞으면 \(L = 2.54\), 확률로 되돌리면 \(1/(1+e^{-2.54}) \approx 0.93\)이다. 광선이 지나간 칸은 0.4로 잡아 \(\ln(0.4/0.6) \approx -0.41\)씩 뺀다. 한 번 잘못 찍힌 점은 그 뒤 광선이 두 번만 통과해도 상쇄된다. 로그 오즈에는 보통 상한과 하한을 두어, 주차했던 차가 떠난 것 같은 변화를 빨리 따라가게 한다.

SIMULATOR

점유 격자 지도 만들기

판정된 칸—
틀린 칸—
스캔 횟수—
해볼 것: 차를 끌어 움직이면 360° 광선이 실제 벽에 부딪힌 거리로 격자를 갱신한다. 회색은 모름(p = 0.5), 밝은 쪽은 빈 칸, 진한 쪽은 점유된 칸이다. 벽 뒤는 광선이 닿지 않아 끝까지 회색으로 남는다. 잡음을 0.5 m 이상으로 올리면 벽이 두꺼워지고 틀린 칸이 늘지만, 한자리에 머물러 측정을 쌓으면 다시 또렷해진다. 한 칸은 0.5 m다.

최근에는 이 격자를 3차원 복셀로 넓히고, 칸마다 점유 여부와 함께 의미 클래스와 속도까지 신경망이 예측하게 한다. 카메라만으로 이런 3D 점유 지도를 만드는 방식이 널리 연구되고 양산에도 쓰인다.

추적: 프레임을 이어 속도를 얻는다

검출은 프레임마다 따로 이루어진다. 이번 프레임의 박스 7개와 지난 프레임의 박스 7개 사이에는 아무 연결이 없다. 추적(tracking)은 이들을 이어 물체마다 고유 번호를 붙이고 궤적을 만든다. 추적이 있어야 속도를 알 수 있고, 한두 프레임 검출이 끊겨도 물체를 잃지 않으며, 한 프레임짜리 오검출을 걸러낼 수 있다.

추적은 두 문제로 나뉜다. 하나는 데이터 연관이다. 새 검출 각각이 기존 궤적 가운데 어느 것에 해당하는지 짝을 짓는다. 각 궤적이 지금쯤 있을 위치를 예측하고, 예측과 검출 사이의 거리를 비용으로 하여 전체 비용이 최소가 되는 짝을 찾는다(헝가리안 알고리즘). 거리는 단순한 유클리드 거리가 아니라 불확실성으로 나눈 마할라노비스 거리를 쓰고, 일정 값을 넘는 짝은 아예 허용하지 않는다. 짝을 못 찾은 검출은 새 궤적의 후보가 되고, 여러 프레임 동안 짝이 없는 궤적은 지운다.

다른 하나는 상태 추정이다. 짝지어진 측정에는 잡음이 있다. 측정을 그대로 믿으면 궤적이 떨리고, 속도는 위치 차이를 시간으로 나눈 것이라 더 심하게 떨린다. 여기에 쓰는 표준 도구가 칼만 필터다.

칼만 필터: 예측하고, 고친다

칼만 필터(Kalman filter)는 두 가지 정보를 섞는다. 하나는 운동 모델이다. "물체는 방금 속도 그대로 조금 더 갔을 것이다." 다른 하나는 측정이다. 둘 다 틀릴 수 있으므로 각각의 불확실성에 따라 가중 평균을 낸다. 상태 \(\mathbf{x}\)(위치와 속도)와 그 불확실성인 공분산 \(\mathbf{P}\)를 함께 들고 다니며 두 단계를 되풀이한다.

$$\textbf{predict:}\quad \hat{\mathbf{x}}^- = \mathbf{F}\hat{\mathbf{x}}, \qquad \mathbf{P}^- = \mathbf{F}\mathbf{P}\mathbf{F}^{\mathsf T} + \mathbf{Q}$$ $$\textbf{update:}\quad \mathbf{K} = \mathbf{P}^-\mathbf{H}^{\mathsf T}\left(\mathbf{H}\mathbf{P}^-\mathbf{H}^{\mathsf T} + \mathbf{R}\right)^{-1},\quad \hat{\mathbf{x}} = \hat{\mathbf{x}}^- + \mathbf{K}\left(\mathbf{z} - \mathbf{H}\hat{\mathbf{x}}^-\right),\quad \mathbf{P} = (\mathbf{I} - \mathbf{K}\mathbf{H})\mathbf{P}^-$$
여기서 \(\mathbf{F}\)는 운동 모델, \(\mathbf{Q}\)는 모델이 틀리는 정도(프로세스 잡음), \(\mathbf{H}\)는 상태에서 측정을 뽑는 행렬, \(\mathbf{R}\)은 측정 잡음, \(\mathbf{z}\)는 측정, \(\mathbf{K}\)는 칼만 이득이다.

가장 단순한 운동 모델은 등속(constant velocity)이다. 상태를 \([x,\ y,\ v_x,\ v_y]\)로 두면 \(\mathbf{F}\)는 "위치에 속도 × 시간을 더한다"는 뜻의 행렬이고, 측정은 위치만 보므로 \(\mathbf{H}\)는 앞의 두 성분만 뽑는다. 속도는 한 번도 직접 재지 않지만, 위치 측정이 예측과 어긋나는 방향을 보고 필터가 속도를 고쳐 나간다.

위치 직전 추정 ① 예측: 옮겨지고 퍼진다 측정 ② 갱신: 둘 사이, 더 좁게 v · Δt 예측의 분산이 클수록(이득 K가 클수록) 측정 쪽으로 더 많이 끌려간다
그림 19-4. 1차원으로 본 칼만 필터 한 주기. 예측 단계에서 분포는 이동하면서 넓어지고, 갱신 단계에서 측정과 곱해져 둘 중 어느 것보다도 좁아진다.
계산 예: 이득은 불확실성의 비율이다

1차원에서 예측의 표준편차가 2 m(분산 4), 측정의 표준편차가 1 m(분산 1)라고 하자. 칼만 이득은 \(K = 4/(4+1) = 0.8\)이다. 예측이 40 m, 측정이 42 m면 추정은 \(40 + 0.8 \times 2 = 41.6\) m로, 더 믿을 만한 측정 쪽에 가깝다. 갱신 뒤 분산은 \((1-0.8) \times 4 = 0.8\), 표준편차 약 0.89 m다. 측정 하나만 쓴 것(1 m)보다 좋아졌다.

SIMULATOR

등속 칼만 필터로 추적하기

물체의 움직임
측정 오차(RMS)—
필터 오차(RMS)—
위치 이득 K—
위치 σ / 추정 속도—
해볼 것: 회색 선이 실제 궤적, 주황색 점이 10 Hz 측정, 굵은 선과 타원이 필터의 추정과 95 % 불확실성이다. "측정 끊김"을 켜면 필터는 예측만으로 직진하고 타원이 매 순간 커진다. 물체가 그 사이 방향을 틀면 추정이 벗어나지만, 측정이 돌아오면 큰 타원 덕분에 이득이 커서 금방 따라붙는다. σa를 0.05로 줄이면 궤적은 매끈하지만 곡선에서 바깥으로 밀리고, 10으로 올리면 측정을 거의 그대로 따라가 떨린다.

등속 모델은 단순한 만큼 한계가 뚜렷하다. 물체가 모델과 다르게 움직이는 정도를 \(\mathbf{Q}\) 하나로 뭉뚱그리기 때문이다. 실제 추적기는 등속, 등가속, 선회 모델을 여러 개 동시에 돌리며 가장 잘 맞는 것에 무게를 싣는다. 또 레이더처럼 거리와 각도로 측정하는 센서는 측정과 상태의 관계가 비선형이어서, 매 순간 선형으로 근사하는 확장 칼만 필터(EKF)나 대표점 몇 개를 실제 함수에 통과시키는 무향 칼만 필터(UKF)를 쓴다.

센서 융합과 좌표 변환

18장에서 보았듯 센서마다 잘하는 것이 다르다. 카메라는 각도 분해능이 뛰어나 물체가 어느 방향에 있는지는 정밀하게 알지만 거리는 어림한다. 레이더는 거리와 상대 속도를 정밀하게 재지만 각도는 뭉툭하다. 두 측정을 합치면 양쪽의 좋은 쪽만 남는다. 이것이 우연이 아니라 수학적으로 보장된다는 점이 융합의 핵심이다.

두 측정을 각각 평균 \(\mathbf{z}_1, \mathbf{z}_2\)와 공분산 \(\mathbf{P}_1, \mathbf{P}_2\)를 갖는 가우시안으로 보면, 둘을 곱한 결과도 가우시안이다.

$$\mathbf{P} = \left(\mathbf{P}_1^{-1} + \mathbf{P}_2^{-1}\right)^{-1}, \qquad \hat{\mathbf{x}} = \mathbf{P}\left(\mathbf{P}_1^{-1}\mathbf{z}_1 + \mathbf{P}_2^{-1}\mathbf{z}_2\right)$$
공분산의 역행렬은 "정보량"이다. 정보는 더해지고, 추정값은 정보량으로 가중한 평균이다. 1차원이면 \(\sigma^2 = \sigma_1^2\sigma_2^2/(\sigma_1^2+\sigma_2^2)\)로, 항상 둘 중 작은 쪽보다도 작다.
SIMULATOR

카메라와 레이더의 불확실성 융합

카메라 σ (거리 × 횡)—
레이더 σ (거리 × 횡)—
융합 σ (장축 × 단축)—
타원 넓이 (좋은 쪽 대비)—
해볼 것: 표적(십자)을 끌어 거리와 방향을 바꾼다. 카메라 타원은 시선 방향으로 길고 레이더 타원은 그 직각으로 길다. 둘이 겹치는 작은 영역이 융합 결과이며 확대 창에서 볼 수 있다. 표적을 멀리 보낼수록 두 타원 모두 커지지만 융합 타원은 훨씬 느리게 커진다. 고정값으로 카메라 각도 오차 0.2°, 레이더 거리 오차 0.25 m를 썼다.
계산 예: 60 m 앞의 차

카메라의 거리 오차가 10 %면 60 m에서 \(\sigma \approx 6\) m, 횡 방향은 \(60 \times \tan 0.2^\circ \approx 0.21\) m다. 레이더는 거리 0.25 m, 횡 방향 \(60 \times \tan 3^\circ \approx 3.1\) m다. 거리 방향을 합치면 \(\sqrt{6^2 \cdot 0.25^2/(6^2+0.25^2)} \approx 0.25\) m, 횡 방향은 \(\sqrt{0.21^2 \cdot 3.1^2/(0.21^2+3.1^2)} \approx 0.21\) m다. 각 센서가 6 m와 3 m씩 모르던 것을 합치니 양쪽 다 0.3 m 안으로 들어온다.

어느 단계에서 합칠 것인가

위 계산은 각 센서가 검출을 끝낸 뒤 결과끼리 합치는 방식이다. 합치는 시점은 더 앞으로 당길 수 있고, 시점마다 얻는 것과 잃는 것이 다르다.

방식합치는 대상장점약점
초기 융합원시 데이터(화소에 라이다 깊이를 붙이는 식)정보 손실이 없다. 한 센서로는 약한 증거도 합쳐서 살린다.정밀한 캘리브레이션과 시간 동기가 필수. 센서 하나가 바뀌면 전체를 다시 학습한다.
중기 융합신경망 중간의 특징 맵(주로 BEV 격자 위에서)센서별 표현 차이를 흡수하면서 풍부한 정보를 쓴다. 현재 학습 기반 인지의 주류.무엇이 왜 검출되었는지 들여다보기 어렵다. 대량의 동기화된 학습 데이터가 필요하다.
후기 융합센서별 검출 결과(물체 목록)구조가 단순하고 센서별로 독립 검증이 된다. 한 센서가 죽어도 나머지가 돈다.각 센서가 따로 버린 약한 증거는 되살릴 수 없다. 센서끼리 결과가 다를 때 누구를 믿을지 정해야 한다.

후기 융합의 독립성은 안전 설계에서 값지다. 카메라 경로와 레이더·라이다 경로가 서로 다른 원리로 같은 물체를 확인하면, 한쪽의 체계적인 실패가 다른 쪽에서 드러난다. 이 이중화는 21장에서 다시 다룬다.

좌표계: 센서에서 차량으로, 차량에서 지도로

융합이 성립하려면 모든 측정이 같은 좌표계에 있어야 한다. 카메라가 본 점은 카메라 렌즈 중심을 원점으로 하고, 라이다가 본 점은 라이다 중심을 원점으로 한다. 이들을 차량 좌표계(보통 뒤 차축 중심이 원점, x가 전방, y가 좌측, z가 위)로 옮기고, 다시 차의 위치와 자세를 써서 지도 좌표계로 옮긴다. 각 변환은 회전과 평행 이동이며, 동차 좌표를 쓰면 행렬 곱 하나가 된다.

$$\mathbf{p}_{map} = \mathbf{T}_{map \leftarrow veh}\,\mathbf{T}_{veh \leftarrow sen}\,\mathbf{p}_{sen}, \qquad \mathbf{T} = \begin{bmatrix}\cos\psi & -\sin\psi & t_x\\ \sin\psi & \cos\psi & t_y\\ 0 & 0 & 1\end{bmatrix}$$
평면(2D)의 경우다. \(\psi\)는 회전각, \((t_x, t_y)\)는 원점의 이동이다. \(\mathbf{T}_{veh \leftarrow sen}\)은 센서 장착 위치와 각도(외부 파라미터)로 정해지는 고정값이고, \(\mathbf{T}_{map \leftarrow veh}\)는 측위가 매 순간 추정하는 값이다.
동(E)북(N) 지도 좌표계 x (전방) y (좌측) p_sen 검출된 물체 센서 좌표계 (장착 위치·각도는 고정) 차량 좌표계 (뒤 차축 중심) 차의 위치 (t_x, t_y)와 방위각 ψ = 측위의 출력
그림 19-5. 좌표계의 사슬. 센서가 본 점은 장착 파라미터로 차량 좌표계에, 측위 결과로 지도 좌표계에 옮겨진다. 어느 고리가 틀려도 물체가 엉뚱한 곳에 놓인다.
작은 각도 오차의 값

카메라 장착 각도가 0.5° 틀어져 있으면 100 m 앞에서 \(100 \times \tan 0.5^\circ \approx 0.87\) m 어긋난다. 차로 폭이 3.5 m 안팎이므로 앞차가 내 차로에 있는지 옆 차로에 있는지 헷갈릴 수 있는 크기다. 시간도 좌표다. 상대 속도 30 m/s인 물체를 두 센서가 20 ms 차이로 찍으면 0.6 m 떨어진 곳에서 본 셈이 된다. 그래서 모든 측정에 정밀한 시각을 찍고 같은 시각으로 보정한 뒤 합친다.

측위: 나는 어디에 있는가

내비게이션에는 5 m 오차도 충분하지만, 차로 안에서 스스로 달리려면 횡 방향으로 10~20 cm 수준이 필요하다. 어느 차로에 있는지 틀리면 지도에서 읽어 온 신호등과 정지선, 제한 속도가 모두 남의 차로 것이 된다. 한 가지 수단으로는 이 정밀도를 늘 얻을 수 없다.

계산 예: 오도메트리는 얼마나 빨리 틀어지는가

타이어 공기압이 낮아 유효 반지름이 0.5 % 작아졌다면 1 km를 달렸을 때 종 방향으로 5 m 틀린다. 방위각 추정이 0.5° 틀린 채로 100 m를 가면 횡 방향으로 \(100 \times \sin 0.5^\circ \approx 0.87\) m 벗어난다. 터널 1 km를 오도메트리만으로 지나면 차로 하나쯤은 쉽게 어긋난다. 드리프트 없는 절대 기준으로 주기적으로 고쳐야 하는 이유다.

정밀 지도와 지도 매칭

정밀 지도(HD map)는 차로 중심선과 경계선, 정지선, 신호등과 표지판의 3차원 위치, 연석과 가드레일 같은 구조물을 cm~dm 정확도로 담는다. 측위에서는 "보이는 것"과 "지도에 있는 것"을 겹쳐 가장 잘 맞는 위치와 방위를 찾는다. 카메라가 검출한 차선과 표지판을 지도의 것과 맞추거나, 라이다 포인트 클라우드를 지도의 점 구름과 맞춘다.

점 구름끼리 맞추는 대표적인 방법이 ICP(Iterative Closest Point)다. 지금 스캔의 각 점에 대해 지도에서 가장 가까운 점을 짝으로 잡고, 짝끼리의 거리 제곱 합이 최소가 되는 회전과 이동을 구해 스캔을 옮긴다. 옮긴 뒤 짝을 다시 잡고 같은 일을 수렴할 때까지 반복한다. 초기 위치가 크게 틀리면 엉뚱한 짝에 끌려가므로 오도메트리가 주는 초기값이 중요하다.

파티클 필터: 가설을 뿌리고 걸러낸다

칼만 필터는 "내 위치는 여기 근처"라는 봉우리 하나짜리 분포만 표현한다. 시동을 막 걸었거나 터널에서 나왔을 때는 "이 교차로일 수도, 저 교차로일 수도 있다"처럼 후보가 여럿이다. 파티클 필터(particle filter)는 분포를 수백~수천 개의 점(입자)으로 나타낸다. 입자 하나하나가 "차가 여기 있다"는 가설이다.

  1. 이동. 오도메트리가 알려 준 만큼 모든 입자를 옮긴다. 오도메트리 오차만큼 무작위 흔들림을 더한다.
  2. 가중. 입자마다 "차가 정말 여기 있다면 센서에 무엇이 보여야 하는가"를 지도에서 계산해 실제 관측과 비교한다. 잘 맞을수록 높은 가중치를 준다.
  3. 재추출. 가중치에 비례해 입자를 다시 뽑는다. 맞는 가설은 여러 개로 복제되고 틀린 가설은 사라진다.
$$w_i \propto \prod_{k} \exp\!\left(-\frac{\left(z_k - \hat{z}_k(\mathbf{x}_i)\right)^2}{2\sigma^2}\right), \qquad N_{eff} = \frac{1}{\sum_i w_i^2}$$
여기서 \(z_k\)는 \(k\)번째 관측(랜드마크까지의 거리 등), \(\hat{z}_k(\mathbf{x}_i)\)는 입자 \(i\)의 위치에서 예상되는 관측, \(\sigma\)는 센서 잡음이다. \(N_{eff}\)는 정규화한 가중치로 계산한 유효 입자 수로, 이 값이 작으면 소수의 입자만 살아 있다는 뜻이다.
SIMULATOR

파티클 필터 측위

추정 오차—
입자 퍼짐(σ)—
유효 입자 수—
단계—
해볼 것: 차는 순환 도로를 돌며 20 m 안의 랜드마크(삼각형)까지 거리만 잰다. 어느 랜드마크인지는 모른다. "한 단계"를 누를 때마다 차가 2 m 가고 입자가 이동·가중·재추출된다. 처음 몇 단계에서는 거리가 맞는 고리 모양으로 입자가 남고, 몇 군데 후보로 줄었다가 하나로 모인다. 입자를 50개로 줄이고 다시 뿌리면 정답 근처에 입자가 하나도 없어 엉뚱한 곳으로 수렴하는 경우가 생긴다.

SLAM과 지도 없는 주행

지도가 없으면 지도를 만들면서 그 안에서 위치를 잡아야 한다. 이것이 SLAM(Simultaneous Localization and Mapping)이다. 위치를 알아야 지도를 그리고 지도가 있어야 위치를 아는 닭과 달걀의 문제지만, 연속한 스캔끼리 맞춰 이동량을 구하고 이를 이어 붙이면 양쪽이 함께 자라난다. 이어 붙인 오차는 쌓이므로, 전에 왔던 곳에 다시 왔음을 알아차려(루프 폐쇄) 궤적 전체를 한꺼번에 바로잡는다. 정밀 지도 자체가 측량 차량이 모은 데이터를 이런 방식으로 정합해 만든 결과물이다.

정밀 지도에 얼마나 기댈지는 설계 철학이 갈리는 지점이다.

정밀 지도 의존맵리스(경량 지도)
지도의 역할센서가 닿지 않는 곳까지 미리 아는 기억. 차선·신호·정지선을 지도에서 읽는다.내비게이션 수준의 경로 안내만. 차선과 교차로 구조는 그 자리에서 인지한다.
강점가려진 곳과 복잡한 교차로에서 안정적. 인지가 풀 문제가 줄어든다.지도를 만들지 않은 도로에서도 동작. 넓은 지역으로 확장하기 쉽다.
약점구축과 갱신 비용이 크다. 공사로 도로가 바뀌면 지도가 틀린 정보가 된다.실시간 인지가 모든 것을 감당해야 한다. 시야 밖 정보가 없다.
주된 쓰임정해진 구역을 도는 무인 택시일반 승용차의 운전자 보조

실제 시스템은 양극단 사이에 있다. 지도를 쓰더라도 지도와 지금 보이는 것이 다르면 보이는 것을 우선하고, 지도를 쓰지 않더라도 여러 차가 지나며 모은 차로 구조를 가벼운 사전 정보로 쓴다.

불확실성, 롱테일, 그리고 데이터

인지의 어려움은 평균적인 장면에 있지 않다. 맑은 날 고속도로의 승용차는 이미 사람보다 잘 본다. 문제는 드물게 나타나는 수많은 경우다. 유모차를 미는 사람, 화물칸에 자전거를 실은 트럭, 버스 광고판 속의 사람 얼굴, 도로에 누운 사람, 탈을 쓴 행인, 뒤집힌 차. 하나하나는 수백만 km에 한 번 나올까 말까 하지만 종류가 끝없이 많아 모두 합치면 무시할 수 없다. 발생 빈도 분포의 긴 꼬리에 해당한다고 해서 롱테일(long tail) 문제라 부른다.

학습 기반 인지는 본 것을 잘한다. 따라서 성능은 모델 구조만큼이나 데이터가 정한다. 여기서 세 가지 일이 중요하다.

모르는 것을 모른다고 말하는 능력도 인지의 일부다. 신경망의 신뢰도 점수는 훈련 때 보지 못한 입력에서 근거 없이 높게 나오는 경향이 있다. 그래서 점수가 실제 정답률과 일치하도록 보정하고, 점유 격자처럼 이름을 붙이지 않고도 "무언가 있다"를 알려 주는 경로를 함께 두며, 센서 오염이나 역광처럼 입력 자체가 나빠진 상황을 따로 감지한다. 인지가 불확실성을 정직하게 넘겨주어야 계획 단계가 속도를 줄이거나 거리를 벌리는 식으로 대응할 수 있다. 이 뒷이야기는 20장과 21장에서 이어진다.

검출–추적–예측을 하나로

이 장은 검출, 추적, 융합, 측위를 따로 설명했지만, 단계를 나누면 앞 단계가 버린 정보를 뒤 단계가 쓸 수 없다. 검출기가 신뢰도 0.3이라 버린 흐릿한 물체가 다섯 프레임 연속 같은 자리에 있었다면 그것은 진짜일 가능성이 높다. 그래서 여러 프레임의 BEV 특징을 시간 축으로 쌓아 검출과 추적, 나아가 미래 궤적 예측까지 한 신경망에서 함께 학습하는 구조가 늘고 있다. 단계가 합쳐져도 이 장의 개념은 그대로 남는다. 좌표 변환은 특징을 BEV에 올릴 때, 연관은 궤적 질의가 프레임을 넘나들 때, 불확실성은 출력 분포의 형태로 다시 나타난다.

핵심 정리

  1. 인지는 무엇이, 어디에, 어떻게 움직이는지를, 측위는 내가 어디에 있는지를 추정한다. 출력은 사실이 아니라 불확실성이 붙은 추정이다.
  2. 합성곱은 커널과 이웃 화소의 곱을 더하는 연산이다. CNN은 커널을 데이터에서 학습하고, 층이 깊을수록 넓은 범위의 추상적인 특징을 본다.
  3. 객체 검출은 박스·클래스·신뢰도를 낸다. IoU는 교집합을 합집합으로 나눈 겹침 척도이고, NMS는 같은 물체의 중복 박스를 신뢰도 순으로 정리한다.
  4. 임계값을 낮추면 재현율이 오르고 정밀도가 내린다. 도로에서는 미검출과 오검출의 비용이 다르며, 프레임 간 오류는 독립이 아니다.
  5. 포인트 클라우드는 지면 제거, 클러스터링, 박스 맞춤으로 물체가 된다. 점유 격자는 로그 오즈를 더해 가며 이름 모를 장애물까지 표현한다.
  6. 칼만 필터는 운동 모델로 예측하고 측정으로 갱신한다. 이득은 예측과 측정의 불확실성 비율로 정해지고, 측정이 끊기면 공분산이 커진다.
  7. 서로 다른 방향으로 불확실한 측정을 융합하면 정보(공분산의 역)가 더해져 어느 쪽보다도 좁은 추정이 된다. 그 전제는 정확한 좌표 변환과 시간 동기다.
  8. 측위는 절대 기준(GNSS, 지도 대조)과 상대 이동(오도메트리)을 섞는다. 파티클 필터는 여러 가설을 입자로 유지하다가 관측과 맞지 않는 것을 걸러낸다.

확인 퀴즈

1. 모든 값의 합이 0인 3×3 커널(예: 소벨)을 밝기가 완전히 고른 영역에 적용하면 출력은?

모든 화소가 같은 값 c면 출력은 c × (커널 합) = 0이다. 그래서 합이 0인 커널은 고른 면을 지우고 밝기가 변하는 경계만 남긴다. 합이 1인 커널(블러, 샤픈)은 평균 밝기를 유지한다.

2. 정답 박스가 40 × 40이고, 예측 박스가 정답을 한가운데에 품은 80 × 80이다. IoU는?

교집합은 정답 박스 전체인 1,600, 합집합은 예측 박스 전체인 6,400이므로 IoU = 0.25다. 정답을 완전히 덮었어도 박스가 지나치게 크면 IoU가 낮다. IoU는 놓친 부분과 넘친 부분을 모두 벌한다.

3. 검출기의 신뢰도 임계값을 0.6에서 0.3으로 낮췄다. 일반적으로 일어나는 변화는?

낮은 점수의 후보까지 검출로 인정하므로 놓치던 실제 물체가 잡혀 재현율이 오른다(적어도 내려가지는 않는다). 동시에 물체가 아닌 후보도 더 많이 통과해 정밀도가 내려가는 것이 보통이다. AP는 임계값 전체에 걸친 곡선의 넓이라 임계값 하나를 바꾼다고 변하지 않는다.

4. 추적 중인 차가 트럭 뒤로 가려져 1초 동안 측정이 없었다. 그동안 칼만 필터의 상태는?

갱신 없이 예측만 반복하면 상태는 운동 모델(등속)대로 전진하고, 공분산에는 매 단계 Q가 더해져 불확실성이 자란다. 측정이 돌아오면 커진 공분산 때문에 이득이 커서 측정을 강하게 믿고 빠르게 수렴한다.

5. 점유 격자에서 사전 확률 0.5인 칸에 "점유 0.7"에 해당하는 측정이 두 번, "점유 0.4"(빈 칸 쪽)에 해당하는 측정이 한 번 들어왔다. 로그 오즈 합과 가장 가까운 것은? (ln(0.7/0.3) ≈ 0.85, ln(0.4/0.6) ≈ −0.41)

0.85 + 0.85 − 0.41 = 1.29다. 확률로 바꾸면 1/(1 + e^−1.29) ≈ 0.78이다. 로그 오즈 표현에서는 증거가 덧셈으로 쌓이므로 측정 순서와 무관하게 같은 결과가 나온다.

6. 카메라와 레이더의 측정을 융합했을 때 어느 한쪽보다도 훨씬 정밀해지는 가장 큰 이유는?

카메라는 각도(횡 방향)에 정밀하고 거리에 둔하며, 레이더는 반대다. 공분산의 역(정보)을 더하면 각 방향에서 더 정밀한 쪽이 지배한다. 같은 방향으로 똑같이 불확실한 두 측정이라면 표준편차가 1/√2로 줄 뿐이다. 잡음이 0이 되지는 않는다.