えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

Jupyter+ROSでデータ分析+組み込み??ColabのFaster R-CNNを移植してみた!

 ROSでPytorchやTensorFlowを使いたいと思っているのに、全く文法も環境も理解できない…でも動かしたい…

 そう考えたバカの行き着いた先、それは…

_人人人人人人人人人人人人人人人人_

> Google Colaboratoryのコピペ  <

 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y  ̄

 動作するGoogle Colaboratoryのノートブックがあれば、Colaboratoryと同じ環境を揃えれてマウント作業を変更すれば、Jupyter-Notebookでも動きます。

 ということで、今回はJupyter-NotebookをROS1化させます。環境はGoogle Colabと揃えています。今回は下に示すFaster R-CNNのColab実装を使わせて頂いています。

github.com

 実装後のコードはGithubに上げています。

github.com

 Colab上での環境は、Python3.6.9で、Pytorch1.7.0+CUDA10.1ですが、Pytorch1.7.1+CUDA10.2でも動きました。ファイルの読み書きやグラフプロットなどの削除などいろいろと書き換えを行っていますが、大きな変更点(追記箇所)は主に2箇所です。

 まず、最初らへん。インポートとPublishを行う場合はその初期化を忘れずに行いましょう。

import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge

pub = rospy.Publisher("output_image",Image,queue_size=1)

 次に、ループ部分とROSの初期化部分。bridge.imgmsg_to_cv2(msg,"bgr8")bgr8rgb8にしたほうがいいような気がします。あとは普通のrospyとほぼ同じです。

def process_image(msg):
    global pub
    try:
        brdige = CvBridge()
        img_bgr = bridge.imgmsg_to_cv2(msg,"bgr8")
        ##処理の内容##
        output_img = bridge.cv2_to_imgmsg(img,"rgb8")
        pub.publish(output_img)
    except Exception as err:
        print(err)

def start_node():
    rospy.init_node('node name')
    rospy.Subscriber("camera/color/image_raw",Image,process_image)
    rospy.spin()
    
#### main -----------------------------------------------------------
try:
    start_node()
except rospy.ROSInterruptException as err:
    print(err)

 実行は、ROSの環境変数をロードした状態で、$ jupyter-notebookと入力してipynbファイルを開けばいいだけ。ご存知のかたの方が多いとは思いますが、python3でノードを立ち上げてもrosrunをしたことと同じ動作をします。実行権限もつける必要はありませんし、catkin_wsなどのワークスペースに置く必要もありません。すべてのセルを実行することで実行します。

f:id:Ray_ar:20210129022728g:plain
動作の様子

 自分の環境(Ryzen7 2700x + RTX2080Ti)ではたまにカクつくときがあり、(darknet-rosと比べれば)そんなに速く動きませんでした。もしかしたらもっと効率的に動かす方法があるのかもしれません…

 しかしながら、Jupyter-notebookでPythonプログラムを書いて、それをROSに簡単に移植できれば、データ分析+組み込みが楽になるかもしれませんね!ColabやJupyter-notebookで開発したほうが楽なところもあるので、個人的には期待大です。ROS2やNoeticでも実装してみたい。

 環境構築はGithubにも載せていますが、詳しくは次回以降の記事で紹介したいと思います。