Actualización: hemos publicado aquí nuestro código y papel para nuestro nuevo sistema de visión, que obtuvo el primer lugar en la tarea de almacenamiento en el Amazon Robotics Challenge 2017.
Este repositorio contiene código de caja de herramientas para nuestro sistema de visión que obtuvo el tercer y cuarto lugar en el Amazon Picking Challenge 2016. Incluye controladores de sensores RGB-D Realsense (independientes y paquete ROS), paquete ROS de aprendizaje profundo para segmentación de objetos 2D (entrenamiento y pruebas), Paquete ROS para estimación de pose 6D. Esta es la implementación de referencia de modelos y código para nuestro artículo:
Andy Zeng, Kuan-Ting Yu, Shuran Song, Daniel Suo, Ed Walker Jr., Alberto Rodríguez y Jianxiong Xiao
Conferencia Internacional IEEE sobre Robótica y Automatización (ICRA) 2017
La automatización de almacenes ha atraído un gran interés en los últimos años, quizás de manera más visible por el Amazon Picking Challenge (APC). Lograr un sistema de recogida y colocación totalmente autónomo requiere un sistema de visión robusto que reconozca de manera confiable los objetos y sus poses 6D. Sin embargo, en el entorno del almacén no se encuentra una solución debido a los entornos desordenados, la autooclusión, el ruido de los sensores y una gran variedad de objetos. En este artículo, presentamos un sistema de visión que ocupó el tercer y cuarto lugar en las tareas de almacenamiento y recolección, respectivamente, en APC 2016. Nuestro enfoque aprovecha los datos RGB-D de múltiples vistas y el aprendizaje autosupervisado basado en datos para superar las dificultades mencionadas. Más específicamente, primero segmentamos y etiquetamos múltiples vistas de una escena con una red neuronal completamente convolucional y luego ajustamos modelos de objetos 3D previamente escaneados a la segmentación resultante para obtener la pose del objeto 6D. Entrenar una red neuronal profunda para la segmentación normalmente requiere una gran cantidad de datos de entrenamiento con etiquetas manuales. Proponemos un método autosupervisado para generar un gran conjunto de datos etiquetados sin una tediosa segmentación manual que podría ampliarse fácilmente a más categorías de objetos. Demostramos que nuestro sistema puede estimar de manera confiable la pose 6D de los objetos en una variedad de escenarios.
Si encuentra este código útil en su trabajo, considere citar:
@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}
}
Este código se publica bajo la licencia BSD simplificada (consulte el archivo LICENCIA para obtener más detalles).
Toda la información relevante sobre conjuntos de datos y sus descargas se pueden encontrar aquí.
Si tiene alguna pregunta o encuentra algún error, hágamelo saber: Andy Zeng andyz[arroba]princeton[punto]edu
Estima las poses de los objetos 6D en los datos de la escena de muestra (en data/sample
) con resultados de segmentación de objetos precalculados del paquete FCN ROS de aprendizaje profundo:
git clone https://github.com/andyzeng/apc-vision-toolbox.git
(Nota: el tamaño del repositorio de origen es ~300 MB, la clonación puede tardar un poco)cd apc-vision-toolbox/ros-packages/catkin_ws/src/pose_estimation/src/
mdemo
Un paquete Matlab ROS para estimar poses de objetos 6D mediante el ajuste del modelo con ICP en resultados de segmentación de objetos RGB-D. Aquí se pueden encontrar modelos de nubes de puntos 3D de objetos y contenedores.
ros_packages/.../pose_estimation
en el directorio fuente de su espacio de trabajo catkin (por ejemplo, catkin_ws/src
)pose_estimation/src/make.m
para compilar mensajes personalizados de ROS para Matlab.pose_estimation/src
: nvcc -ptx KNNSearch.cu
roscore
pose_estimation/src/startService.m
. En cada llamada (consulte el formato de solicitud de servicio descrito en pose_estimation/srv/EstimateObjectPose.srv
), el servicio:roscore
en la 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 ejecutable C++ independiente para transmitir y capturar datos (cuadros RGB-D y nubes de puntos 3D) en tiempo real utilizando librealsense. Probado en Ubuntu 14.04 y 16.04 con una cámara Intel® RealSense™ F200.
Ver realsense_standalone
cd realsense_standalone
./compile.sh
Después de compilar, ejecute ./stream
para comenzar a transmitir fotogramas RGB-D desde el dispositivo Realsense. Mientras la ventana de transmisión está activa, presione la tecla de la barra espaciadora para capturar y guardar el cuadro RGB-D actual en el disco. La información relevante de la cámara y los fotogramas RGB-D capturados se guardan en una carpeta con nombre aleatorio en data
.
Si su dispositivo Realsense está conectado pero no es detectado, intente usar un puerto USB diferente. Si eso falla, ejecute el siguiente script mientras el dispositivo está desconectado para actualizar sus puertos USB:
sudo ./scripts/resetUSBports.sh
Un paquete C++ ROS para transmitir y capturar datos (cuadros RGB-D y nubes de puntos 3D) en tiempo real utilizando librealsense. Probado en Ubuntu 14.04 y 16.04 con una cámara Intel® RealSense™ F200.
Este paquete ROS viene en dos versiones diferentes. La versión instalada dependerá del software disponible en su sistema:
Ver ros-packages/realsense_camera
ros_packages/.../realsense_camera
en el directorio fuente de su espacio de trabajo catkin (por ejemplo, catkin_ws/src
)realsense_camera/CMakeLists.txt
según sus respectivas dependenciascatkin_make
devel/setup.sh
roscore
rosrun realsense_camera capture
/realsense_camera
devuelve datos del sensor (el formato de datos de respuesta se describe en realsense_camera/srv/StreamSensor.srv
).rosrun realsense_camera capture _display:=True
Un paquete C++ ROS para la segmentación de objetos basada en aprendizaje profundo utilizando FCN (redes totalmente convolucionales) con Marvin, un marco de red neuronal liviano solo para GPU. Este paquete envía datos RGB-D a través de una ConvNet previamente entrenada para recuperar los resultados de la segmentación de objetos. Las redes neuronales se entrenan fuera de línea con Marvin (consulte Entrenamiento FCN con Marvin).
Ver ros-packages/marvin_convnet
Primero es necesario compilar el paquete Realsense ROS.
CUDA 7.5 y cuDNN 5. Es posible que deba registrarse en NVIDIA. A continuación se detallan algunos pasos adicionales para configurar cuDNN 5. NOTA Le recomendamos encarecidamente que instale diferentes versiones de cuDNN en diferentes directorios (por ejemplo, /usr/local/cudnn/vXX
) porque diferentes paquetes de software pueden requerir diferentes versiones.
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
en el directorio fuente de su espacio de trabajo catkin (por ejemplo, catkin_ws/src
).realsense_camera/CMakeLists.txt
según sus respectivas dependenciascatkin_make
devel/setup.sh
ros_packages/.../marvin_convnet/models/competition/
y ejecute el script bash ./download_weights.sh
para descargar nuestros pesos entrenados para la segmentación de objetos (entrenados en nuestro conjunto de datos de entrenamiento)marvin_convnet/src/detect.cu
: hacia la parte superior del archivo, especifique la ruta del archivo .json de arquitectura de red y los pesos .marvin.tmp
en apc-vision-toolbox/data
(por ejemplo, apc-vision-toolbox/data/tmp
). Aquí marvin_convnet leerá/escribirá datos RGB-D. El formato de los datos en tmp
sigue el formato de las escenas en nuestros conjuntos de datos y el formato de los datos guardados por Realsense Standalone.save_images
y detect
. El primero recupera datos RGB-D del paquete Realsense ROS y los escribe en el disco en la carpeta tmp
, mientras que el segundo lee del disco en la carpeta tmp
y envía los datos RGB-D a través del FCN y guarda las imágenes de respuesta en el disco.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
Código y modelos para entrenar la segmentación de objetos utilizando FCN (redes totalmente convolucionales) con Marvin, un marco de red neuronal liviano solo para GPU. Incluye archivos .json de arquitectura de red en convnet-training/models
y una capa de datos de Marvin en convnet-training/apc.hpp
que muestra aleatoriamente imágenes RGB-D (RGB y HHA) de nuestro conjunto de datos de entrenamiento de segmentación.
Ver convnet-training
/usr/local/cudnn/vXX
) porque diferentes paquetes de software pueden requerir diferentes versiones. 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/
y ejecute el script bash ./download_weights.sh
para descargar pesos previamente entrenados de VGG en ImageNet (consulte Marvin para obtener más pesos previamente entrenados)convnet-training/
y ejecute en la terminal ./compile.sh
para compilar Marvin../marvin train models/rgb-fcn/train_shelf_color.json models/weights/vgg16_imagenet_half.marvin
para entrenar un modelo de segmentación en datos RGB-D con objetos en el estante (para objetos en el bolso, use models/rgb-fcn/train_shelf_color.json
). Código utilizado para realizar los experimentos en nuestro artículo; prueba el sistema de visión completo en el conjunto de datos de referencia 'Shelf & Tote'.
Ver evaluation
apc-vision-toolbox/data/benchmark
(por ejemplo, apc-vision-toolbox/data/benchmark/office
, `apc-vision-toolbox/data/benchmark/ almacén', etc.)evaluation/getError.m
, cambie la variable benchmarkPath
para que apunte a la ruta del archivo de su directorio de conjunto de datos de referencia.evaluation/predictions.mat
. Para calcular la precisión de estas predicciones con respecto a las etiquetas reales del conjunto de datos de referencia 'Shelf & Tote', ejecute evaluation/getError.m
Una herramienta en línea basada en WebGL para anotar poses de objetos 6D reales en datos RGB-D. Sigue una implementación de RGB-D Annotator con pequeños cambios. Aquí hay un enlace de descarga a nuestra copia exacta del anotador.