논문 노트: End-to-End Learnable Geometric Vision by Backpropagating PnP Optimization

本文针对传统 PnP 방법과 딥러닝의 결합에 대해 몇 가지 작업을 수행했으며, 전체적인 아이디어는 비교적 간단합니다. 주로 전통적인 PnP 방법의 잔차를 신경망에 역전파하여 End2End 훈련을 실현하고, 데이터 연관을 제공하지 않고도 계산할 수 있는 방법(Blind PnP)을 구현하는 것입니다.

1 PnP solver의 역전파 (BPnP)

먼저 수학적 언어로 PnP 문제를 설명합니다.

g를 PnP solver로 정의하고, 그 출력 y는 6DoF 자세를 구하는 것입니다:

boldsymbol{y}=g(boldsymbol{x}, boldsymbol{z}, mathbf{K})tag{1}

여기서 x는 이미지에서 특징점의 2D 좌표 관측을 나타내고, z는 공간에서의 3D 점 좌표를 나타내며, 이는 일대일 대응하는 매핑을 나타냅니다. K는 카메라의 내부 파라미터입니다:

begin{array}{l}boldsymbol{x}=left[begin{array}{llll}boldsymbol{x}_{1}^{T} & boldsymbol{x}_{2}^{T} & ldots & boldsymbol{x}_{n}^{T}end{array}right]^{T} in mathbb{R}^{2 n times 1} \boldsymbol{z}=left[begin{array}{llll}boldsymbol{z}_{1}^{T} & boldsymbol{z}_{2}^{T} & ldots & boldsymbol{z}_{n}^{T}end{array}right]^{T} in mathbb{R}^{3 n times 1}end{array}tag{2}
사실 PnP를 푸는 것은 다음과 같은 최적화 문제입니다:

boldsymbol{y}=underset{boldsymbol{y} in S E(3)}{arg min } sum_{i=1}^{n}left|boldsymbol{r}_{i}right|_{2}^{2}tag{3}
여기서 boldsymbol{pi}_{i}=pileft(boldsymbol{z}_{i} mid boldsymbol{y}, mathbf{K}right)는 투영 함수이고, boldsymbol{r}_{i}=boldsymbol{x}_{i}-boldsymbol{pi}_{i}는 재투영 오차입니다.

다음과 같이 간단히 표현할 수 있습니다:

boldsymbol{y}=underset{boldsymbol{y} in S E(3)}{arg min } quad|boldsymbol{x}-boldsymbol{pi}|_{2}^{2}tag{4}
여기서:

boldsymbol{pi}:=left[boldsymbol{pi}_{1}^{T}, ldots, boldsymbol{pi}_{n}^{T}right]^{T}tag{5}

1.1 암함수 미분

1.2 제약 함수 f 구성

PnP의 목적 함수를 다음과 같이 정의합니다:

o(boldsymbol{x}, boldsymbol{y}, boldsymbol{z}, mathbf{K})=sum_{i=1}^{n}left|boldsymbol{r}_{i}right|_{2}^{2}tag{6}
목적 함수가 최소값을 취할 때:

left.frac{partial o(boldsymbol{x}, boldsymbol{y}, boldsymbol{z}, mathbf{K})}{partial boldsymbol{y}}right|_{boldsymbol{y}=g(boldsymbol{x}, boldsymbol{z}, mathbf{K})}=mathbf{0}tag{7}
우리는 다음과 같이 정의합니다:

f(boldsymbol{x}, boldsymbol{y}, boldsymbol{z}, mathbf{K})=left[f_{1}, ldots, f_{m}right]^{T}tag{8}
여기서:

begin{aligned}f_{j} &=frac{partial o(boldsymbol{x}, boldsymbol{y}, boldsymbol{z}, mathbf{K})}{partial y_{j}} \&=2 sum_{i=1}^{n}leftlangleboldsymbol{r}_{i}, frac{partial boldsymbol{r}_{i}}{partial y_{j}}rightrangle \&=sum_{i=1}^{n}leftlangleboldsymbol{r}_{i}, boldsymbol{c}_{i j}rightrangle \boldsymbol{c}_{i j} &=-2 frac{partial boldsymbol{pi}_{i}}{partial y_{j}}end{aligned}tag{9}

1.3 순전파 및 역전파

우리는 먼저 PnP 함수를 다시 작성하고 초기 자세 y^{(0)} 를 도입합니다:

boldsymbol{y}=gleft(boldsymbol{x}, boldsymbol{z}, mathbf{K}, boldsymbol{y}^{(0)}right)tag{10}
암함수 미분 법칙에 따르면:

begin{aligned}frac{partial g}{partial boldsymbol{x}} &=-left[frac{partial f}{partial boldsymbol{y}}right]^{-1}left[frac{partial f}{partial boldsymbol{x}}right] \frac{partial g}{partial boldsymbol{z}} &=-left[frac{partial f}{partial boldsymbol{y}}right]^{-1}left[frac{partial f}{partial boldsymbol{z}}right] \frac{partial g}{partial mathbf{K}} &=-left[frac{partial f}{partial boldsymbol{y}}right]^{-1}left[frac{partial f}{partial mathbf{K}}right]end{aligned}tag{11}
신경망의 경우 출력의 기울기 nabla boldsymbol{y}를 얻을 수 있으며, 각 입력 기울기는 다음과 같습니다:

begin{aligned}nabla boldsymbol{x} &=left[frac{partial g}{partial boldsymbol{x}}right]^{T} nabla boldsymbol{y} \nabla boldsymbol{z} &=left[frac{partial g}{partial boldsymbol{z}}right]^{T} nabla boldsymbol{y} \nabla mathbf{K} & =left[frac{partial g}{partial mathbf{K}}right]^{T} nabla boldsymbol{y}end{aligned}tag{12}

1.4 구현 노트

2 BPnP를 사용한 End-to-end 학습

2.1 자세 추정

이 부분은 알려진 지도 z와 카메라 내부 파라미터 K를 기반으로 관측된 키포인트 좌표 x를 통해 자세 y를 추정하는 과정을 설명하며, 그 과정은 다음과 같습니다:

그 loss는 다음과 같은 공식으로 설명됩니다:

l(boldsymbol{x}, boldsymbol{y})=left|pi(boldsymbol{z} mid boldsymbol{y}, mathbf{K})-pileft(boldsymbol{z} mid boldsymbol{y}^{*}, mathbf{K}right)right|_{2}^{2}+lambda R(boldsymbol{x}, boldsymbol{y})tag{13}

위 과정에서 중요한 기울기 업데이트는 다음과 같습니다:

frac{partial ell}{partial boldsymbol{theta}}=frac{partial l}{partial boldsymbol{y}} frac{partial g}{partial boldsymbol{x}} frac{partial h}{partial boldsymbol{theta}}+frac{partial l}{partial boldsymbol{x}} frac{partial h}{partial boldsymbol{theta}}tag{14}

아래 그림은 두 가지 경우의 수렴 과정을 보여줍니다. 첫 번째 행은 모두 lambda = 1, 두 번째 행은 모두 lambda = 0입니다.

Figure 1은 h(I; theta) = theta를 나타냅니다.

Figure 2는 수정된 VGG11 네트워크를 나타냅니다.

이 두 실험에서 우리는 정규화 항을 사용하든 사용하지 않든 모두 수렴할 수 있으며, lambda = 1일 때 둘 다 더 나은 수렴 효과를 얻을 수 있음을 알 수 있습니다.

2.2 보정된 카메라를 사용한 SfM

이 부분은

그 loss는 다음과 같이 정의됩니다:

lleft(left{boldsymbol{y}^{(j)}right}_{j=1}^{N}, boldsymbol{z}right)=sum_{j=1}^{N}left|boldsymbol{x}^{(j)}-pileft(boldsymbol{z}^{(j)} mid boldsymbol{y}^{(j)}, mathbf{K}right)right|_{2}^{2}tag{15}
그 과정에서 기울기 유도는 다음과 같습니다:

frac{partial ell}{partial boldsymbol{theta}}=sum_{j=1}^{N}left(frac{partial l}{partial boldsymbol{z}^{(j)}} frac{partial boldsymbol{z}^{(j)}}{partial boldsymbol{theta}}+frac{partial l}{partial boldsymbol{y}^{(j)}} frac{partial boldsymbol{y}^{(j)}}{partial boldsymbol{z}^{(j)}} frac{partial boldsymbol{z}^{(j)}}{partial boldsymbol{theta}}right)tag{16}
아래 그림은 SfM의 수렴 과정을 보여줍니다:

2.3 카메라 보정

카메라 보정 과정은 다음과 같습니다:

그 loss는 다음과 같이 정의됩니다:

l(mathbf{K}, boldsymbol{y})=|boldsymbol{x}-pi(boldsymbol{z} mid boldsymbol{y}, mathbf{K})|_{2}^{2}tag{17}
기울기 유도는 다음과 같습니다:

frac{partial ell}{partial boldsymbol{theta}}=frac{partial l}{partial mathbf{K}} frac{partial mathbf{K}}{partial boldsymbol{theta}}+frac{partial l}{partial boldsymbol{y}} frac{partial g}{partial mathbf{K}} frac{partial mathbf{K}}{partial boldsymbol{theta}}tag{18}

3 BPnP를 사용한 물체 자세 추정

최종적으로 저자는 BPnP 기반의 물체 자세 추정 과정을 설계했습니다:

논문 & 소스 코드

논문: https://arxiv.org/abs/1909.06043
소스 코드: https://github.com/BoChenYS/BPnP
Video: https://www.youtube.com/watch?v=eYmoAAsiBEE

Add a Comment

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다