Il s'agit de la version de développement du code pour l'article suivant :
Bugra Tekin, Sudipta N. Sinha et Pascal Fua, "Prédiction de la pose d'objets 6D à prise unique en temps réel", CVPR 2018.
Le référentiel original de la base de code de l'article ci-dessus peut être trouvé dans le lien suivant.
Nous proposons une approche mono-coup pour détecter simultanément un objet dans une image RVB et prédire sa pose 6D sans nécessiter plusieurs étapes ni devoir examiner plusieurs hypothèses. L'élément clé de notre méthode est une nouvelle architecture CNN inspirée de la conception du réseau YOLO qui prédit directement les emplacements des images 2D des sommets projetés de la boîte englobante 3D de l'objet. La pose 6D de l'objet est ensuite estimée à l'aide d'un algorithme PnP. Papier, arXiv
Si vous utilisez ce code, veuillez citer ce qui suit
@inproceedings{tekin18,
TITRE = {{Prédiction de pose d'objet 6D à prise unique en temps réel}}, AUTEUR = {Tekin, Bugra et Sinha, Sudipta N. et Fua, Pascal},
TITRE DU LIVRE = {CVPR},
ANNÉE = {2018}
}
SingleShotPose est publié sous la licence MIT (reportez-vous au fichier LICENSE pour plus de détails).
Le code est testé sous Windows avec CUDA v8 et cudNN v5.1. L'implémentation est basée sur PyTorch 0.4.1 et testée sur Python3.6 . Le code nécessite les dépendances suivantes qui peuvent être installées avec conda ou pip : numpy, scipy, PIL, opencv-python. Pour une version antérieure compatible avec PyTorch 0.3.1 et testée sur Python2.7, veuillez consulter le dossier py2
.
Dans le répertoire de code principal, exécutez ce qui suit pour télécharger et extraire (1) l'ensemble de données LINEMOD prétraité, (2) les modèles entraînés pour l'ensemble de données LINEMOD, (3) le modèle entraîné pour l'ensemble de données OCCLUSION, (4) les images d'arrière-plan du VOC2012. ensemble de données respectivement.
wget -O LINEMOD.tar --no-check-certificate "https://onedrive.live.com/download?cid=05750EBEE1537631&resid=5750EBEE1537631%21135&authkey=AJRHFmZbcjXxTmI"
wget -O backup.tar --no-check-certificate "https://onedrive.live.com/download?cid=0C78B7DE6C569D7B&resid=C78B7DE6C569D7B%21191&authkey=AP183o4PlczZR78"
wget -O multi_obj_pose_estimation/backup_multi.tar --no-check-certificate "https://onedrive.live.com/download?cid=05750EBEE1537631&resid=5750EBEE1537631%21136&authkey=AFQv01OSbvhGnoM"
wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/darknet19_448.conv.23 -P cfg/
tar xf LINEMOD.tar
tar xf backup.tar
tar xf multi_obj_pose_estimation/backup_multi.tar -C multi_obj_pose_estimation/
tar xf VOCtrainval_11-May-2012.tar
Alternativement, vous pouvez accéder directement aux liens ci-dessus et télécharger et extraire manuellement les fichiers dans les répertoires correspondants. L'ensemble du processus de téléchargement peut prendre un certain temps (~ 60 minutes). Veuillez également noter que l'accès à OneDrive dans certains pays peut être limité.
Pour entraîner l'exécution du modèle,
python train.py --datacfg [path_to_data_config_file] --modelcfg [path_to_model_config_file] --initweightfile [path_to_initialization_weights] --pretrain_num_epochs [number_of_epochs to pretrain]
par exemple
python train.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --initweightfile cfg/darknet19_448.conv.23 --pretrain_num_epochs 15
si vous souhaitez partir des poids initialisés ImageNet, ou
python train.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --initweightfile backup/duck/init.weights
si vous souhaitez commencer avec un modèle déjà pré-entraîné sur LINEMOD, pour une convergence plus rapide.
[datacfg] contient des informations sur les répartitions entraînement/test, les modèles d'objets 3D et les paramètres de la caméra
[modelcfg] contient des informations sur la structure du réseau
[initweightfile] contient les poids d'initialisation. <
Au début de la formation, vous verrez un résultat comme celui-ci :
layer filters size input output
0 conv 32 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 32
1 max 2 x 2 / 2 416 x 416 x 32 -> 208 x 208 x 32
2 conv 64 3 x 3 / 1 208 x 208 x 32 -> 208 x 208 x 64
3 max 2 x 2 / 2 208 x 208 x 64 -> 104 x 104 x 64
...
30 conv 20 1 x 1 / 1 13 x 13 x1024 -> 13 x 13 x 20
31 detection
Ceci définit la structure du réseau. Lors de la formation, le meilleur modèle de réseau est enregistré dans le fichier « model.weights ». Pour entraîner des réseaux pour d'autres objets, changez simplement le nom de l'objet tout en appelant la fonction de train, par exemple, " python train.py --datacfg cfg/duck.data --modelcfg cfg/yolo-pose.cfg --initweightfile backup/duck/init.weights
". Si vous rencontrez des erreurs de mémoire GPU pendant l'entraînement, vous pouvez essayer de réduire la taille du lot, par exemple à 16 ou 8, pour l'adapter à la mémoire. La version open source du code a subi une forte refactorisation et certains modèles ont en outre dû être recyclés. Les modèles recyclés que nous proposons ne changent pas beaucoup par rapport aux résultats initiaux que nous fournissons (parfois légèrement moins bons et parfois légèrement meilleurs).
Pour tester l'exécution du modèle
python valid.py --datacfg [path_to_data_config_file] --modelcfg [path_to_model_config_file] --weightfile [path_to_trained_model_weights]
par exemple
python valid.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --weightfile backup/ape/model_backup.weights
Vous pouvez également utiliser valid.ipynb pour tester le modèle et visualiser les résultats.
Dans le dossier multi_obj_pose_estimation/
Essai:
python valid_multi.py cfgfile weightfile
par exemple
python valid_multi.py cfg/yolo-pose-multi.cfg backup_multi/model_backup.weights
Entraînement:
python train_multi.py datafile cfgfile weightfile
par exemple,
python train_multi.py cfg/occlusion.data cfg/yolo-pose-multi.cfg backup_multi/init.weights
Nos fichiers d'étiquettes se composent de 21 valeurs de vérité terrain. Nous prédisons 9 points correspondant au centre de gravité et aux coins du modèle objet 3D. De plus, nous prédisons la classe dans chaque cellule. Cela fait 9x2+1 = 19 points. Dans la formation multi-objets, pendant la formation, nous attribuons la boîte d'ancrage dont la taille est la plus similaire à celle de l'objet actuel comme étant responsable de prédire les coordonnées 2D de cet objet. Pour coder la taille des objets, nous avons 2 nombres supplémentaires pour la plage en dimension x et en dimension y. Nous avons donc 9x2+1+2 = 21 nombres.
Respectivement, 21 nombres correspondent aux éléments suivants : 1er chiffre : étiquette de classe, 2ème chiffre : x0 (coordonnée x du centroïde), 3ème chiffre : y0 (coordonnée y du centroïde), 4ème chiffre : x1 (coordonnée x du le premier coin), 5ème chiffre : y1 (coordonnée y du premier coin), ..., 18ème chiffre : x8 (coordonnée x du huitième coin), 19ème chiffre : y8 (coordonnée y du huitième coin) , 20ème numéro : plage x, 21ème numéro : plage y.
Les coordonnées sont normalisées par la largeur et la hauteur de l'image : x / image_width
et y / image_height
. Ceci est utile pour disposer de plages de sortie similaires pour les tâches de régression de coordonnées et de classification d'objets.
Nous entraînons et testons nos modèles sur l'ensemble de données LINEMOD en utilisant les mêmes répartitions entraînement/test avec la méthode BB8 pour valider notre approche. Si vous souhaitez entraîner un modèle sur votre propre ensemble de données, vous pouvez créer la même structure de dossiers avec l'ensemble de données LINEMOD fourni et ajuster les chemins dans cfg/[OBJECT].data, [DATASET]/[OBJECT]/train.txt et Fichiers [DATASET]/[OBJECT]/test.txt. Le dossier de chaque objet doit contenir les éléments suivants :
(1) un dossier contenant des fichiers image,
(2) un dossier contenant des fichiers d'étiquettes (veuillez vous référer à ce lien pour une explication détaillée sur la façon de créer des étiquettes. Vous pouvez également trouver la boîte à outils ObjectDatasetTools tierce utile pour créer des étiquettes de vérité terrain pour l'estimation de la pose d'objets 6D),
(3) un fichier texte contenant les noms de fichiers des images de formation ( train.txt
),
(4) un fichier texte contenant les noms de fichiers des images de test ( test.txt
),
(5) un fichier .ply contenant le modèle objet 3D (L'unité du modèle objet est donnée en mètres),
(6) éventuellement, un dossier contenant des masques de segmentation (Si vous souhaitez changer le fond de vos images d'entraînement pour être plus robustes aux divers fonds, cela serait indispensable pour une meilleure capacité de généralisation),
Assurez-vous également d'ajuster les valeurs suivantes dans les fichiers de configuration des données et du modèle en fonction de vos besoins :
diam
" dans le fichier de configuration des données avec le diamètre du modèle objet disponible.yolo-pose.cfg
) et de certains paramètres d'augmentation des données (gigue, teinte, saturation, paramètres d'exposition dans dataset.py
) il faudra peut-être également l'ajuster pour une meilleure convergence sur votre ensemble de données.yolo-pose-multi.cfg
). Assurez-vous également d'utiliser le nombre correct de classes et de le spécifier dans yolo-pose-multi.cfg
.fx
, fy
, u0
, v0
, width
, height
) dans les fichiers de configuration des données avec ceux spécifiques à votre ensemble de données. Lors de la création d'un ensemble de données de formation, l'échantillonnage d'un grand nombre de points de vue/distances et la modélisation d'une grande variabilité des paramètres d'éclairage/occlusion/arrière-plan seraient importants pour augmenter la capacité de généralisation de l'approche sur votre ensemble de données. Si vous souhaitez ajuster certains paramètres de modèle et de perte (par exemple le facteur de pondération pour différents termes de perte) pour vos propres besoins, vous pouvez le faire dans le fichier de configuration du modèle ( yolo-pose.cfg
).
Le code est écrit par Bugra Tekin et est construit sur l'implémentation YOLOv2 de l'utilisateur github @marvis
Pour toute question ou rapport de bug, veuillez contacter Bugra Tekin