Intro
이전 포스트에서 Optical Flow의 단서를 찾았다. 정확히 말하면 컴퓨터가 사람처럼 물체의 움직임을 인지하도록 만들 단서를 찾았다. 그러면 Optical Flow 계산만 남은 것일까? 진정 Computer는 사람처럼 물체의 움직임을 인지할 수 있을까?
이번 포스트에서는 이름부터 직접적으로 물체의 움직임을 나타내는 Motion Field와 Optical Flow를 비교한다. 즉, 놀랍게도 Optical Flow는 물체의 움직임을 나타내는 게 아니다. 그렇다면 도대체 무엇인가? 물체의 움직임을 나타낸 Motion Field를 먼저 살펴보도록 하자.
Motion Field
우리들의 친절한 이웃 Wikipedia는 Motion Field에 대해 다음과 같이 정의하고 있다.
In computer vision the motion field is an ideal representation of 3D motion as it is projected onto a camera image.(중략) The motion field is an ideal description of the projected 3D motion in the sense that it can be formally defined but in practice it is normally only possible to determine an approximation of the motion field from the image data.
위대한 papago의 힘을 빌리면 Motion Field는 CV에서 카메라 이미지에 투영되는 3D 모션의 이상적인 표현이다. 물체의 모든 움직임을 포착한다고 생각하면 된다. 아래 그림은 이상적인 Motion Field를 나타내고 있다.
정의를 알아봤으면 주의 깊게 봐야 할 표현은 'ideal'과 'in practice~'이다. 구글링의 달인이 된 공돌이 여러분은 이 표현들만 봐도 이 글이 무슨 말을 하고 싶은지 눈치챘을 것이다. 이 것은 이상적인 개념이고, 실제로는 불가능하거나 매우 힘들다. 정확하다. Motion Field를 정확하게 재현하는 것은 불가능하다. 정확히 표현하면 우리가 흔히 접하는 2D 이미지나 영상을 통해서는 불가능하다. 아마 3D Point Cloud을 홀로그램으로 재현하지 않는 이상 힘들 것이다.
그 이유는 여러 이유가 있겠지만 쉽게 풀면 위 그림과 같이 차원이 달라서이다. 실제 움직임은 3차원에서 일어난다. 하지만 우리가 Motion Field를 구해야 하는 이미지나 영상은 2차원 데이터이다. 차원이 축소되면서 투영되기 때문에 3차원 공간의 무수히 많은 벡터가 2차원 공간에 투영된다. 그림과 같이 겹치기도 할 것이다. 이로 인해 많은 양의 정보가 손실되고, 왜곡이 일어난다. 있는 그대로를 담는 것도 아직 못하는데 움직임을 모두 포착하려는 것은 과욕이다.
이러한 정보 손실로 인해 현실 이미지에서는 정확한 Motion Field를 구하지 못한다. 가장 대표적인 예시로 위 그림에서 볼 수 있는 구체 회전과 광원 회전에서 오류가 발생하기 쉽다. 위 그림은 앞으로 우리가 물체의 움직임을 구하기 위해 사용하는 Approximation 기법인 Optical Flow 결과와 실제 물체의 Motion을 비교한 예시이다. 좌측의 이미지는 실제로 Motion(회전)이 발생했지만, 영상 이미지에서는 아무런 변화가 없는 것처럼 보일 것이다. 반대로 우측 이미지는 실제로는 Motion이 발생하지 않았지만, 광원의 이동으로 인해 명암의 변화가 생겨 영상 이미지에서는 변화가 있는 것처럼 보일 것이다. 즉, 실제로 움직였지만 모션 벡터가 발생하지 않는 경우(FN)와 실제로는 움직이지 않았지만 모션 벡터가 발생하는 경우(FP)가 문제로 발생한다. 이 예시를 통해 Optical Flow가 무엇인지 감을 잡을 수 있을 것이다. Optical Flow는 엄밀히 말하면 물체의 움직임을 포착하는 방법이 아니다. 그렇다면 무엇일까?
Optical Flow
우리들의 친절한 이웃 Wikipedia는 Optical Flow에 대해 다음과 같이 정의하고 있다.
Optical Flow or optic flow is the pattern of apparent motion of objects, surfaces, and edges in a visual scene caused by the relative motion between an observer and a scene.
사실 이 문장은 이해하기가 쉽지 않다. 정확히 표현하자면 Motion Field 대비 차이점이 무엇인지 알기 쉽지 않다. 그 이유는 이 정의에는 How가 빠져있기 때문이다. 어떻게 측정하는데? 개념적으로는 Motion Field와 큰 차이가 없어서 혼동하기 쉽게 만드는 주범이라고 생각한다. 그래서 필자는 Wikipedia가 설명하는 두 번째 정의를 더 선호하는 편이다. 여기에는 How가 설명되어 있다.
Optical Flow can also be defined as the distribution of apparent velocities of movement of brightness pattern in an image.
Brightness pattern, 명암 변화만을 고려해 영상 이미지에서 변화를 포착하는 것이 바로 Optical Flow이다. 영상에서 명암 변화는 픽셀 값의 변화로 이어지고, 변화량을 알기 위해서는 이전 프레임과 현재 프레임의 차이와 현재 위치의 픽셀 값과 주변 픽셀들과의 관계를 분석해 각 픽셀의 Motion을 Approximation 할 수 있다. 즉, Optical Flow는 명시적으로 Motion을 계산하지는 않지만, Motion이 생김에 따라 발생하는 명암 변화를 계산함으로 암묵적으로 Motion Field의 역할을 할 수 있는 Map을 Output으로 생성한다.
서론이 길어지면서까지 Optical Flow를 Motion Field로부터 분리시킨 이유는 정확한 개념이 아닐뿐더러, 움직임을 계산하는 용도로 시야가 좁아질 위험이 있기 때문이다. 명암 변화만으로 Flow Map을 만드는 Optical Flow는 물체를 검출, 또는 물체의 움직임을 반영하는 등의 시도를 하지 않아 물체와는 독립적인 추정 방식이다. 이 포인트가 Signal Processing을 전공한 필자의 강한 흥미를 불러일으킨 포인트이다.
Next
이번 포스트에서는 Optical Flow에 대한 개념을 살펴보았다. 다음 포스트에서는 실제로 Optical Flow를 구하기 위해 어떤 조건이 필요한지 살펴볼 것이다. 힌트를 주자면 이전 포스트에서 다뤘던 Coherence 개념이 여기서도 똑같이 등장한다. 용어만 Spatial Coherence와 Temporal Persistence로 변해서 말이다.