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

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

darknet_rosをDockerfileで環境構築する。(Docker・ROS2)

最近、ディープラーニングに関連してウマ娘に関するネタ記事やツイートがとても伸びており、味を占めてしまっております。しかしながら、私はディープラーニングが専門ではないのであまりそのネタに引っ張られすぎないようにしたいところです。

今日は、例のツイートが伸びなければ投稿していたDockerfileでdarknet_rosの環境構築したという話を書こうと思います。あれ、やっぱりディープラーニン…

https://user-images.githubusercontent.com/67567093/117596596-a2c8db00-b17e-11eb-90f9-146212e64567.png

↑半年以上も前に撮ったdarknet-rosのデモ。

きっかけ

darknet_rosのissue欄のバグ報告のほとんどが環境構築系だったことです。

darknet_rosとは、とても高速な物体検出アルゴリズム「darknet」をROSやROS2に移植したプロジェクトで、GitHub上で1400近いスターを獲得している比較的大きなプロジェクトです。

github.com

多くのコントリビューターが定期的にメンテナンスを行っており、現在のROSのバージョンにも対応できています。その中でバージョン混在によるエラーを報告してくる人が結構います。

Issues · leggedrobotics/darknet_ros · GitHub

darknet自体は5年前から存在していたのですが、CUDAやOpenCVのバージョンアップ、ROS1からROS2への変革に伴って個人のコンピュータで環境が混在し手順通りに環境構築を始めたはずがエラーになってしまうケースが後を絶たないということです。

また、YOLOv4への対応を望む声もいくつか上がっており、いくつかそれに関するプルリクを提示されているのですが、なかなかマージされていないというのが現状です。(頼むからもうちょっとメンテをしてくれ)

…というわけなので、nvidia-dockerを使ってdarknet-rosの環境構築をしてみました。もしかしたら私の環境がなにかおかしい!ということがあるかも知れないので、だれか環境構築にチャレンジしてくれると嬉しいです。

簡単なインストール

既にDockerfileにアップしているので、簡単にpullできます。

pullできなかったり、何か問題があればGitHubの方からDockerfileをビルドしてみてください。darknet_ros_fp16のissueでの報告も歓迎です。

環境

  • sudoなしで動くnvidia-dockerの環境

  • Dockerに接続可能なWebカメラ(ここではUbuntu20.04を使用しています。)

  • xhost(wslgであればデフォルトで使えるはずです)

ダウンロード

docker pull ray255ar/darknet-ros-fp16

ビルドする場合は、以下のコマンドで実行可能です。

git clone https://github.com/Ar-Ray-code/darknet_ros_fp16
cd darknet_ros_fp16
docker build . -t darknet-ros-fp16`

実行

Webカメラ/dev/video0に接続されているものとします。

docker run --rm -it \
    --device /dev/video0:/dev/video0:mwr \
    -e DISPLAY=$DISPLAY --runtime nvidia \
    -v /tmp/.X11-unix:/tmp/.X11-unix ray255ar/darknet-ros-fp16 \
        /bin/bash yolov4-tiny-docker.bash

多分出ないとは思いますが、仮にコンパイルエラーが出てしまう場合はyolov4-tiny-docker.bashの文字列を削除して実行して、ワークスペースにアクセスし、原因を教えていただければ幸いです。

ちょっと引っかかった箇所とその解決法

YOLOX-ROSのDockerfileを参考にDocker環境を整えました。

しかし、Dockerfileの作成中に結構引っかかってしまう部分がありました…

1:.. libcuda.so.1: cannot open shared object file が出現した。

あるあるといえばあるあるなのですが、Dockerfile上で起こるとは思いませんでした。

シンボリックリンクを適切な場所に貼るようにして対処しました。

github.com

具体的には次の2行を追記します。

RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/libcuda.so.1
RUN LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs/:$LD_LIBRARY_PATH

2:キーボード選択でDockerfileのビルドが止まる

Dockerfileの構築中にキーボードレイアウト選択のCUIが立ち上がり、フリーズしてしまいました。ビルド中はキーボード入力を受け付けないので、これで止まってしまうとやり直しになってしまいます。特に、キャッシュを残さない場合は辛い。

以下の記事を参考にENV DEBIAN_FRONTEND=noninteractiveをDockerfileの先頭付近に追記しました。

qiita.com

qiita.com

3:タイムゾーン設定でDockerfileのビルドが止まる

お前もかって感じでした。確かに、キーボードが設定されていないのであれば時刻も設定されていないですよね…

以下の記事を参考にapt実行前に2行追記しました。

northshorequantum.com

ENV TZ=Asia/Tokyo
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

Dockerfileが一度出来上がれば環境をリセットしてもなんとかなるし、Dockerfile自体が環境構築メモみたいな感じになるので、できればGitHubリポジトリのREADMEみたいな感じでDockerfileも作られてもいいのかなーと思います。少なくとも私はできる限り作ろうと思います。