Notes de recherche : Vision géométrique entièrement apprenable de bout en bout par rétropropagation de l'optimisation PnP

本文针对传统 PnP 方法与深度学习的结合做了一些工作,整体思路比较简单,主要就是怎么把传统方法 PnP 的残差反向传播给神经网路,从而能够实现 End2End 的训练,以及无需给定数据关联下的计算(Blind PnP)。

1 Rétropropagation d'un solveur PnP (BPnP)

Tout d'abord, décrivons le problème PnP en langage mathématique.

Définissons g comme un solveur PnP, dont la sortie y est la pose 6DoF résolue :

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

Où x représente les observations des coordonnées 2D des points caractéristiques sur l'image, z représente les coordonnées des points 3D dans l'espace, et K est la matrice des paramètres intrinsèques de la caméra :

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}

En fait, résoudre PnP revient à résoudre ce problème d'optimisation :

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) est la fonction de projection, et boldsymbol{r}_{i}=boldsymbol{x}_{i}-boldsymbol{pi}_{i} est l'erreur de reprojection.

Cela peut être simplifié comme suit :

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

Où :

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

1.1 Dérivation de la fonction implicite

1.2 Construction de la fonction de contrainte f

Définissons la fonction objectif de PnP comme suit :

o(boldsymbol{x}, boldsymbol{y}, boldsymbol{z}, mathbf{K})=sum_{i=1}^{n}left|boldsymbol{r}_{i}right|_{2}^{2}tag{6}

Lorsque la fonction objectif atteint son minimum, nous avons :

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}

Nous définissons ainsi :

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

Où :

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 Passes avant et arrière

Nous réécrivons d'abord la fonction PnP en introduisant une pose initiale y^{(0)} :

boldsymbol{y}=gleft(boldsymbol{x}, boldsymbol{z}, mathbf{K}, boldsymbol{y}^{(0)}right)tag{10}

Selon la règle de dérivation des fonctions implicites, nous avons :

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}

Pour un réseau de neurones, nous pouvons obtenir le gradient de sortie nabla boldsymbol{y}, et les gradients d'entrée respectifs sont :

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 Notes d'implémentation

2 Apprentissage de bout en bout avec BPnP

2.1 Estimation de la pose

Cette section décrit le processus d'estimation de la pose y à partir des coordonnées des points clés observés x, avec une carte z connue et des paramètres intrinsèques de la caméra K, comme suit :

La perte est décrite par la formule suivante :

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}

Un calcul important de la mise à jour du gradient dans ce processus est le suivant :

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}

L'image ci-dessous montre le processus de convergence dans deux cas, où la première ligne correspond à lambda = 1 et la deuxième ligne à lambda = 0.

La Figure 1 représente h(I; theta) = theta

La Figure 2 représente un réseau VGG11 modifié.

À partir de ces deux expériences, nous pouvons voir que, qu'il y ait ou non un terme de régularisation, les deux convergent, et lorsque lambda = 1, les deux atteignent une meilleure convergence.

2.2 SfM avec caméras calibrées

Cette section est

La perte est définie comme suit :

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}

Le calcul du gradient dans ce processus est le suivant :

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}

L'image ci-dessous montre le processus de convergence d'un SfM :

2.3 Calibration de la caméra

Le processus de calibration de la caméra est le suivant :

La perte est définie comme suit :

l(mathbf{K}, boldsymbol{y})=|boldsymbol{x}-pi(boldsymbol{z} mid boldsymbol{y}, mathbf{K})|_{2}^{2}tag{17}

Le calcul du gradient est le suivant :

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 Estimation de la pose d'objet avec BPnP

Enfin, l'auteur a conçu un processus d'estimation de la pose d'objet basé sur BPnP :

Article & Code source

Article : https://arxiv.org/abs/1909.06043
Code source : https://github.com/BoChenYS/BPnP
Vidéo : https://www.youtube.com/watch?v=eYmoAAsiBEE

Add a Comment

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *