포스트

[MIT 머신비전 3강] 카메라 하나로 부딪히기까지 남은 시간 재기 | 충돌 시간(Time to Contact)과 노이즈 이득

MIT 6.801 머신비전(Machine Vision, Berthold Horn) 3강 정리. 카메라 하나로 충돌 시간(Time to Contact, TTC)을 구하는 방법과 노이즈 이득, GPS 정밀도 저하(DOP)를 쉽게 설명합니다.

[MIT 머신비전 3강] 카메라 하나로 부딪히기까지 남은 시간 재기 | 충돌 시간(Time to Contact)과 노이즈 이득

MIT OpenCourseWare 6.801 3강 원본 영상 (영어)

한 줄 요약: 거리도 속도도 모르는데, 카메라 한 대로 “몇 초 뒤에 부딪히는지”는 계산할 수 있습니다. 물체를 찾거나 짝을 맞출 필요도 없이, 모든 픽셀의 밝기 변화를 더하기만 하면 됩니다. 그 전에 “측정 오차가 답에서 얼마나 커지나”(노이즈 이득)를 먼저 짚고 갑니다.

노이즈 이득: 측정이 조금 틀리면 답은 얼마나 틀릴까

머신비전의 문제는 대부분 거꾸로 푸는 문제입니다. 알고 싶은 값 \(x\)(거리, 기울기 등)가 측정값 \(y = f(x)\)를 만들고, 우리는 \(y\)를 재서 \(x\)를 되짚어 갑니다. 측정에는 늘 잡음이 섞이니, \(y\)가 조금 틀렸을 때 \(x\)가 얼마나 틀리는지가 중요합니다. 이 비율이 노이즈 이득입니다.

\[\text{노이즈 이득} = \frac{\delta x}{\delta y} = \frac{1}{\;|f'(x)|\;}\]

측정 곡선의 가파른 곳과 평평한 곳에서의 오차 크기 같은 크기의 측정 오차(가로 띠)가 곡선이 가파른 곳에서는 좁은 답의 범위(세로 띠)로, 평평한 곳에서는 아주 넓은 범위로 바뀝니다.

곡선이 평평할수록, 즉 \(f'(x)\)가 0에 가까울수록 답이 크게 흔들립니다. \(x\)를 크게 바꿔도 측정값이 거의 안 변한다는 뜻이니, 거꾸로 측정값으로 \(x\)를 정하기가 어렵습니다.

여러 값을 한꺼번에 풀 때: GPS의 정밀도 저하

미지수가 여럿이면 연립방정식을 풉니다. 행렬로 쓰면 \(\mathbf{b} = M^{-1}\mathbf{x}\)이고, 역행렬에는 \(1/\det M\)이 붙습니다. \(\det M\)이 0에 가까우면 잡음이 크게 부풀려집니다. 게다가 방향마다 다르게 부풀 수 있습니다. 어떤 방향으로는 정확한데 다른 방향으로는 엉망일 수 있다는 뜻입니다.

강의에서 든 예는 실내 위치 찾기입니다. GPS 위성이나 와이파이 공유기 같은 신호원에서 거리를 재면, 신호원마다 “이 거리 ± 오차 안 어딘가”라는 정보가 생깁니다. 3D로 보면 이 정보는 신호원을 중심으로 한 두꺼운 공 껍질입니다. 위성은 아주 멀리 있으니 수신기 근처만 잘라 보면 껍질은 거의 평평한 판이고, 판은 위성을 바라보는 방향에 수직으로 놓입니다. 내 위치는 이 판들이 모두 겹치는 곳입니다.

위성 배치와 위치 오차. 왼쪽은 하늘 전체, 오른쪽은 수신기 주변을 확대한 화면입니다. 위성마다 같은 색 판이 하나씩 생기고, 주황 덩어리가 판들이 겹친 곳, 즉 위치 후보입니다. “고르게 퍼짐”에서는 판들이 여러 방향으로 엇갈려 덩어리가 작고 둥급니다. “한쪽에 몰림”을 누르면 판들이 거의 나란히 겹치면서 덩어리가 한쪽으로 길쭉하게 늘어납니다. 위성을 직접 끌어 옮기거나 빈 곳을 끌어 화면을 돌려 보세요.

GPS에서 이것을 정밀도 저하(DOP, Dilution of Precision)라고 부릅니다. 위성들이 하늘의 한쪽에 몰려 있으면 위치가 덜 정확해지고, 위성이 모두 머리 위쪽에 있으니 보통 높이가 수평 위치보다 덜 정확합니다. 실제 GPS는 수신기 시계의 오차도 함께 풀어야 해서 위성이 4개 이상 필요합니다. 데모에서 “수신기 시계 오차도 함께 풀기”를 켜고 “머리 위에 몰림”을 누르면, 높이 오차(VDOP)가 수평 오차(HDOP)보다 훨씬 커지는 것을 볼 수 있습니다. 시계가 늦은 것과 내가 조금 아래에 있는 것이 측정값에서 거의 똑같이 보이기 때문입니다. 2강의 두 픽셀로 속도 구하기에서 분모 \(E_{x1}E_{y2} - E_{y1}E_{x2}\)가 작을 때(밝기 기울기가 비슷할 때) 잡음이 커지는 것도 똑같은 이야기입니다.

충돌 시간: 벽을 향해 똑바로 다가갈 때

이제 본론입니다. 2강에서 \(-Z/W\)(거리 ÷ 다가오는 속도)가 부딪히기까지 남은 시간이라는 걸 봤습니다. 그 역수를 \(C = -W/Z\)라고 하겠습니다. “1초에 남은 거리의 몇 분의 일씩 다가가는지”입니다.

벽을 향해 똑바로 다가가면 확장 초점이 사진 한가운데에 있고, 사진 속 점은 가운데에서 바깥으로 퍼집니다. 그 속도는 가운데에서 멀수록 큽니다.

\[u = C\,x, \qquad v = C\,y\]

이걸 2강의 밝기 변화 제약식 \(u E_x + v E_y + E_t = 0\)에 넣으면 미지수가 \(C\) 하나로 줄어듭니다.

\[C\,(x E_x + y E_y) + E_t = 0\]

괄호 안의 \(G = x E_x + y E_y\)는 “가운데에서 바깥쪽으로 갈 때 밝기가 얼마나 변하는가”입니다. 이 값을 반경 방향 기울기라고 부릅니다.

벽 무늬와 반경 방향 기울기 왼쪽: 사진 가운데에서 바깥으로 향하는 방향(주황). 오른쪽: 그 방향으로 밝기가 얼마나 변하는지를 색으로 칠한 것. 사진이 커지면 이 무늬들이 바깥으로 밀려나면서 밝기가 변합니다.

모든 픽셀에서 이 식의 오차 제곱 합을 최소로 만드는 \(C\)를 구하면, 답이 한 줄로 나옵니다.

\[C = -\frac{\displaystyle\iint G\,E_t \;dx\,dy}{\displaystyle\iint G^2 \;dx\,dy}, \qquad \text{충돌 시간} = \frac{1}{C}\]

이 계산의 좋은 점은 이렇습니다.

  • 물체를 찾을 필요가 없습니다. 모서리나 특징점을 찾아 짝 맞추는 과정 없이, 모든 픽셀에서 곱하고 더하기만 합니다(누산기 두 개면 끝). 이런 방식을 직접 계산이라고 합니다.
  • 초점거리를 몰라도 됩니다. 렌즈를 바꾸면 사진이 커지지만, 사진 속 움직임도 같은 비율로 커져서 비율은 그대로입니다.
  • 강의 첫 시간에 소개된 것처럼, 파리도 착지할 때 이런 “남은 시간”을 쓴다고 알려져 있습니다. 복잡한 추론 없이 구할 수 있는 양이라 생물에게도 그럴듯한 방법입니다.

비스듬히 다가갈 때: A, B, C 세 개 구하기

현실에서는 벽을 정면으로 향하지 않는 경우가 많습니다. 확장 초점이 가운데가 아니면 속도가 이렇게 바뀝니다.

\[u = A + C\,x, \qquad v = B + C\,y\]

\(A, B\)는 옆으로, 위아래로 움직이는 성분입니다. 밝기 변화 제약식은 \(A E_x + B E_y + C\,G + E_t = 0\)이 되고, 최소제곱(least squares)을 하면 3×3 연립방정식이 나옵니다. 이것도 픽셀마다 몇 가지 곱을 더해 두는 누산기로 계산됩니다. 답을 구하면 덤으로 확장 초점의 위치 \((-A/C,\; -B/C)\), 즉 내가 향하는 방향까지 나옵니다.

벽 무늬 사진으로 계산한 충돌 시간 가상의 벽 무늬 사진을 0.05초 간격으로 만들어 위 식으로 계산한 결과입니다. 정면이든 비스듬히든 진짜 값(점선)을 잘 따라갑니다. 벽에 아주 가까워지면 픽셀 하나에 비친 무늬가 너무 커져서 계산이 흔들립니다.

마지막 그림처럼 아주 가까워지면 계산이 흔들리는 문제가 생깁니다. 이 문제는 다음 강의에서 “사진을 작게 줄여서 계산하기”(다배율)로 해결합니다. 참고로 광마우스는 1초에 약 1800장을 찍습니다. 사진 사이의 움직임을 작게 유지해야 이런 미분 기반 계산이 잘 맞기 때문입니다.

직접 해 보기

밝기 미분만으로 충돌 시간 계산. 왼쪽은 벽에 1초에 1 m씩 다가가며 찍은 가상 사진입니다. 오른쪽 그래프에 진짜 남은 시간(점선)과 계산한 값이 그려집니다. 주황 점을 끌어 비스듬히 다가가게 하면, 초록 +(계산한 확장 초점)가 따라오는지 보세요. “사진 잡음”을 올리면 벽에 가까울 때 계산이 더 흔들립니다.

정리

  • 노이즈 이득은 “측정이 조금 틀릴 때 답이 몇 배로 틀리나”입니다. 곡선이 평평하거나 행렬식이 0에 가까우면 커집니다.
  • 여러 측정의 방향이 비슷하면(위성이 한쪽에 몰린 GPS처럼) 특정 방향으로 오차가 크게 늘어납니다.
  • 벽을 향해 다가갈 때 \(u = Cx,\ v = Cy\)로 놓으면 미지수가 하나가 되고, 모든 픽셀의 곱을 더하는 것만으로 충돌 시간 \(1/C\)를 구합니다.
  • 비스듬히 다가가면 \(A, B, C\) 세 개를 함께 구하고, 그러면 내가 향하는 방향(확장 초점)도 함께 나옵니다.

다음 글: [MIT 머신비전 4강] 착륙선이 부드럽게 내려앉는 법과 사진 피라미드

참고: MIT 6.801/6.866 Machine Vision (Fall 2020), Berthold Horn · Ryan Sander · Tadayuki Yoshitake 강의 노트 (MIT OpenCourseWare, CC BY-NC-SA 4.0)

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.