先々週のオフ会で真・闇のエンジニアとなったiskw氏に次のようなことを言われました。
「YOLOX-ROSがFoxyにしか対応していないと〇〇(詳細を覚えていない)が言うんですよぉ」と
正直なところHumbleですでに動作確認は終わっていますし、オープンソースなのでHumbleに対応したければ自分で改造すればいいので、私の頭の中は?でいっぱいになりました。(iskw氏も?だったみたいです)
しかしながら、闇のエンジニアには逆らえないわけなので、いい機会なのでYOLOXの動作環境を整えることにしました。
YOLOX-ROSとは?
私が管理しているリポジトリの中で最もスター数の多いリポジトリです。
YOLOXはアンカーフリーなリアルタイム物体検出アルゴリズムです。
軽量で商用利用可能なライセンスで、最初のリリースから2年経過した現在でも根強い人気を持っています。
元々、YOLOXの評価に使ったrclpyを使った単なるラッパーでしたが、つよつよコントリビュータたちによってrclcppのサポートやDockerの拡張サポートなどがくっつき、いつの間にそこそこ大きくなりました。
OpenVINO・TensorRT・onnxruntime(cuDNN)・TFLiteの4つの最適化に対応しており、Ubuntuが動けばとりあえず何かしらでは速くROS 2と統合できます。
HumbleへのDokerfileのアップデート
今回は、長らく放置されて(して)きたDockerfileとパラメータ周りを調整することにします。
パラメータ周り
パラメータ周りはgenerate_parameter_libraryを使用してYAMLに載せ替えました。
generate_paramet_libraryは、YAMLでパラメータを設定可能な便利ツールです。
rosjp#51で解説しました。
このツールでパラメータをコードから消して可読性とメンテ性がちょっと上がりました。
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はいくつか罠がありました。
- onnxruntimeはCUDA12をサポートしていない。
- マルチスレッドのコンパイルに対応していない
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.bash
でcp -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カメラです。
太陽光でも眩まないすごいカメラです。
Release
v0.3.3というタグを打ちました。
とりあえずHumbleにサポートしたよ〜というアピールですね。
Release v0.3.3 Support Humble · Ar-Ray-code/YOLOX-ROS · GitHub
Ironへのサポートは予定していませんが、YOLOXに大きな変更があれば考えます。
また、このバージョンからrclpyはサポートしていません…(PyTorchがもはや追えない)
今後も一応動作確認はできるように色々弄るので、何かあればissueで教えてください。