ros_caffe: ROSとCaffeの連携

ROSでCaffeを使うためにros_caffeパッケージをインストールしたときのメモ。このパッケージはカメラから画像トピックをcaffeで識別して、トピック/caffe_retをパブリッシュする。ros_caffeパッケージのcaffeバージョンは古いので、caffe-0.15をソースからビルドして使用する。ros_caffeのウェブサイトとは方法が違う。

ウェブサイト

ハードウェア環境

  • CPU: Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz (6 core)
  • GPU: NVIDIA GTX 1080Ti
  • Memory: 32GB

ソフトウェア環境

  • Ubuntu16.04
  • ROS Kinetic
  • CUDA8.0

ソースの取得

  • $ cd ~/catkin_ws/src
  • $ git clone --recursive https://github.com/tzutalin/ros_caffe.git
  • $ cd ~/catkin_ws/src/ros_caffe

 

Caffeのビルド

  • すでにインストール済みの場合は次へ行く。ただし、ここではNVIDIAがフォークしたバージョン0.15を使うものとする
  • インストールしていない場合は、ここを参照。

 

Caffeの学習

  • 画像データセットCIFAR-10をダウンロードする
    • $ cd ~/src/caffe/data/cifar10
    • $ ./get_cifar10.sh
  • caffeで学習できるようデータ形式の変換
    • $ cd  ~/src/caffe/examples/cifar10
    • $ ./create_cifar10.sh
  • 学習する
    • $ ./train_quick.sh

 

ROSパッケージのビルド

  • ~/catkin_src/src/ros_caffe/CMakeLists.txtの該当部分を次のように変更し、~/srcにインストールされているcaffeを使うようにする。
      • set(CAFFE_INCLUDEDIR ~/src/caffe/include ~/src/caffe/build/include)
      • set(CAFFE_LINK_LIBRARAY ~/src/caffe/build/lib)
      • arget_link_libraries(ros_caffe_test ${catkin_LIBRARIES} ${OpenCV_LIBRARIES} caffe-nv glog)

    CMakeLists.txtは次のとおり。

     
    cmake_minimum_required(VERSION 2.8.3)
    project(ros_caffe)
    
    find_package(catkin REQUIRED COMPONENTS
      roscpp roslib std_msgs sensor_msgs image_transport cv_bridge
    )
    
    set(CAFFE_INCLUDEDIR ~/src/caffe/include ~/src/caffe/build/include)
    set(CAFFE_LINK_LIBRARAY ~/src/caffe/build/lib)
    
    find_package(Boost REQUIRED COMPONENTS system)
    find_package(OpenCV REQUIRED)
    
    catkin_package(
    #  INCLUDE_DIRS include                                                                                          
    #  LIBRARIES ros_caffe                                                                                           
    #  CATKIN_DEPENDS roscpp                                                                                         
    #  DEPENDS system_lib                                                                                            
    )
    
    include_directories(
      ${catkin_INCLUDE_DIRS}
      ${OpenCV_INCLUDE_DIRS}
    )
    include_directories(${CAFFE_INCLUDEDIR})
    
    link_directories(${CAFFE_LINK_LIBRARAY})
    add_executable(ros_caffe_test src/ros_caffe_test.cpp)
    target_link_libraries(ros_caffe_test ${catkin_LIBRARIES} ${OpenCV_LIBRARIES} caffe-nv glog)
    
  • ~/catkin_ws/src/ros_caffe/src/ros_caffe_test.cpp
    • 15行目を使用するカメラのトピック名に変更する。デフォルトはcamera/rgb/image_raw。
      • const std::string RECEIVE_IMG_TOPIC_NAME = “/usb_cam/image_raw”;
    • model_path, weights_path, mean_file, label_file, image_pathを次のように変更する。
      • model_path = “/home/user_name/src/caffe/examples/cifar10/cifar10_quick.prototxt”;
      • weights_path = “/home/user_name/src/caffe/examples/cifar10/cifar10_quick_iter_4000.caffemodel.h5”;
      • mean_file = “/home/user_name/src/caffe/examples/cifar10/mean.binaryproto”;
      • label_file = “/home/user_name/src/caffe/data/cifar10/batches.meta.txt”;
      • image_path = “/home/user_name/src/caffe/examples/images/cat.jpg”;
  • $ cd catkin_ws
  • $ catkin_make

実行

  •  端末を開いて次のコマンドを実行
    • $ roscore
  • もう一つ端末を開いて次のコマンドを実行
    • $ rosrun ros_caffe  ros_caffe_test
  • 実行結果


Test default image under /data/cat.jpg
0.2988 - "dog"
0.2924 - "cat"
0.2087 - "deer"
0.1653 - "bird"
0.0326 - "horse"

Webカメラを使った実行

  • $ sudo apt install ros-kinetic-usb-cam
  • 端末を4つ開いて以下のコマンドを実行
      • $ roscore
      • $ rosrun usb_cam usb_cam_node
      • $ rosrun image_view image_view image:=/usb_cam/image_raw
      • rosrun ros_caffe ros_caffe_test

     

ROSトピック

  • 識別結果
    • $ rostopic echo /caffe_ret
  • CIFAR-10はairplane, automobile, bird, cat, deer, dog, frog, horse, ship, truckの10クラスの識別用データ・セット。試しに、swiftの画像をカメラで取得したところ約96%の確率でautomobileと識別できた。

以上

コメント

タイトルとURLをコピーしました