Estimation de pose 6d --- créez votre propre enregistrement de processus de jeu de données LINEMOD (ObjectDatasetTools)

Permettez-moi de parler d'abord de la conclusion. ObjectDatasetTools n'est pas facile à utiliser. Une méthode efficace a été développée. L'effet final est lié comme suit :

méthode efficace

--------------Ligne de séparation ---------------
Après plusieurs jours de souffrance, j'ai trouvé trop difficile de configurer labelfusion, alors j'ai changé pour
ObjectDatasetTools
Essayez-le.
Lors de la reproduction de ce code, je me suis profondément référé aux notes de ce grand frère et à ma propre traduction du readme officiel .
La partie de configuration de la caméra ne sera pas répétée, cet article se concentre uniquement sur les parties de pose, d'étiquette et de génération de masque.

1. Configuration de l'environnement

(1) Utilisez conda pour créer un environnement virtuel de Python2.7.

conda create -n ObjectDatasetTools python=2.7

Ensuite, suivez simplement le tutoriel officiel.

(2) Mettre à niveau le package de pré-installation

sudo apt-get update
sudo apt-get upgrade

(3) Dépendances d'installation

sudo apt-get install build-essential cmake git pkg-config libssl-dev libgl1-mesa-glx

(4) Installer les packages de dépendance Python dans l'environnement virtuel

sudo pip install numpy Cython==0.19 pypng scipy scikit-learn open3d==0.9.0 scikit-image tqdm pykdtree opencv-python==3.3.0.10 opencv-contrib-python==3.3.0.10  trimesh==2.38.24

traitement de l'information

(1) préparation

Imprimez en couleur le pdf avec les marqueurs aruco de taille appropriée (ID 1-13) dans le dossier arucomarkers. Placez des marqueurs autour de l'objet d'intérêt comme indiqué, en vous assurant qu'il n'y a pas de marqueurs avec des identifiants en double.
insérez la description de l'image iciinsérez la description de l'image ici

(2) Enregistrer les données avec la caméra de profondeur

Pour l'ancien modèle (je ne sais pas si l'ancien modèle ici fait référence au lecteur librealsense SDK 1.0, essayez-le vous-même.) Utilisez record.py, utilisez recordf2.py pour librealsense SDK 2.0 :

python record.py LINEMOD/OBJECTNAME

Par exemple : enregistrez une boîte à sucre grâce au code suivant.

python record.py LINEMOD/sugar

Par défaut, le script enregistre pendant 40 secondes après le compte à rebours 5, et la durée d'enregistrement peut être modifiée à la ligne 20 dans record.py. Vous pouvez modifier l'intervalle d'enregistrement ou quitter l'enregistrement en appuyant sur "q". Déplacez ensuite la caméra régulièrement pour obtenir différentes vues de l'objet tout en gardant 2 à 3 marqueurs dans le champ de vision de la caméra à tout moment.

Notez que le projet suppose que toutes les séquences sont enregistrées dans un dossier nommé "LINEMOD", et une erreur sera signalée si d'autres noms de dossier sont utilisés.

Si vous utilisez record.py pour créer une séquence, l'image couleur, la carte de profondeur et les paramètres de la caméra seront automatiquement enregistrés dans le répertoire de la séquence.

Il est à noter que si vous avez déjà une image couleur ou une image profondeur, vous devez mettre l'image couleur (.jpg) dans un dossier nommé "JPEGImages", et mettre l'image profondeur correspondante dans le dossier "profondeur". Remarque : cet algorithme aligne la carte de profondeur sur la carte de couleurs. Nommez les images couleur séquentiellement à partir de 0.jpg, 1.jpg, ..., 600.jpg et les images de profondeur correspondantes : 0.png, ..., 600.png, et créez un fichier nommé "intrinsics. json" file , et saisissez manuellement les paramètres de la caméra sous la forme suivante, par exemple :

{"fx": 614.4744262695312, "fy": 614.4745483398438, "height": 480, "width": 640, "ppy": 233.29214477539062, "ppx": 308.8282470703125, "ID": "620201000292"}

Si vous ne connaissez pas les propriétés intrinsèques de la caméra, vous pouvez saisir une estimation approximative. Les paramètres requis sont fx, fy, cx, xy. Parmi eux, généralement, fx=fy est égal à la largeur de l'image, et cx=cy est le centre de l'image. Par exemple : pour une image avec une résolution de 640*480, fx, fy=640, cx=320, cy=240

(3) Obtenir la transformation du cadre

Calculer la transformation de la trame pour la première trame à un intervalle spécifié (l'intervalle peut être modifié dans config/registrationParameters), enregistrer la transformation (transformation isomorphe 4*4) en tant que tableau numpy (.npy).

python compute_gt_poses.py LINEMOD/duck2

(4) Reconstruction 3D de l'objet cible

python register_scene.py LINEMOD/duck2

Le RegisteredScene.ply d'origine sera enregistré dans le répertoire spécifié (par exemple, LINEMOD/sugar). registerScene.ply est le nuage de points enregistré de la scène, y compris le bureau, les marqueurs et tout autre objet exposé pendant l'analyse, avec un certain degré d'annulation du bruit. Le maillage résultant ressemble à l'image ci-dessous et doit être manipulé manuellement à l'étape 5 :
insérez la description de l'image ici
Alternativement, vous pouvez essayer d'ignorer tout le travail manuel en essayant register_segmented au lieu de register_scene.

python register_segmented.py LINEMOD/duck2

Par défaut, register_segmented essaie de supprimer tous les arrière-plans indésirables et d'effectuer une reconstruction de surface, en convertissant le nuage de points enregistré en un maillage triangulaire. Si MESHING est défini sur false, le script essaiera uniquement de supprimer l'arrière-plan et de compléter automatiquement le fond invisible avec une surface plane (si FILLBOTTOM est défini sur true), vous devrez effectuer l'étape 5.

Cependant, register_segmented peut échouer car il utilise des méthodes spéciales pour segmenter l'arrière-plan, vous devrez donc peut-être ajuster certains paramètres pour le faire fonctionner avec votre objet. Le bouton le plus important à régler est "MAX_RADIUS", qui coupe toutes les lectures de profondeur dont la distance euclidienne au centre du marqueur aruco observé est supérieure à la valeur spécifiée. Cette valeur est actuellement définie sur 0,2 m, si vous avez des objets plus grands, vous devrez peut-être augmenter cette valeur pour ne pas couper une partie de l'objet. Le résultat de l'exécution de register_segmented est le suivant :
insérez la description de l'image ici

(5) Traitement manuel des données de nuages ​​de points

Si vous êtes satisfait du résultat de l'exécution de register_segmented, vous pouvez ignorer l'étape 5.
Le nuage de points enregistré doit être traité comme :

  1. Supprimez les arrière-plans sans intérêt ;
  2. Effectuer une reconstruction de surface et compléter le côté manquant et vice versa ;
  3. Travail sur le réseau reconstruit (peut-être besoin de découper des parties et de refaire le côté manquant);
  4. Assurez-vous que le maillage traité n'a pas de bruit isolé.

Enfin, un maillage triangulaire est généré à la place du nuage de points de registre généré par l'algorithme. L'auteur recommande d'utiliser meshlab pour le traitement.

(6) Générer des fichiers de masque d'image et d'étiquette

Après avoir terminé les étapes 1 à 4 pour l'objet personnalisé, exécutez le code suivant :

python create_label_files.py all

ou (recommandé)

python create_label_files.py LINEMOD/duck2

Cette étape crée un nouveau maillage nommé nomdossier.ply (ex : sugar.ply) avec un AABB centré à l'origine et de mêmes dimensions que l'OBB. Dans le même temps, le masque d'image (enregistré dans le fichier de masque), la transformation homogène 4*4 de la nouvelle grille (enregistrée dans les transformations) et le fichier d'étiquettes sont enregistrés dans le fichier d'étiquettes.
Vérifiez visuellement l'exactitude de la boîte englobante 3D et du masque créés en exécutant :

python inspectMasks.py LINEMOD/duck2

(7) Le fichier final généré est illustré dans la figure ci-dessous

insérez la description de l'image ici

Guess you like

Origin blog.csdn.net/weixin_41837701/article/details/122746974