Mise à jour : nous avons publié ici notre code et notre document pour notre nouveau système de vision, qui a remporté la première place dans la tâche de rangement lors de l'Amazon Robotics Challenge 2017.
Ce référentiel contient le code de la boîte à outils pour notre système de vision qui a remporté les 3e et 4e places lors de l'Amazon Picking Challenge 2016. Comprend les pilotes de capteur RGB-D Realsense (package autonome et ROS), le package ROS d'apprentissage en profondeur pour la segmentation d'objets 2D (formation et tests), Package ROS pour l’estimation de pose 6D. Il s'agit de l'implémentation de référence des modèles et du code pour notre article :
Andy Zeng, Kuan-Ting Yu, Shuran Song, Daniel Suo, Ed Walker Jr., Alberto Rodriguez et Jianxiong Xiao
Conférence internationale IEEE sur la robotique et l'automatisation (ICRA) 2017
L'automatisation des entrepôts a suscité un intérêt considérable ces dernières années, peut-être de manière plus visible grâce à l'Amazon Picking Challenge (APC). La réalisation d'un système de saisie et de placement entièrement autonome nécessite un système de vision robuste qui reconnaît de manière fiable les objets et leurs poses 6D. Cependant, une solution échappe au cadre de l'entrepôt en raison des environnements encombrés, de l'auto-occlusion, du bruit des capteurs et d'une grande variété d'objets. Dans cet article, nous présentons un système de vision qui a pris respectivement la 3ème et la 4ème place dans les tâches d'arrimage et de prélèvement, respectivement à l'APC 2016. Notre approche exploite les données RVB-D multi-vues et l'apprentissage auto-supervisé basé sur les données pour surmonter les difficultés évoquées ci-dessus. Plus précisément, nous segmentons et étiquetons d'abord plusieurs vues d'une scène avec un réseau neuronal entièrement convolutif, puis ajustons des modèles d'objets 3D pré-numérisés à la segmentation résultante pour obtenir la pose de l'objet 6D. La formation d'un réseau neuronal profond pour la segmentation nécessite généralement une grande quantité de données de formation avec des étiquettes manuelles. Nous proposons une méthode auto-supervisée pour générer un grand ensemble de données étiquetées sans segmentation manuelle fastidieuse qui pourrait être facilement étendue à davantage de catégories d'objets. Nous démontrons que notre système peut estimer de manière fiable la pose 6D des objets dans divers scénarios.
Si vous trouvez ce code utile dans votre travail, pensez à citer :
@inproceedings{zeng2016multi,
title={Multi-view Self-supervised Deep Learning for 6D Pose Estimation in the Amazon Picking Challenge},
author={Zeng, Andy and Yu, Kuan-Ting and Song, Shuran and Suo, Daniel and Walker Jr, Ed and Rodriguez, Alberto and Xiao, Jianxiong},
booktitle={ICRA},
year={2016}
}
Ce code est publié sous la licence BSD simplifiée (reportez-vous au fichier LICENSE pour plus de détails).
Toutes les informations pertinentes sur les ensembles de données et les téléchargements peuvent être trouvés ici.
Si vous avez des questions ou trouvez des bugs, n'hésitez pas à me le faire savoir : Andy Zeng andyz[at]princeton[dot]edu
Estimation des poses d'objets 6D sur les données de scène d'échantillon (dans data/sample
) avec les résultats de segmentation d'objets précalculés à partir du package Deep Learning FCN ROS :
git clone https://github.com/andyzeng/apc-vision-toolbox.git
(Remarque : la taille du référentiel source est d'environ 300 Mo, le clonage peut prendre un certain temps)cd apc-vision-toolbox/ros-packages/catkin_ws/src/pose_estimation/src/
mdemo
Un package Matlab ROS pour estimer les poses d'objets 6D par ajustement de modèle avec ICP sur les résultats de segmentation d'objets RVB-D. Des modèles de nuages de points 3D d’objets et de bacs peuvent être trouvés ici.
ros_packages/.../pose_estimation
dans le répertoire source de votre espace de travail catkin (par exemple catkin_ws/src
)pose_estimation/src/make.m
pour compiler les messages personnalisés ROS pour Matlabpose_estimation/src
: nvcc -ptx KNNSearch.cu
roscore
pose_estimation/src/startService.m
. A chaque appel (voir format de demande de service décrit dans pose_estimation/srv/EstimateObjectPose.srv
), le service :roscore
dans le terminalmkdir /path/to/your/data/tmp
rosrun marvin_convnet detect _read_directory:="/path/to/your/data/tmp"
pose_estimation/src
demo.m
startService.m
demo.m
Un exécutable C++ autonome pour diffuser et capturer des données (images RVB-D et nuages de points 3D) en temps réel à l'aide de librealsense. Testé sur Ubuntu 14.04 et 16.04 avec une caméra Intel® RealSense™ F200.
Voir realsense_standalone
cd realsense_standalone
./compile.sh
Après la compilation, exécutez ./stream
pour commencer à diffuser des images RVB-D à partir du périphérique Realsense. Pendant que la fenêtre de flux est active, appuyez sur la touche de la barre d'espace pour capturer et enregistrer l'image RVB-D actuelle sur le disque. Les informations pertinentes sur la caméra et les images RVB-D capturées sont enregistrées dans un dossier nommé de manière aléatoire sous data
.
Si votre appareil Realsense est branché mais n'est pas détecté, essayez d'utiliser un autre port USB. Si cela échoue, exécutez le script suivant pendant que l'appareil est débranché pour actualiser vos ports USB :
sudo ./scripts/resetUSBports.sh
Un package C++ ROS pour diffuser et capturer des données (images RVB-D et nuages de points 3D) en temps réel à l'aide de librealsense. Testé sur Ubuntu 14.04 et 16.04 avec une caméra Intel® RealSense™ F200.
Ces packages ROS sont disponibles en deux versions différentes. La version installée dépendra des logiciels disponibles sur votre système :
Voir ros-packages/realsense_camera
ros_packages/.../realsense_camera
dans le répertoire source de votre espace de travail catkin (par exemple catkin_ws/src
)realsense_camera/CMakeLists.txt
en fonction de vos dépendances respectivescatkin_make
devel/setup.sh
roscore
rosrun realsense_camera capture
/realsense_camera
renvoie les données du capteur (format de données de réponse décrit dans realsense_camera/srv/StreamSensor.srv
)rosrun realsense_camera capture _display:=True
Un package C++ ROS pour la segmentation d'objets basée sur l'apprentissage profond à l'aide de FCN (Fully Convolutional Networks) avec Marvin, un cadre de réseau neuronal léger uniquement GPU. Ce package transmet les données RVB-D via un ConvNet pré-entraîné pour récupérer les résultats de segmentation d'objets. Les réseaux de neurones sont entraînés hors ligne avec Marvin (voir Formation FCN avec Marvin).
Voir ros-packages/marvin_convnet
Le package Realsense ROS doit d’abord être compilé.
CUDA 7.5 et cuDNN 5. Vous devrez peut-être vous inscrire auprès de NVIDIA. Vous trouverez ci-dessous quelques étapes supplémentaires pour configurer cuDNN 5. REMARQUE Nous vous recommandons fortement d'installer différentes versions de cuDNN dans différents répertoires (par exemple, /usr/local/cudnn/vXX
) car différents progiciels peuvent nécessiter différentes versions.
LIB_DIR=lib $( [[ $( uname ) == " Linux " ]] && echo 64 )
CUDNN_LIB_DIR=/usr/local/cudnn/v5/ $LIB_DIR
echo LD_LIBRARY_PATH= $LD_LIBRARY_PATH : $CUDNN_LIB_DIR >> ~ /.profile && ~ /.profile
tar zxvf cudnn * .tgz
sudo cp cuda/ $LIB_DIR / * $CUDNN_LIB_DIR /
sudo cp cuda/include/ * /usr/local/cudnn/v5/include/
ros_packages/.../marvin_convnet
dans le répertoire source de votre espace de travail catkin (par exemple catkin_ws/src
)realsense_camera/CMakeLists.txt
en fonction de vos dépendances respectivescatkin_make
devel/setup.sh
ros_packages/.../marvin_convnet/models/competition/
et exécutez le script bash ./download_weights.sh
pour télécharger nos poids entraînés pour la segmentation d'objets (entraînés sur notre ensemble de données d'entraînement)marvin_convnet/src/detect.cu
: Vers le haut du fichier, spécifiez le chemin d'accès au fichier .json de l'architecture réseau et aux poids .marvin.tmp
dans apc-vision-toolbox/data
(par exemple apc-vision-toolbox/data/tmp
). C'est là que marvin_convnet lira/écrira les données RVB-D. Le format des données en tmp
suit le format des scènes de nos ensembles de données et le format des données enregistrées par Realsense Standalone.save_images
et detect
. Le premier récupère les données RVB-D du package Realsense ROS et écrit sur le disque dans le dossier tmp
, tandis que le second lit à partir du disque dans le dossier tmp
et transmet les données RVB-D via le FCN et enregistre les images de réponse sur le disque.rosrun marvin_convnet save_images _write_directory:= " /path/to/your/data/tmp " _camera_service_name:= " /realsense_camera "
rosrun marvin_convnet detect _read_directory:= " /path/to/your/data/tmp " _service_name:= " /marvin_convnet "
tmp
) : rosservice call /marvin_convnet [ " elmers_washable_no_run_school_glue " , " expo_dry_erase_board_eraser " ] 0 0
Code et modèles pour la formation à la segmentation d'objets à l'aide de FCN (Fully Convolutional Networks) avec Marvin, un cadre de réseau neuronal léger uniquement GPU. Comprend des fichiers .json d'architecture réseau dans convnet-training/models
et une couche de données Marvin dans convnet-training/apc.hpp
qui échantillonne de manière aléatoire des images RVB-D (RVB et HHA) à partir de notre ensemble de données de formation à la segmentation.
Voir convnet-training
/usr/local/cudnn/vXX
) car différents progiciels peuvent nécessiter différentes versions. LIB_DIR=lib $( [[ $( uname ) == " Linux " ]] && echo 64 )
CUDNN_LIB_DIR=/usr/local/cudnn/v5/ $LIB_DIR
echo LD_LIBRARY_PATH= $LD_LIBRARY_PATH : $CUDNN_LIB_DIR >> ~ /.profile && ~ /.profile
tar zxvf cudnn * .tgz
sudo cp cuda/ $LIB_DIR / * $CUDNN_LIB_DIR /
sudo cp cuda/include/ * /usr/local/cudnn/v5/include/
convnet-training/
models/train_shelf_color.json
models/weights/
et exécutez le script bash ./download_weights.sh
pour télécharger les poids pré-entraînés VGG sur ImageNet (voir Marvin pour plus de poids pré-entraînés)convnet-training/
et exécutez dans le terminal ./compile.sh
pour compiler Marvin../marvin train models/rgb-fcn/train_shelf_color.json models/weights/vgg16_imagenet_half.marvin
pour entraîner un modèle de segmentation sur les données RVB-D avec des objets dans l'étagère (pour les objets dans le fourre-tout, utilisez models/rgb-fcn/train_shelf_color.json
). Code utilisé pour réaliser les expériences dans notre article ; teste le système de vision complète sur l'ensemble de données de référence « Shelf & Tote ».
Voir evaluation
apc-vision-toolbox/data/benchmark
(par exemple apc-vision-toolbox/data/benchmark/office
, `apc-vision-toolbox/data/benchmark/ entrepôt', etc.)evaluation/getError.m
, modifiez la variable benchmarkPath
pour qu'elle pointe vers le chemin d'accès du répertoire de votre ensemble de données de référence.evaluation/predictions.mat
. Pour calculer l'exactitude de ces prédictions par rapport aux étiquettes de vérité terrain de l'ensemble de données de référence « Shelf & Tote », exécutez evaluation/getError.m
Un outil en ligne basé sur WebGL pour annoter les poses d'objets 6D de vérité terrain sur des données RVB-D. Suit une implémentation de RGB-D Annotator avec de petits changements. Voici un lien de téléchargement vers notre copie exacte de l'annotateur.