[MIT 머신비전 4강] 착륙선이 부드럽게 내려앉는 법과 사진 피라미드 | 이미지 피라미드와 에일리어싱
MIT 6.801 머신비전(Machine Vision, Berthold Horn) 4강 정리. 충돌 시간으로 착륙선을 제어하는 법, 다중 해상도 이미지 피라미드(Image Pyramid), 에일리어싱(Aliasing)과 광류를 쉽게 설명합니다.
MIT OpenCourseWare 6.801 4강 원본 영상 (영어)
한 줄 요약: 충돌 시간을 “1초에 0.5초씩” 줄여 가도록 조종하면, 거리나 속도를 몰라도 착륙선이 일정하게 감속하며 딱 땅에 닿을 때 멈춥니다. 가까워질수록 흔들리는 계산은 사진을 작게 줄여 쌓은 피라미드로 해결하는데, 줄일 때는 먼저 뭉개야 거짓 무늬가 생기지 않습니다.
충돌 시간을 보는 세 가지 방법
3강에서 충돌 시간을 “거리 ÷ 다가오는 속도”로 정의했습니다. 같은 값을 몇 가지 다른 모습으로 쓸 수 있습니다.
\[T = \frac{Z}{-\,dZ/dt} = \frac{1}{-\,\dfrac{d}{dt}\ln Z} = \frac{s}{\,ds/dt\,}\]- 가운데 식은 “거리에 로그를 씌운 그래프의 기울기”입니다.
- 오른쪽 식의 \(s\)는 사진 속 물체의 크기입니다. 사진 속 크기는 거리에 반비례하므로, 거리가 줄어드는 비율과 크기가 커지는 비율이 똑같습니다. 5강의 첫 이야기가 바로 이것입니다.
3강에서는 벽이 카메라와 정면으로 마주 보는 경우만 다뤘습니다. 벽이 비스듬히 기울어 있으면 거리 \(Z\)가 위치마다 달라지지만, 다행히 \(1/Z\)는 사진 좌표 \(x, y\)에 대해 일차식이 됩니다. 그래서 미지수가 세 개인 일차 연립방정식으로 여전히 풀립니다.
그럼 벽이 울퉁불퉁하면 다항식으로 모양을 더 자세히 나타내야 할까요? 강의의 답은 “그냥 평면으로 두는 편이 실제로는 더 잘 된다”입니다. 미지수를 늘리면 잡음에 휘둘리기 쉬워집니다. 머신러닝으로 말하면 과적합입니다.
가까워질수록 흔들리는 문제와 사진 피라미드
3강 마지막 그림처럼 벽에 아주 가까워지면 계산이 흔들립니다. 무늬가 사진에서 엄청 커져서, 픽셀 사이의 밝기 차이가 너무 작아지고 잡음에 묻히기 때문입니다. 해결책은 사진을 작게 줄여서 계산하는 것입니다. 2×2 픽셀을 하나로 합치면 무늬가 다시 적당한 크기가 되고, 평균을 내는 과정에서 잡음도 줄어듭니다. 계산할 픽셀 수도 4분의 1로 줄어듭니다.
반씩 줄인 사진을 계속 쌓아 둔 것을 사진 피라미드라고 합니다.
가로세로를 반씩 줄이면 넓이는 4분의 1이 됩니다. 1 + 1/4 + 1/16 + … = 4/3이라서, 모든 단계를 다 저장해도 원본보다 33%만 더 듭니다.
줄일 때 조심할 것: 거짓 무늬
사진을 줄일 때 픽셀을 그냥 띄엄띄엄 골라내면 문제가 생깁니다. 촘촘한 무늬가 있으면, 원래 없던 굵은 무늬가 나타납니다. 이것을 앨리어싱이라고 합니다. 바퀴가 거꾸로 도는 것처럼 보이는 영상이나, 체크무늬 셔츠를 찍었을 때 생기는 물결무늬가 같은 현상입니다.
가운데: 촘촘한 줄무늬를 그냥 골라내 줄였더니 엉뚱한 방향의 굵은 무늬가 생겼습니다. 오른쪽: 먼저 살짝 뭉갠 뒤 줄이면, 표현할 수 없는 촘촘한 무늬는 회색으로 사라질 뿐 거짓 무늬가 생기지 않습니다.
나이퀴스트 표본화 정리에 따르면, 무늬 한 주기에 최소 두 픽셀은 있어야 그 무늬를 제대로 나타낼 수 있습니다. 그래서 사진을 줄이기 전에, 줄인 뒤 표현할 수 없을 만큼 촘촘한 무늬를 미리 뭉개서 없애야 합니다.
충돌 시간으로 착륙선 조종하기
충돌 시간은 실제로 쓰이는 곳이 많습니다. 공항에서 비행기 날개가 다른 물체에 부딪히지 않게 하거나, 주차장을 빠져나오는 차가 앞의 버스를 보고 언제 브레이크를 밟을지 정하는 데 쓰입니다. 강의에서 자세히 다룬 예는 달이나 행성에 내리는 착륙선입니다. 카메라로 잰 충돌 시간만 보고 엔진을 조절하는 방법입니다.
방법 1: 충돌 시간을 늘 일정하게 유지하기. 충돌 시간을 항상 10초로 맞추면, 높이가 줄어드는 속도가 높이에 비례하므로 높이는 지수 함수로 줄어듭니다.
\[Z(t) = Z_0\, e^{-t/T}\]계속 느려지기만 하고 영원히 땅에 닿지 않습니다. 그동안 중력을 버티느라 연료를 계속 씁니다.
방법 2: 일정하게 감속하기. 감속도가 일정하면 높이는 \(Z = \tfrac12 a (t_0 - t)^2\) 꼴로 줄어들고, \(t_0\)에 속도 0으로 딱 착지합니다. 이때 카메라가 재는 충돌 시간을 계산해 보면 재미있는 결과가 나옵니다.
\[T = \frac{Z}{-\,dZ/dt} = \frac{\tfrac12 a (t_0 - t)^2}{a (t_0 - t)} = \frac{t_0 - t}{2}\]
왼쪽: 일정하게 감속하면 20초에 착지하지만, 충돌 시간을 일정하게 유지하면 40초가 지나도 아직 공중에 있습니다. 오른쪽: 일정하게 감속하는 동안 카메라가 재는 충돌 시간은 실제 남은 시간의 절반이고, 1초에 0.5초씩 일정하게 줄어듭니다.
즉 “충돌 시간이 1초마다 0.5초씩 줄어들게” 엔진을 조절하면, 거리도 속도도 모르는 채 일정한 감속으로 정확히 착지합니다. 0.5보다 빨리 줄이면 마지막 순간에 급제동해야 하고, 1이면 속도를 전혀 줄이지 않은 채 부딪힙니다.
광류: 모든 점이 같이 움직이지 않을 때
지금까지는 사진 전체가 한 가지 방식으로 움직인다고 가정했습니다. 하지만 여러 물체가 제각각 움직이면 픽셀마다 속도가 다르고, 2강에서 봤듯 픽셀 하나에는 식이 하나뿐이라 속도 두 개를 정할 수 없습니다. 한 가지 방법은 사진을 작은 조각으로 나누어, 조각마다 “이 안에서는 같이 움직인다”고 보고 따로 푸는 것입니다. 조각이 너무 작으면 그 안의 무늬가 단조로워서(밝기 기울기가 모두 비슷해서) 답이 불안정해지니 크기를 적당히 골라야 합니다. 이웃 픽셀이 비슷하게 움직인다는 성질을 더 똑똑하게 쓰는 방법은 뒤의 강의에서 다룹니다.
움직임 모델을 조금 넓힐 수도 있습니다. 광마우스를 책상 위에서 돌리면 미끄러짐에 회전이 더해집니다.
미끄러짐 \((u_0, v_0)\)와 제자리 회전 \(\omega\)를 합치면 미지수가 세 개가 되고, 같은 최소제곱(least squares) 방법으로 3×3 연립방정식을 풀면 됩니다.
다음 이야기: 소실점
강의 마지막에는 소실점이 처음 등장합니다. 세상의 평행한 직선들은 사진에서 한 점으로 모이고, 그 점은 직선의 방향만으로 정해집니다. 정육면체처럼 서로 직각인 세 방향의 모서리가 보이면 소실점이 세 개 생기고, 이것으로 카메라의 렌즈 중심 위치(카메라 보정)를 구할 수 있습니다. 이 이야기는 다음 글에서 자세히 봅니다.
직접 해 보기
① 충돌 시간으로 착륙하기. 슬라이더로 “충돌 시간을 1초마다 줄이는 양”을 정하고 “내려가기”를 눌러 보세요. 0이면 영원히 떠 있고, 0.5면 일정하게 감속하며 부드럽게 착지하고, 1이면 그대로 부딪힙니다. 무리한 급제동 없이 내려앉는 값(0.5 이하) 가운데서는 0.5가 가장 빨리 내려가고 연료도 가장 적게 씁니다.
② 거짓 무늬. 줄무늬 간격을 줄여 가며 보세요. 줄인 뒤 한 주기가 2픽셀보다 짧아지는 순간, 가운데 그림에 엉뚱한 무늬가 나타납니다. 오른쪽처럼 먼저 뭉개면 그런 무늬가 생기지 않습니다.
정리
- 충돌 시간은 “거리 ÷ 속도”이자 “사진 속 크기 ÷ 커지는 속도”입니다. 기운 벽도 미지수 세 개짜리 일차식으로 풀 수 있고, 울퉁불퉁한 벽도 평면으로 근사하는 편이 더 안정적입니다.
- 가까워져서 계산이 흔들리면 사진을 줄인 피라미드에서 계산합니다. 모든 단계를 저장해도 원본의 4/3배면 됩니다.
- 사진을 줄일 때는 먼저 뭉개야 합니다. 그러지 않으면 한 주기가 2픽셀보다 짧은 무늬가 거짓 무늬로 바뀝니다.
- 충돌 시간이 1초에 0.5초씩 줄도록 조종하면, 거리와 속도를 몰라도 일정하게 감속해 정확히 착지합니다.
참고: MIT 6.801/6.866 Machine Vision (Fall 2020), Berthold Horn · Ryan Sander · Tadayuki Yoshitake 강의 노트 (MIT OpenCourseWare, CC BY-NC-SA 4.0)