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

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

YOLOXをHumbleで動作確認しました。

先々週のオフ会で真・闇のエンジニアとなったiskw氏に次のようなことを言われました。

ar-ray.hatenablog.com

「YOLOX-ROSがFoxyにしか対応していないと〇〇(詳細を覚えていない)が言うんですよぉ」と

正直なところHumbleですでに動作確認は終わっていますし、オープンソースなのでHumbleに対応したければ自分で改造すればいいので、私の頭の中は?でいっぱいになりました。(iskw氏も?だったみたいです)

しかしながら、闇のエンジニアには逆らえないわけなので、いい機会なのでYOLOXの動作環境を整えることにしました。


YOLOX-ROSとは?

私が管理しているリポジトリの中で最もスター数の多いリポジトリです。

github.com

YOLOXはアンカーフリーなリアルタイム物体検出アルゴリズムです。

軽量で商用利用可能なライセンスで、最初のリリースから2年経過した現在でも根強い人気を持っています。


元々、YOLOXの評価に使ったrclpyを使った単なるラッパーでしたが、つよつよコントリビュータたちによってrclcppのサポートやDockerの拡張サポートなどがくっつき、いつの間にそこそこ大きくなりました。

OpenVINO・TensorRT・onnxruntime(cuDNN)・TFLiteの4つの最適化に対応しており、Ubuntuが動けばとりあえず何かしらでは速くROS 2と統合できます。


HumbleへのDokerfileのアップデート

今回は、長らく放置されて(して)きたDockerfileとパラメータ周りを調整することにします。


パラメータ周り

パラメータ周りはgenerate_parameter_libraryを使用してYAMLに載せ替えました。

YOLOX-ROS/yolox_ros_cpp/yolox_param/src/yolox_parameters.yaml at humble · Ar-Ray-code/YOLOX-ROS · GitHub

generate_paramet_libraryは、YAMLでパラメータを設定可能な便利ツールです。

rosjp#51で解説しました。

ar-ray.hatenablog.com

このツールでパラメータをコードから消して可読性とメンテ性がちょっと上がりました。


Dockerfile

特に語ることもないですが、URLと使用した環境を示します。

ネイティブに構築する時に参考にしてください。


依存環境の異なる4種類あるので結構大変です。

  • OpenVINO
  • TensorRT
  • TensorRT-Jetson
  • onnxruntime-cuDNN


OpenVINO

openvino/ubuntu22_dev:2023.0.1 を使いました。

そこそこ簡単でした。

YOLOX-ROS/yolox_ros_cpp/docker/openvino/dockerfile at humble · Ar-Ray-code/YOLOX-ROS · GitHub

CPUで動作確認しました。GPU・MYRIADはわかりません…(別途ドライバが必要?)


TensorRT

nvidia/cuda:12.1.1-devel-ubuntu22.04 を使用しました。

こちらもそんなに難しくないですが、CUDA12なので古すぎるGPUだと動かないかもです。

YOLOX-ROS/yolox_ros_cpp/docker/tensorrt/dockerfile at humble · Ar-Ray-code/YOLOX-ROS · GitHub


onnxruntime-cuDNN

これはちょっと大変でした。

onnxruntimeだと色々なハードウェアに対応していると思いきや、libcudnnとリンクされていたみたいで、CPUオンリーだとコンパイルはできるけど実行はできないみたいな感じでした。

CPUオンリーならOpenVINOの方が都合がよいと思うので、このままonnxruntimeはcudnn向けにコンパイルすることにします。

ただし、onnxruntimeはいくつか罠がありました。

  1. onnxruntimeはCUDA12をサポートしていない。
  2. マルチスレッドのコンパイルに対応していない

2の方が致命的で、Intelの24コアを使えず5GHz1コアを3時間くらい回す羽目に貼りました…

YOLOX-ROS/yolox_ros_cpp/docker/onnxruntime/dockerfile at humble · Ar-Ray-code/YOLOX-ROS · GitHub

onnxruntimeを直ビルドする際は注意してください。


TensorRT-Jetson

ここでは、Jetson Orinを使用します。

dustynv/ros:humble-ros-base-deepstream-l4t-r35.1.0 を使用しました。

Jetpackは5がUbuntu20.04で、Jetpack6以降(2023/7現在未リリース)を使用する必要があるので本来はHumbleに対応していませんが、直ビルドしたやつがDockerfileになっています。

素晴らしい。


しかしながら依存関係をdpkgで解決できないので、全て依存関係をgit cloneします。

RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 42D5A192B819C5DA && \
    apt-get update && \
    apt-get install -y \
    doxygen \
    libfmt-dev \
    librange-v3-dev \
    python3-pip \
    python3-jinja2 \
    python3-typeguard
RUN mkdir -p /dependencies/src && \
    cd /dependencies/src && \
    git clone https://github.com/PickNikRobotics/RSL.git && \
    git clone https://github.com/PickNikRobotics/cpp_polyfills.git && \
    git clone https://github.com/ros-perception/vision_opencv.git  -b humble && \
    git clone https://github.com/PickNikRobotics/generate_parameter_library.git && \
    cd /dependencies/ && \
    . /opt/ros/humble/install/setup.sh && \
    colcon build


あとは、COPY /usr/include/aarch64-linux-gnu/ /usr/include/aarch64-linux-gnu/でincludeをコピーしました。

ただし、ライブラリをコピーすることを忘れて setup.bashcp -r /usr/include/aarch64-linux-gnu/* ./tensorrt_dir/ しました。将来的に替えなければ…

YOLOX-ROS/yolox_ros_cpp/docker/jetson/setup.bash at humble · Ar-Ray-code/YOLOX-ROS · GitHub

ちなみに、Dockerfileで公式のv4l2-cameraでティア某カメラをストリーミングすることができました。

ティア某カメラとは、自動運転用のHDRカメラです。

太陽光でも眩まないすごいカメラです。

ar-ray.hatenablog.com


Release

v0.3.3というタグを打ちました。

とりあえずHumbleにサポートしたよ〜というアピールですね。

Release v0.3.3 Support Humble · Ar-Ray-code/YOLOX-ROS · GitHub

Ironへのサポートは予定していませんが、YOLOXに大きな変更があれば考えます。

また、このバージョンからrclpyはサポートしていません…(PyTorchがもはや追えない)


今後も一応動作確認はできるように色々弄るので、何かあればissueで教えてください。