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
- OpenCV3.4.0
- OpenCV ContribとCudaのモジュールが必要。
- インストールはここを参照。
- Caffe-0.15
ソースの取得
- $
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”;
- 15行目を使用するカメラのトピック名に変更する。デフォルトはcamera/rgb/image_raw。
- $ 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と識別できた。
以上
コメント