Atualização: lançamos aqui nosso código e artigo para nosso novo sistema de visão, que ficou em 1º lugar na tarefa de estiva no Amazon Robotics Challenge 2017.
Este repositório contém código de caixa de ferramentas para nosso sistema de visão que ficou em 3º e 4º lugar no Amazon Picking Challenge 2016. Inclui drivers de sensor RGB-D Realsense (independente e pacote ROS), pacote ROS de aprendizado profundo para segmentação de objetos 2D (treinamento e teste), Pacote ROS para estimativa de pose 6D. Esta é a implementação de referência de modelos e código para nosso artigo:
Andy Zeng, Kuan-Ting Yu, Shuran Song, Daniel Suo, Ed Walker Jr., Alberto Rodriguez e Jianxiong Xiao
Conferência Internacional IEEE sobre Robótica e Automação (ICRA) 2017
A automação de armazéns atraiu um interesse significativo nos últimos anos, talvez de forma mais visível pelo Amazon Picking Challenge (APC). Alcançar um sistema de coleta e posicionamento totalmente autônomo requer um sistema de visão robusto que reconheça objetos e suas poses 6D de maneira confiável. No entanto, uma solução escapa ao ambiente de armazém devido a ambientes desordenados, auto-oclusão, ruído de sensor e uma grande variedade de objetos. Neste artigo, apresentamos um sistema de visão que ficou em 3º e 4º lugar nas tarefas de armazenamento e coleta, respectivamente, na APC 2016. Nossa abordagem aproveita dados RGB-D de visualização múltipla e aprendizado auto-supervisionado orientado por dados para superar as dificuldades mencionadas. Mais especificamente, primeiro segmentamos e rotulamos múltiplas visualizações de uma cena com uma rede neural totalmente convolucional e, em seguida, ajustamos modelos de objetos 3D pré-digitalizados à segmentação resultante para obter a pose do objeto 6D. O treinamento de uma rede neural profunda para segmentação normalmente requer uma grande quantidade de dados de treinamento com rótulos manuais. Propomos um método auto-supervisionado para gerar um grande conjunto de dados rotulados sem segmentação manual tediosa que poderia ser facilmente ampliado para mais categorias de objetos. Demonstramos que nosso sistema pode estimar com segurança a pose 6D de objetos em uma variedade de cenários.
Se você achar este código útil em seu trabalho, 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 é lançado sob a Licença BSD Simplificada (consulte o arquivo LICENSE para obter detalhes).
Todas as informações relevantes e downloads do conjunto de dados podem ser encontrados aqui.
Se você tiver alguma dúvida ou encontrar algum bug, por favor me avise: Andy Zeng andyz[at]princeton[dot]edu
Estima poses de objetos 6D nos dados de cena de amostra (em data/sample
) com resultados de segmentação de objetos pré-computados do pacote Deep Learning FCN ROS:
git clone https://github.com/andyzeng/apc-vision-toolbox.git
(Observação: o tamanho do repositório de origem é de aproximadamente 300 MB, a clonagem pode demorar um pouco)cd apc-vision-toolbox/ros-packages/catkin_ws/src/pose_estimation/src/
mdemo
Um pacote Matlab ROS para estimar poses de objetos 6D por meio de ajuste de modelo com ICP em resultados de segmentação de objetos RGB-D. Modelos de nuvem de pontos 3D de objetos e caixas podem ser encontrados aqui.
ros_packages/.../pose_estimation
no diretório de origem do seu espaço de trabalho catkin (por exemplo, catkin_ws/src
)pose_estimation/src/make.m
para compilar mensagens personalizadas ROS para Matlabpose_estimation/src
: nvcc -ptx KNNSearch.cu
roscore
pose_estimation/src/startService.m
. Em cada chamada (consulte o formato de solicitação de serviço descrito em pose_estimation/srv/EstimateObjectPose.srv
), o serviço:roscore
no 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
Um executável C++ autônomo para streaming e captura de dados (quadros RGB-D e nuvens de pontos 3D) em tempo real usando librealsense. Testado no Ubuntu 14.04 e 16.04 com uma câmera Intel® RealSense™ F200.
Veja realsense_standalone
cd realsense_standalone
./compile.sh
Após a compilação, execute ./stream
para iniciar o streaming de quadros RGB-D do dispositivo Realsense. Enquanto a janela de fluxo estiver ativa, pressione a tecla da barra de espaço para capturar e salvar o quadro RGB-D atual no disco. As informações relevantes da câmera e os quadros RGB-D capturados são salvos em uma pasta nomeada aleatoriamente em data
.
Se o seu dispositivo Realsense estiver conectado, mas não for detectado, tente usar uma porta USB diferente. Se isso falhar, execute o seguinte script enquanto o dispositivo estiver desconectado para atualizar suas portas USB:
sudo ./scripts/resetUSBports.sh
Um pacote C++ ROS para streaming e captura de dados (quadros RGB-D e nuvens de pontos 3D) em tempo real usando librealsense. Testado no Ubuntu 14.04 e 16.04 com uma câmera Intel® RealSense™ F200.
Este pacote ROS vem em duas versões diferentes. A versão instalada dependerá do software disponível no seu sistema:
Veja ros-packages/realsense_camera
ros_packages/.../realsense_camera
no diretório de origem do seu espaço de trabalho catkin (por exemplo, catkin_ws/src
)realsense_camera/CMakeLists.txt
de acordo com suas respectivas dependênciascatkin_make
devel/setup.sh
roscore
rosrun realsense_camera capture
/realsense_camera
retorna dados do sensor (formato de dados de resposta descrito em realsense_camera/srv/StreamSensor.srv
)rosrun realsense_camera capture _display:=True
Um pacote C++ ROS para segmentação de objetos baseada em aprendizagem profunda usando FCNs (Fully Convolutional Networks) com Marvin, uma estrutura de rede neural leve apenas com GPU. Este pacote alimenta dados RGB-D por meio de um ConvNet pré-treinado para recuperar resultados de segmentação de objetos. As redes neurais são treinadas offline com Marvin (consulte Treinamento FCN com Marvin).
Veja ros-packages/marvin_convnet
O pacote Realsense ROS precisa ser compilado primeiro.
CUDA 7.5 e cuDNN 5. Pode ser necessário registrar-se na NVIDIA. Abaixo estão algumas etapas adicionais para configurar o cuDNN 5. NOTA É altamente recomendável que você instale versões diferentes do cuDNN em diretórios diferentes (por exemplo, /usr/local/cudnn/vXX
) porque diferentes pacotes de software podem exigir versões diferentes.
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
no diretório de origem do seu espaço de trabalho catkin (por exemplo, catkin_ws/src
)realsense_camera/CMakeLists.txt
de acordo com suas respectivas dependênciascatkin_make
devel/setup.sh
ros_packages/.../marvin_convnet/models/competition/
e execute o script bash ./download_weights.sh
para baixar nossos pesos treinados para segmentação de objetos (treinados em nosso conjunto de dados de treinamento)marvin_convnet/src/detect.cu
: na parte superior do arquivo, especifique o caminho do arquivo para o arquivo .json da arquitetura de rede e os pesos .marvin.tmp
em apc-vision-toolbox/data
(por exemplo, apc-vision-toolbox/data/tmp
). É aqui que marvin_convnet irá ler/gravar dados RGB-D. O formato dos dados em tmp
segue o formato das cenas em nossos conjuntos de dados e o formato dos dados salvos pelo Realsense Standalone.save_images
e detect
. O primeiro recupera dados RGB-D do pacote Realsense ROS e grava no disco na pasta tmp
, enquanto o último lê do disco na pasta tmp
e alimenta os dados RGB-D através do FCN e salva as imagens de resposta no discorosrun 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 e modelos para treinar segmentação de objetos usando FCNs (Fully Convolutional Networks) com Marvin, uma estrutura de rede neural leve somente para GPU. Inclui arquivos .json de arquitetura de rede em convnet-training/models
e uma camada de dados Marvin em convnet-training/apc.hpp
que faz amostras aleatórias de imagens RGB-D (RGB e HHA) de nosso conjunto de dados de treinamento de segmentação.
Veja convnet-training
/usr/local/cudnn/vXX
) porque diferentes pacotes de software podem exigir versões diferentes. 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/
e execute o script bash ./download_weights.sh
para baixar pesos pré-treinados VGG no ImageNet (consulte Marvin para mais pesos pré-treinados)convnet-training/
e execute no terminal ./compile.sh
para compilar o Marvin../marvin train models/rgb-fcn/train_shelf_color.json models/weights/vgg16_imagenet_half.marvin
para treinar um modelo de segmentação em dados RGB-D com objetos na prateleira (para objetos na sacola, use models/rgb-fcn/train_shelf_color.json
). Código utilizado para realizar os experimentos em nosso artigo; testa o sistema de visão completo no conjunto de dados de benchmark 'Shelf & Tote'.
Ver evaluation
apc-vision-toolbox/data/benchmark
(por exemplo, apc-vision-toolbox/data/benchmark/office
, `apc-vision-toolbox/data/benchmark/ armazém', etc.)evaluation/getError.m
, altere a variável benchmarkPath
para apontar para o caminho do arquivo do diretório do conjunto de dados de benchmarkevaluation/predictions.mat
. Para calcular a precisão dessas previsões em relação aos rótulos verdadeiros do conjunto de dados de benchmark 'Shelf & Tote', execute evaluation/getError.m
Uma ferramenta on-line baseada em WebGL para anotar poses reais de objetos 6D em dados RGB-D. Segue uma implementação do RGB-D Annotator com pequenas alterações. Aqui está um link para download de nossa cópia exata do anotador.