今回はJetsonNanoにdarknet_rosを入れて物体検出する方法について紹介していきます。
こちらを行うとJetsonNano上でYOLOv3などの物体検出を行うことができるようになります。
今回はROSを利用してこちらを実行したいので「darknet_ros」を導入していきます。
前提 ①
ROSのインストールまで完了していること。ROSのインストール方法については以下の記事を参照のこと。
JetsonNanoにROSを入れてJetbotを動かす方法
前提 ②
今回OpenCVのバージョンは3.3.1を利用しています。他のバージョンではdarknet_rosが動かない可能性があるのでエラーの内容によってはOpenCVのバージョンを変更する必要が出てくると思います。私の場合、OpenCVの4.4.0-devを入れているときはdarknet_rosが動きませんでした。
OpenCVのバージョンを確認したい場合は以下のコマンドを実行します。
1 2 3 |
python import cv2 cv2.__version__ |
darknet_rosのインストールと設定
以下の順番でdarknet_rosのインストールと設定を確認していきます。
SSHキーを設定する
以下でdarknet_rosをクローンするためにGitHubにSSHキーを登録する必要があります。こちらのページを参考にして登録を実施します。
上記でSSHキーを取得したらGitHubにサインインして追加しておく。
こちらにSSHキーを追加したら完了です。
darknet_rosのインストール
まずはJetsonNanoのターミナルで以下のコマンドを順番に実行してdarknet_rosをクローンしておきます。ワークフォルダ名は任意なので、私はROSをインストールしたときの「workspace/catkin_ws」をそのまま利用しています。
1 2 3 |
cd workspace/catkin_ws/src git clone --recursive git@github.com:leggedrobotics/darknet_ros.git cd ../ |
性能を最大にするためにリリースモードでビルドを実施します。
1 |
catkin_make -DCMAKE_BUILD_TYPE=Release |
ROSのパスが通っていることを確認
ROSをインストールした際にパスの設定はしているはずですが、こちらも再度確認しておきます。以下のコマンドでパスを表示します。
1 |
echo $ROS_PACKAGE_PATH |
~/workspace/catkin_ws/src のパスが表示されていれば今回はOKです。
パスが存在しない場合は以下を実行してROSのパスを追加しておきます。パスは自分の環境に合わせておきます。
1 |
sudo sh -c 'echo "source ~/workspace/catkin_ws/devel/setup.bash" >> ~/.bashrc' |
毎回手動でワークスペースのパスを追加したい場合は~/workspace/catkin_ws/まで移動してこちらを実行します。
1 |
source devel/setup.bash |
重みをダウンロードする(任意)
クローンした段階ですでにいくつかの重みはダウンロードされていますが、他にも欲しいものがあれば以下を実行して所定の場所に重みをダウンロードしておきます。
1 2 3 4 5 6 7 |
cd workspace/catkin_ws/src/darknet_ros/darknet_ros/yolo_network_config/weights/ wget http://pjreddie.com/media/files/yolov2.weights wget http://pjreddie.com/media/files/yolov2-tiny.weights wget http://pjreddie.com/media/files/yolov2-voc.weights wget http://pjreddie.com/media/files/yolov2-tiny-voc.weights wget http://pjreddie.com/media/files/yolov3-tiny.weights wget http://pjreddie.com/media/files/yolov3.weights |
独自の物体検出を行う場合(任意)
自分独自の物体検出を行いたい場合は作成した重みとcfgファイルを以下のフォルダにそれぞれ配置します。
1 2 |
workspace/catkin_ws/src/darknet_ros/darknet_ros/yolo_network_config/weights/ workspace/catkin_ws/src/darknet_ros/darknet_ros/yolo_network_config/cfg/ |
さらに物体検出したいものの名前をConfigファイルに定義して以下のフォルダに配置します。
1 |
workspace/catkin_ws/src/darknet_ros/darknet_ros/config/ |
launchファイルには上記のファイルパスを指定して保存します。
1 |
rosparam command="load" ns="darknet_ros" file="$(find darknet_ros)/config/your_config_file.yaml" |
USBカメラを利用するとき
今回はUSBカメラを利用しますので以下のファイルの中身を編集します。適当なエディタでファイルを開きます。
1 |
nano workspace/catkin_ws/src/darknet_ros/darknet_ros/config/ros.yaml |
カメラの定義の箇所を以下のように編集して保存します。
1 2 3 |
camera_reading: topic: /usb_cam/image_raw queue_size: 1 |
USBカメラの接続確認
JetsonNanoに接続しているUSBカメラが正しく認識されていることを確認しておきます。
1 |
ls /dev/video* |
今回はデバイスの0番(video0)にUSBカメラを設定しておきたいため、CSIカメラなどを接続してる場合は外しておきます。
カメラのフォーマットによってはエラーが発生する場合があります。カメラのフォーマットを調べたいときはデバイス番号を指定して以下のコマンドを実行します。デバイス0番を調べたいときは「-d 0」のようにします。
1 |
v4l2-ctl -d 0 --list-formats-ext |
カメラのフォーマットが異なるというエラーが発生した場合は以下のようにしてフォーマットを変更します。
1 |
rosparam set usb_cam/pixel_format yuyv |
darknet_rosの実行
以下の手順でdarknet_rosを実行しJetsonNanoとWEBカメラによるリアルタイム物体検出を行っていきます。
USBカメラの起動
以下のいずれかを実行してUSBカメラを起動します。launchファイルで実行するときはこちら。
1 |
roslaunch usb_cam usb_cam-test.launch |
rosrunで実行したいときはこちら。
1 |
rosrun usb_cam usb_cam_node |
darknet_rosの起動
次にdarknet_rosを起動します。以下はYOLOv3を実行する場合です。
1 |
roslaunch darknet_ros yolo_v3.launch |
しばらくするとウィンドウが二つ表示されて片方に物体検出された映像が表示されると思います。
私の場合、ざっと1FPSいかないぐらいの処理速度なのでかなり重たく感じると思います。終了するときはCtrl+Cで終了させます。
次にデフォルト設定のまま実行してみます。デフォルトの設定では「yolov2-tiny」が設定されていますので5FPS~6FPS程度になり少しましになりました。
1 |
roslaunch darknet_ros darknet_ros.launch |
以上、今回はJetsonNanoにdarknet_rosを入れて物体検出する方法について紹介させていただきました。