Introduction

Gabarits 3D dans Tulip Vision

Tulip utilise des gabarits de marquage 3D parce que c'est le moyen le plus précis de suivre des objets avec une grande fidélité dans un environnement très bruyant tel que l'atelier. Les gabarits de marquage sont faciles à coller sur les objets. On peut les placer sur une poubelle, un chariot élévateur, un semi-remorque ou un minuscule outil d'horloger - ils fonctionnent à n'importe quelle échelle, tant que la caméra est capable de les repérer. Un classique cas d'utilisation pour les gabarits est, naturellement, le suivi des objets de gabarit dans lesquels la pièce à usiner s'insère, mais avec les 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 grand nombre de marqueurs 3D regroupés. Les marqueurs 3D indiquent un emplacement sur l'objet 3D qui est fixé dans le "cadre" (un cadre est constitué des trois axes utilisés pour définir la position et l'orientation, les axes X, Y et Z) de l'objet, en supposant que l'objet est un corps rigide. Chaque fois que nous voyons le marqueur, nous savons qu'il est fixé au même point de l'objet. Le groupe de marqueurs de gabarit - définit un objet complet. Les gabarits peuvent définir des formes complexes en 3D, avec certains marqueurs visibles et d'autres cachés. Les marqueurs visibles nous aident à trouver l'emplacement et l'orientation de l'objet. Lorsque les marqueurs cachés apparaissent, ils compensent les autres marqueurs qui sont maintenant cachés.

Optimisation de l'ajustement de l'offre groupée

Lors de la définition d'un gabarit à partir de marqueurs, nous capturons plusieurs vues de l'objet marqué sous différents angles par rapport à la caméra. Chaque image capturée par la caméra fournit une autre "vue" de l'objet avec ses marqueurs. Dans chaque image, nous calculons la position des marqueurs sur l'objet et leurs relations (transformations). Après avoir capturé suffisamment de vues, nous les combinons pour obtenir un modèle 3D holistique de l'objet, c'est-à-dire le processus d'"enregistrement". Cependant, pour plusieurs 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 fait, plus nous prenons de vues de l'objet, plus l'erreur cumulée dans l'enregistrement augmente, jusqu'à ce que l'enregistrement final soit inutile. C'est là qu'entre en jeu le "Bundle Adjustment".

L'ajustement des faisceaux (BA) est un processus d'optimisation numérique qui permet de lutter contre l'erreur cumulée due à l'enregistrement de plusieurs vues de caméras pour reconstruire une géométrie. Dans le BA traditionnel, la plupart des paramètres de la reconstruction sont optimisés, y compris la modélisation optique de la caméra. Mais avant d'expliquer le processus de BA, nous devons définir les paramètres en jeu qui nécessitent une optimisation. Nous vous recommandons vivement de vous référer au merveilleux livre du professeur Richard Szeliski "Vision par ordinateur: Algorithms and Applications", Springer press, 2011 (chapitre 7 pp320).

Pose de l'objet avec des marqueurs 3D

Lorsqu'une caméra regarde un marqueur, qui est un objet plat, il est possible de calculer l'orientation du marqueur par rapport à l'origine de la caméra. Considérez le diagramme suivant :

Regroupement de gabarits 3D en Vision par ordinateur

Le marqueur est visible dans la vue de la caméra et projeté sur le plan de l'image - une construction conceptuelle qui aide à formuler la traduction entre les coordonnées des pixels en 3D et en 2D. Cependant, lorsque nous prenons une photo de la scène avec le marqueur, nous ne connaissons pas les paramètres du point 3D, nous pouvons seulement détecter l'endroit où ces points 3D ont été projetés sur l'image 2D. Cette projection peut être capturée par l'équation suivante :

Ensembles 3D Jigs en Vision par ordinateur

Les coordonnées X, Y et Z sont les coordonnées 3D du centre du marqueur, par exemple, tandis que x et y sont les positions en pixels 2D des coins sur l'image. Le marque l'ambiguïté des paramètres, un élément d'information manquant, causé par le fait qu'un point 3D dans le monde peut apparaître n'importe où sur le rayon entre le centre de la caméra et le point 3D réel (voir les points orange décolorés dans le diagramme). En d'autres termes, des objets de n'importe quelle é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 de jouet).

Néanmoins, il existe 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 dans notre équation, et qu'en fait, pour obtenir les points de pixels, il faut diviser par la dernière entrée 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éorganiser l'équation ci-dessus en un ensemble d'équations linéaires (homogènes) permettant de retrouver R et t. En utilisant les marqueurs 3D, on peut obtenir au moins 4 paires de points correspondants 2D-3D pour chaque marqueur. Les points 2D sont obtenus en regardant l'image et en trouvant les coins. Les points 3D sont donnés par la disposition du marqueur, qui est également sous notre contrôle (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. Par exemple, voici comment trouver 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 3D Jigs en Vision par ordinateur
$$P_{2D}=\mathrm{Proj}([R|t], P_{3D})$$

En d'autres termes, nous obtenons la position du pixel 2D (P2D) en projetant le point 3D P3D ainsi que la rotation R et la translation t entre la caméra et l'objet. Le principal problème de ce régime de projection est qu'il est basé sur des calculs effectués sur les points 2D en coordonnées pixel, qui ne sont pas très précis et qui sont également quantifiés sur la grille de pixels. Si nous reprojetons les points 3D (en les projetant en 2D sur l'image) après avoir trouvé la pose de l'objet [R|t], nous trouvons souvent les positions 2D décalées par rapport à leurs positions dans l'image. L'image suivante montre les décalages, qui sont généralement plus contrasté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 trouver les paramètres de position de la caméra de manière à ce que tous ces décalages 2D soient aussi faibles que possible. Pour formuler cela, nous souhaitons résoudre le problème de minimisation suivant, qui recherche les [R|t] optimaux qui minimisent les résidus :

Équation
\hat{[R|t]} = \mathop{\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 le résidu. En général, nous appelons ce problème un problème de moindres carrés puisque nous élevons le résidu au carré. Ce cas particulier est un problème de moindres carrés non linéaires, puisque l'opérateur Proj(.) est non linéaire. Avec cette formulation en place, nous pouvons également introduire dans le problème d'optimisation, par exemple, les paramètres intrinsèques de la caméra et trouver des valeurs optimales pour ceux-ci également :

Équation
\hat{[R|t]},\hat{\{P^\mathrm{3D}\}},\hat{K} = \mathop{\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 correspondants et de sortie 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 pour résoudre les problèmes de moindres carrés non linéaires, tels que Ceres Solver, diverses méthodes MATLAB, SciPy de Python, et bien d'autres. Par exemple, avec SciPy et OpenCV, on peut résoudre le problème comme suit :

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

Résolution de la BA pour les gabarits 3D

Jusqu'à présent, nous avons discuté de l'analyse BA en termes généraux, mais nos objectifs d'optimisation pour les gabarits 3D sont un peu différents. Lorsque nous construisons nos gabarits 3D, nous construisons essentiellement une carte 3D. La cartographie (et la localisation) est un problème bien connu, par exemple en navigation autonome et en odométrie, lorsqu'un véhicule doit s'orienter dans le monde sur la base d'observations provenant de caméras. Notre technique de cartographie des gabarits est similaire aux algorithmes SLAM (Simultaneous Localization and Mapping), en ce sens qu'elle construit une carte du monde observé de manière incrémentielle et qu'elle effectue occasionnellement des BA sur cette carte afin de réduire l'erreur résiduelle 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 au fur et à mesure que la cartographie progresse, nous avons 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 ultérieure, nous ne voyons plus le marqueur 1 mais le marqueur 3 est révélé, tandis que le marqueur 2 reste visible. On note la transformation de 2 en 3 avec T23, et de 1 en 3 en concaténant les transformations : T13 = T12T23.

Le processus de cartographie introduit d'autres erreurs dans la carte, auxquelles s'ajoute l'erreur intrinsèque de récupération de la position 3D du marqueur dont nous avons parlé plus haut. La concaténation des transformations aggrave les erreurs, au point que des cas dégénérés peuvent se produire. Nous devons appliquer le BA pour atténuer les erreurs composées, sinon le processus de cartographie des gabarits échouera.

Une option d'optimisation consiste à fixer les transformations que nous obtenons à partir de l'estimation de la pose de la caméra, ce qui ressemblerait à la formulation de BA présentée précédemment. Nous recherchons une CamP qui minimise les résidus lorsque les points 3D sont donnés :

Vision par ordinateur équation
\hat{\mathrm{CamP}} = \mathop{\argmin}_{\mathrm{CamP}} \sum_i \Vert \mathrm{Proj}(\mathrm{CamP},P_i^{\mathrm{3D}}) - P_i^{\mathrm{2D}} \Vert^2

Cependant, nous notons que la pose de la caméra est dérivée des points 3D (par correspondance 2D-3D). Nous pourrions donc optimiser les coordonnées des points 3D eux-mêmes et recalculer la position de la caméra à partir de ces points. Nous fixons la position de la caméra et la minimisons sur la base des points 3D, en recherchant les points 3D optimaux qui minimisent le résidu de reprojection 2D :

Vision par ordinateur équation
\hat{\{P^{\mathrm{3D}}\}} = \mathop{\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 qui se trouvent sur l'objet et dont les erreurs par rapport aux points 2D d'origine des images sont minimes. Nous maintenons la relation entre les points de la carte 3D et l'ID de leurs marqueurs, de sorte qu'en cours d'exécution, nous pouvons trouver des correspondances 2D-3D et récupérer la pose de l'objet, avec 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, de sorte que nous pouvons trouver la pose de l'objet à partir de nombreux points 2D-3D, en calculant la moyenne de l'erreur.

Nous pouvons clairement voir qu'après avoir effectué le BA sur la carte de gabarit 3D, les décalages 2D sont réduits et l'estimation de la pose de l'objet sera bien meilleure.

Conclusions

Les gabarits dans Tulip Vision offrent un large éventail de cas d'utilisation pour la détection des opérations dans l'atelier. Avec les nouvelles capacités de gabarit 3D, de nouveaux cas d'utilisation peuvent être mis en œuvre, tels que le suivi d'outils complexes visibles sous différents angles, comme les outils portatifs. En utilisant la cartographie des gabarits et l'ajustement des faisceaux, nous sommes en mesure de produire des cartes d'objets complexes avec un minimum d'erreurs et une géométrie optimisée. Les gabarits sont immédiatement utilisables dans Tulip , avec l'optimisation intégrée. Utilisez-les pour suivre vos outils, l'équipement de votre poste de travail et même les matériaux.