Knowledge/Vision

Camera undistortion (pinhole, KB model)

침닦는수건 2022. 12. 20. 15:52
반응형

이전 글 2022.12.07 - [Knowhow] - Fisheye camera model(KB, UCM, DS 모델) 에서 다음과 같은 논문의 말이 이해가 안된다고 적은 바 있다.

 

We propose the Double Sphere (DS) camera model that better fits cameras with fisheye lenses, has a closed-form inverse, and does not require computationally expensive trigonometric operations.

 

특히나, "a closed-form inverse"가 무엇인지 이해가 안되었는데, 카메라 모델 전반에 대해 조금 더 공부해보고 코드를 구현하던 중 unprojection을 정확하게 구할 수 없다는 의미인 것을 이해를 하게 되어 이에 대한 글을 쓰게 되었다. 

 

Introduction

 

핵심은 distortion이었다. Fisheye camera가 갖는 문제가 아니었다.

 

모든 카메라 모델 (pinhole 부터 double sphere 모델에 이르기까지)은 projection과 unprojection 수식 자체는 명확히 정의되어 있다. 단순 곱과 나눗셈으로 얽혀있기 때문에 명확하게 project/unproject가 가능하다.

 

하지만 이 과정에서 카메라 모델이 렌즈의 물리적 영향, 센서의 물리적 영향 등을 충분히 반영하여 3차원 공간과 이미지 간의 관계를 표현할 수 없을 경우, distortion 모델이 추가되게 된다.

 

pinhole 카메라는 기본적으로 distortion 모델과 보통 같이 이용하는 것을 많이 보았을텐데 그 이유가 pinhole 카메라는 렌즈 특성을 담을 수 없어 3차원 공간과 이미지 간의 관계를 정확히 표현할 수 없기 때문이다. 

 

pinhole을 계속 예로 들어 말을 해보면, 보통 이 distortion 모델은 우리가 흔히 아는 radial distortion과 tangential distortion이 합쳐진 형태인데 굉장히 높은 차수의 다항식으로 구성되어 있고 이 식이 추가되는 순간 project/unproject가 단순해지지 않는다. (숨겨진 k와 p, s 등 다양한 계수가 더 추가되면 차수가 더 높아진다) 

 

 

undistorted space에서 좌표를 알고 있을 경우 이를 distorted space로 만드는 것은 단순히 곱연산으로 끝나는 문제지만, 이의 역방향 연산을 해야하는 경우 곧바로 N차 다항식의 해를 구해야 하는 복잡한 문제가 된다.

 

계수에 따라 해가 존재하지 않을 수도, 무수히 많을 수도 설령 유니크하더라도 이를 찾아내는 건 간단하지 않다. 

 

뒤에 다른 모델의 경우도 설명하겠지만, 중간에 arctan 같은 삼각함수의 inverse가 껴있을 경우, 더 복잡해진다. 

 

이러한 경우에는 보통 approximation을 통해 가장 유사한 해를 찾게 되고 newton method 와 같은 방법이 이용되기도 한다.

 

정리해서 말하면, 카메라 모델의 표현력이 부족하여 distortion 모델을 동반하는 경우, unprojection 과정은 깔끔한 계산을 통해서 이루어질 수 없다. 이 의미가 closed-form inverse를 갖고 있지 않다는 것이다. 

 

 

Note : Newton method

Newton method란 다음 수식을 통해 근사 해를 찾는 기법 중 하나다. gradient descent 기법과 매우 동일하나 step 사이즈 만큼만 이동하는 것 대신 x축과의 교점을 찾아 큼직큼직 움직이는게 차이점이다. 

 

1. Pinhole camera model

 

Pinhole 카메라의 undistort는 실제로 어떻게 이루어지고 있었을까? 실제로 approximation 형태를 띄고 있다. 

 

Newton method

 

Newton method를 취한다면 다음과 같은 형태일 것이다. 

 

임의의 점 x, y를 disotrtion시켰을 때, 관찰된 distorted point (x_d, y_d)와 차이를 f로 지정했다. 그리고 위 식의 미분 형태도 계산한다. 

 

최종적으로 다음과 같이 값을 계산하여 임의의 점 x,y를 업데이트하는 일을 반복한다.

 

보통 일정 수준의 threshold 이하로 업데이트 양이 줄어들 때까지 반복하거나, 임의로 사용자가 정의한 횟수만큼 반복한다. 

 

반복 횟수를 늘리면 정확성이 올라가겠지만 그만큼 속도가 느려지는 단점이 있다. 

 

Others

 

Newton method도 결국 error를 최소화하는 방향으로 점점 업데이트하는 방법일 뿐, 꼭 저 수식을 사용할 필요는 없다. 

단순히 위와 같이 error를 매번 더해주는 식으로 업데이트해도 충분한 iteration을 돌리면 비슷한 결과를 얻을 수 있다.  

 

2. KB (kannala-brandt) model

이전 포스팅에서 소개한 다양한 카메라 모델 중, UCM이나 DS 모델의 경우 구면으로 3차원 포인트를 projection한 뒤 pinhole camera로 촬영한 것과 같은 의미를 갖는다고 한 바 있다. 

 

따라서 이 두 모델들에 포함된 distortion을 pinhole camera와 동일한 형태를 띄고 있다. 그래서 앞서 소개한 방식과 동일하다.

 

하지만 KB 모델은 애초에 pinhole 카메라 그대로이지만 distortion이 특별해서 광각이 되었다는 가정이기 때문에 distortion 모델이 다르다. 

 

KB 모델의 distortion도 고차 다항식 형태를 띄고 있어서 approximation을 통해 구해야 하는데 그 형태를 보여주고자 한다. 

 

일단 KB 모델의 projection을 다시 보여주면 다음과 같다. 

 

 

theta라는 새 변수로 정의되어 있으며, 이는 arctan 함수를 통해 얻어진다. 보기만 해도 inverse가 힘들 것 같은 모양이다. 아래 inverse 형태도 정확히 수식을 기술하기보다 알아서 계산해라라는 의미로 그냥 대충 표기한 것을 볼 수 있다. 

 

이 경우 역시 closed-form inverse를 구하기 어렵다. Newton method 수식을 직접 전개해보았는데 다음과 같다.

 

Newton method

 

이전과 같은 형태로 임의의 점 x, y를 disotrtion시켰을 때, 관찰된 distorted point (x_d, y_d)와 차이를 f로 지정했다. 그리고 위 식의 미분 형태도 계산한다. 먼저 필요한 중간 값들을 계산하여 나열한다.

 

식이 엄청 복잡한 듯 하지만 차근차근 chain rule에 따라 전개하면 나오는 결과이다.

 

최종적으로 미분 형태까지 얻어준 뒤,

 

동일한 방식으로 업데이트를 거듭하여 undistort를 완료해주면 된다. 

 

Conclusion

distortion이 끼는 순간 unprojection은 closed-form inverse가 불가능하므로 approximation을 할 수 밖에 없다. 이는 threshold나 iteration 수 같은 hyperparameter를 통해 성능이나 속도가 좌우되는 형태이다. 따라서 꽤나 아쉬운 상황이라고 할 수 있다.

 

이를 그나마 회피,해결할 수 있는 방법은 DS(double sphere) model을 쓰는 것일 수 있겠다. DS model 자체는 표현력이 타모델에 비하여 뛰어나 distortion 모델의 개입없이도 웬만한 카메라를 커버할 수 있다고 한다. 즉, DS model은 캘리브레이션했을 때 distortion이 가장 적게 개입되는 형태로 계산이 되므로 distortion을 무시해도 될 확률이 가장 높은 모델이다. 따라서 unprojection을 많이 사용해야 하는 코드를 작성할 시 카메라 모델은 DS model로 사용한 뒤, zero distortion을 가정하고 쓰는 것이 유리할 듯 하다.

 

(이해하는데까지 꽤 시간이 걸린 것 같은데 약간의 지적 도약을 한 것 같아 뿌듯하다.)

반응형