Introduction

Gabarits 3D dans Tulip

Tulip des gabarits de repérage 3D, car il s'agit de la méthode la plus précise qui soit pour suivre des objets avec une grande fidélité dans un environnement très bruyant, tel qu'un atelier de production. Les repères de ces gabarits sont faciles à fixer sur les objets. On peut les placer sur un bac, un chariot élévateur, un semi-remorque ou un minuscule outil d'horloger : ils fonctionnent à n'importe quelle échelle, à condition que la caméra soit capable de les détecter. Un cas d'utilisation classique cas d'utilisation gabarits consiste, bien sûr, à suivre les objets dans lesquels la pièce s'insère, mais grâce aux capacités 3D, nous ajoutons la possibilité de suivre des objets complexes, avec des marqueurs collés sur différentes surfaces de l'objet.

Les gabarits sont constitués d’un ensemble de marqueurs 3D regroupés. Ces marqueurs 3D localisent précisément un emplacement sur l’objet 3D qui est ancré dans le « repère » (un repère correspond aux trois axes utilisés pour définir la position et l’orientation : les axes X, Y et Z) de l’objet, en supposant que celui-ci soit un corps rigide. Chaque fois que nous voyons un marqueur, nous savons qu’il est fixé au même point sur l’objet. Le groupe de marqueurs du gabarit définit un objet complet. Les gabarits peuvent définir des formes 3D complexes, certains marqueurs étant visibles et d’autres cachés. Les marqueurs visibles nous aident à déterminer l’emplacement et l’orientation de l’objet. Lorsque les marqueurs cachés apparaissent, ils compensent les autres marqueurs qui sont désormais cachés.

Optimisation de l'ajustement des faisceaux

Lorsqu’on définit un gabarit à partir de marqueurs, on capture de nombreuses vues de l’objet marqué sous différents angles par rapport à la caméra. Chaque image capturée par la caméra offre une nouvelle « vue » de l’objet avec ses marqueurs. Et pour chaque image, on calcule la position des marqueurs sur l’objet ainsi que leurs relations (transformations). Après avoir capturé suffisamment de vues, on les combine pour obtenir un modèle 3D complet de l’objet, ce qu’on appelle le processus de « registration ». Cependant, pour diverses raisons liées à l’optique et à la stabilité numérique des calculs, les vues autour de l’objet ne s’alignent pas toujours parfaitement. En effet, plus nous prenons de vues de l’objet, plus l’erreur cumulative d’enregistrement s’accroît, jusqu’à ce que l’enregistrement final puisse s’avérer inutilisable. C’est là qu’intervient l’« ajustement de faisceaux ».

L'ajustement de faisceaux (BA) est un processus d'optimisation numérique qui permet de corriger l'erreur cumulative résultant de l'alignement de plusieurs vues de caméra afin de reconstruire une géométrie. Dans le BA traditionnel, la quasi-totalité des paramètres de la reconstruction sont soumis à l'optimisation, y compris la modélisation optique de la caméra. Mais avant d'expliquer le processus du BA, il convient de définir les paramètres en jeu qui nécessitent une optimisation. Nous vous recommandons vivement de vous reporter à l'excellent ouvrage du professeur Richard Szeliski intitulé «Vision par ordinateur: Algorithms and Applications, publié chez Springer en 2011 (chapitre 7, p. 320).

Position de la caméra et de l'objet à l'aide de marqueurs 3D

Lorsqu'une caméra est orientée vers un marqueur, qui est un objet plat, il est possible de calculer l'orientation du marqueur par rapport à l'origine de la caméra. Observez le schéma suivant :

Ensembles de gabarits 3D en Vision par ordinateur

Le marqueur est visible dans le champ de vision de la caméra et projeté sur le plan de l'image — une construction conceptuelle qui permet d'établir la correspondance entre les coordonnées de pixels en 3D et en 2D. Cependant, lorsque l'on prend une photo de la scène contenant le marqueur, on ne connaît pas les paramètres du point 3D ; on ne peut que détecter l'emplacement où ces points 3D ont été projetés sur l'image 2D. Cette projection peut être exprimée par l'équation suivante :

Ensembles de gabarits 3D en Vision par ordinateur

Les coordonnées X, Y et Z correspondent aux coordonnées 3D, par exemple, du centre du marqueur, tandis que x et y correspondent à la position en pixels 2D des coins sur l'image. Cela souligne l'ambiguïté des paramètres, c'est-à-dire une information manquante, due au fait qu'un point 3D dans l'espace peut se situer n'importe où sur la ligne droite reliant le centre de la caméra au point 3D réel (voir les points orange estompés sur le schéma). En d’autres termes, des objets de toute échelle arbitraire peuvent apparaître sur l’image dans n’importe quelle taille arbitraire ; tout dépend de leur distance par rapport à la caméra. Nous avons également dans cette équation la rotation 3D (paramètres r) et la translation (paramètres t) de l’objet ou, inversement, de la caméra, sans perte de généralité. Les paramètres f et c sont les « paramètres intrinsèques » qui modélisent l’optique de la caméra (de manière très approximative dans cet exemple simplifié).

Il existe néanmoins une relation linéaire entre les points 3D et les points 2D, et si nous connaissions tous les paramètres de cette équation, nous pourrions calculer : (1) la position 3D réelle du marqueur à partir des coordonnées 2D des pixels, et (2) la rotation ri et la translation tx, y, z du marqueur par rapport à la caméra. On notera que pour travailler avec des coordonnées 2D, on ne peut pas simplement supprimer le paramètre de notre équation ; en effet, pour obtenir les coordonnées des pixels, il faudrait diviser par le dernier élément du vecteur : x' = λx, x = x'/λ, y' = λy, y = y'/λ.

Si l’on dispose d’un nombre suffisant de points correspondants entre la 2D et la 3D, on peut réécrire l’équation ci-dessus sous la forme d’un système d’équations linéaires (homogènes) permettant de déterminer R et t. Grâce aux marqueurs 3D, on peut obtenir au moins quatre paires de points 2D-3D correspondantes pour chaque marqueur. Les points 2D sont obtenus en analysant l’image et en identifiant les coins. Les points 3D sont déterminés par la disposition du marqueur, que nous contrôlons également (puisque nous avons imprimé le marqueur). Le processus global de récupération de la pose est connu sous le nom de « Perspective-n-Point » et il existe de nombreuses approches et algorithmes pour le résoudre. Voici, par exemple, comment on pourrait déterminer la pose de la caméra en Python avec OpenCV à partir d’un ensemble de points 2D-3D alignés :

 _, R, t = cv2.solvePnP(aligned_3d, aligned_2d, K, dc)

Le problème d'optimisation

Annotons la dernière opération de « projection » comme suit :

Ensembles de gabarits 3D en Vision par ordinateur
$$P_{2D}=\mathrm{Proj}([R|t], P_{3D})$$

En d'autres termes, on obtient la position 2D en pixels (P2D) en projetant le point 3D P3D et en appliquant la rotation R et la translation t entre la caméra et l'objet. Le principal problème de ce régime de projection réside dans le fait qu'il repose sur des calculs effectués à partir des points 2D en coordonnées de pixels, qui ne sont pas très précises et qui sont en outre quantifiées sur la grille de pixels. Si l’on reprojette les points 3D (en les projetant à nouveau en 2D sur l’image) après avoir déterminé la pose de l’objet [R|t], on constate souvent que les positions 2D présentent un décalage par rapport à leurs positions dans l’image. L’image suivante illustre ces décalages, qui sont généralement plus marqués dans des situations extrêmes, telles qu’un angle important par rapport à la caméra ou en présence de flou.

Gabarits 3D en Vision par ordinateur

Notre objectif est de déterminer les paramètres de position de la caméra de manière à ce que tous ces décalages en 2D soient aussi faibles que possible. Pour exprimer cela sous forme de formule, nous souhaitons résoudre le problème de minimisation suivant, qui vise à trouver la valeur optimale de [R|t] minimisant les résidus :

Équation
\hat{[R|t]} = \arg\min_{[R|t]} \sum_i \Vert \mathrm{Proj}([R|t],P_i^{\mathrm{3D}}) - P_i^{\mathrm{2D}} \Vert^2

La différence entre le point 3D reprojeté et le point 2D est appelée « résidu ». De manière générale, on qualifie ce problème de « problème des moindres carrés », puisque l'on élève le résidu au carré. Ce cas particulier est un problème des moindres carrés non linéaire, car l'opérateur Proj(.) est non linéaire. Une fois cette formulation établie, nous pouvons également intégrer au problème d'optimisation, par exemple, les paramètres intrinsèques de la caméra et déterminer leurs valeurs optimales :

Équation
\hat{[R|t]}, \hat{\{P^\mathrm{3D}\}}, \hat{K} = \arg\min_{[R|t], \{P^\mathrm{3D}\}, K} \sum_i \Vert \mathrm{Proj}([R|t], P_i^{\mathrm{3D}}, K) - P_i^{\mathrm{2D}} \Vert^2

Voici un exemple de calcul des résidus en Python avec OpenCV à partir de paires de points 2D-3D correspondantes, et de génération d'une liste de résidus :

def calcResiduals(Rt) :
    projPts2d, _ = cv2.projectPoints(pts3d, Rt[:3], Rt[3:], K, None)
    return (np.squeeze(projPts2d2) - pts2d21).ravel()

Heureusement, il existe de nombreux algorithmes et logiciels permettant de résoudre des problèmes de moindres carrés non linéaires, tels que Ceres Solver, diverses méthodes MATLAB, SciPy pour Python, et bien d’autres encore. Par exemple, avec SciPy et OpenCV, on pourrait résoudre le problème de la manière suivante :

res = scipy.optimize.least_squares(calcResiduals, 
 np.hstack([
 cv2.Rodrigues(R)[0], 
 t[np.newaxis]
 ]).ravel())

Réalisation de la conception de gabarits 3D

Jusqu’à présent, nous avons abordé le BA en termes généraux, mais nos objectifs d’optimisation pour les gabarits 3D sont quelque peu différents. Lorsque nous construisons nos gabarits 3D, nous créons en substance une carte 3D. La cartographie (et la localisation) est un problème bien connu, notamment dans la navigation autonome et l’odométrie, où un véhicule doit s’orienter dans l’espace en se basant sur les observations de caméras. Notre technique de cartographie des gabarits s’apparente aux algorithmes SLAM (Simultaneous Localization and Mapping), en ce sens qu’elle construit une carte du monde observé de manière incrémentielle et y applique occasionnellement la BA afin de réduire l’erreur résiduelle issue des différents algorithmes d’estimation linéaire.

Gabarits 3D en Vision par ordinateur

Comme mentionné dans la première section, dans une image donnée, nous pouvons voir certains marqueurs mais pas d’autres, et à mesure que la cartographie progresse, nous disposons de plus d’indices sur la position des marqueurs les uns par rapport aux autres. Nous commençons par les premiers marqueurs visibles et notons leur structure 3D, en supposant que cette structure ne changera jamais. Par exemple, la transformation entre le marqueur 1 et le marqueur 2 est notée T12. Dans une image suivante, on ne voit plus le marqueur 1 mais le marqueur 3 apparaît, tandis que le marqueur 2 reste visible. On note la transformation de 2 vers 3 par T23, et celle de 1 vers 3 en concaténant les transformations : T13 = T12T23.

Le processus de cartographie introduit des erreurs supplémentaires dans la carte, qui s'ajoutent à l'erreur intrinsèque liée à la détermination de la pose 3D du marqueur dont nous avons parlé précédemment. La concaténation des transformations aggrave ces erreurs, au point que des cas dégénérés peuvent se produire. Nous devons appliquer la BA pour atténuer ces erreurs cumulées, faute de quoi le processus de cartographie du gabarit échouera.

Une option d'optimisation consiste à fixer les transformations obtenues à partir de l'estimation de la pose de la caméra, ce qui s'apparenterait à la formulation BA évoquée précédemment. Nous recherchons un paramètre CamP qui minimise les résidus lorsque les points 3D sont donnés :

Vision par ordinateur
\hat{\mathrm{CamP}} = \arg\min_{\mathrm{CamP}} \sum_i \Vert \mathrm{Proj}(\mathrm{CamP}, P_i^{\mathrm{3D}}) - P_i^{\mathrm{2D}} \Vert^2

Nous notons toutefois que la pose de la caméra est dérivée des points 3D (via une correspondance 2D-3D). Nous pourrions donc optimiser les coordonnées des points 3D eux-mêmes, puis recalculer la pose de la caméra à partir de celles-ci. Nous fixons la pose de la caméra et effectuons une optimisation en fonction des points 3D, en recherchant les points 3D optimaux qui minimisent l'erreur de reprojection 2D :

Vision par ordinateur
\hat{\{P^{\mathrm{3D}}\}} = \arg\min_{\{P^{\mathrm{3D}}\}} \sum_i \Vert \mathrm{Proj}(\mathrm{CamP},P_i^{\mathrm{3D}}) - P_i^{\mathrm{2D}} \Vert^2

Cette astuce nous aide principalement à obtenir un ensemble optimal de points 3D situés sur l'objet, pour lesquels l'erreur par rapport aux points 2D d'origine issus des images est minime. Nous conservons la relation entre les points de la carte 3D et l'identifiant de leurs marqueurs, de sorte qu'au moment de l'exécution, nous puissions établir des correspondances 2D-3D et déterminer la pose de l'objet à l'aide de solvePnP. Sur une nouvelle image entrante, nous localisons les positions 2D des coins des marqueurs et les faisons correspondre aux points 3D de la carte ; ainsi, globalement, nous pouvons déterminer la pose de l'objet à partir de nombreux points 2D-3D combinés, ce qui permet de lisser l'erreur.

On constate clairement qu'après avoir appliqué l'analyse de position (BA) à la carte du gabarit 3D, les décalages 2D sont réduits et l'estimation de la pose de l'objet s'en trouve nettement améliorée.

Conclusions

Les gabarits de Tulip offrent un large éventail d'applications pour les opérations de détection en atelier. Grâce aux nouvelles fonctionnalités 3D des gabarits, de nouveaux cas d'utilisation deviennent possibles, tels que le suivi d'outils complexes visibles sous différents angles, comme les outils portatifs. En utilisant la cartographie de gabarits et l'ajustement de faisceaux, nous sommes en mesure de générer des cartes d'objets complexes avec un minimum d'erreurs et une géométrie optimisée. Les gabarits sont disponibles Tulip dans Tulip , avec l'optimisation intégrée. Utilisez-les pour suivre vos outils, l'équipement de vos postes de travail et même vos matériaux.