#はじめに
JetsonではDockerがつかえますが、NvidiaはがNGCから取得させてくれるイメージの中には、OpenCVが動くものも、Darknetが動くものもありません。
Jetson Xavier NX/JetsonNANOでDNN_BACKEND_CUDAが使えるOpenCV4.3をDockerでビルドで作成したイメージを使ってDarknetが動くイメージを作成しました。
#やったこと
- OpenCV4.3をインストールしたイメージをベースにdarknetがビルド済みなイメージを作成しました。
#手順
git clone https://github.com/sowd0726/Jetson_docker.git
cd Jetson_docker
cd darknet
sudo mkdarknet.sh
でdarknet:100とタグ付けされたイメージができあがります。
sudo docker run -it --rm --net=host --runtime nvidia -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix darknet:100
で実行が可能です。
カメラが使いたい場合には以下
sudo docker run -it --rm --net=host --runtime nvidia --device /dev/video0:/dev/video0:mwr -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix darknet:100
#Dockerfile内でのDarknetのビルド手順
darknetのビルドは
git clone https://github.com/AlexeyAB/darknet
して
cd darknet
して
Makefileの以下を編修してビルドするだけです。
これをDockerfile内で自動化してあります。
# 以下でCUDA,OPENCV,GPU,LIBSO,CUDNN_HALFを1に変更
GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
AVX=0
OPENMP=0
LIBSO=1
...
# 6.1のアーキテクチャはずして
ARCH= -gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=[sm_50,compute_50] \
-gencode arch=compute_52,code=[sm_52,compute_52] \
# -gencode arch=compute_61,code=[sm_61,compute_61]
...
# Xavierの7.2をイネーブル
ARCH= -gencode arch=compute_72,code=[sm_72,compute_72]
JetsonNANOの場合は、上記のCUDNN_HALFを変更しないようにしてアーキテクチャを53に
# 以下でCUDA,OPENCV,GPUを1に変更
GPU=1
CUDNN=1
CUDNN_HALF=0
OPENCV=1
AVX=0
OPENMP=0
LIBSO=1
...
# 6.1のアーキテクチャはずして
ARCH= -gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=[sm_50,compute_50] \
-gencode arch=compute_52,code=[sm_52,compute_52] \
# -gencode arch=compute_61,code=[sm_61,compute_61]
...
# NANO(Makefile上はTX1のとこにあります)の5.3をイネーブル
ARCH= -gencode arch=compute_53,code=[sm_53,compute_53]
で、これをmakeするDockerfileを作成しました。ベースとしてJetson Xavier NX/JetsonNANOでDNN_BACKEND_CUDAが使えるOpenCV4.3をDockerでビルドで作成したイメージをつかってるので、そっちを先につくるか、OpenCVがはいってるイメージをベースに指定する必要があります。
FROM opencv430:103
RUN cd /root &&\
git clone https://github.com/AlexeyAB/darknet
RUN cd /root/darknet &&\
sed -i 's/GPU=0/GPU=1/' Makefile && \
sed -i 's/CUDNN=0/CUDNN=1/' Makefile && \
sed -i 's/CUDNN_HALF=0/CUDNN_HALF=1/' Makefile && \
sed -i 's/OPENCV=0/OPENCV=1/' Makefile && \
sed -i 's/LIBSO=0/LIBSO=1/' Makefile && \
sed -i 's/-gencode arch=compute_61,code=\[sm_61,compute_61\]/#-gencode arch=compute_61,code=\[sm_61,compute_61\]/' Makefile && \
sed -i 's/# ARCH= -gencode arch=compute_72,code=\[sm_72,compute_72\]/ARCH= -gencode arch=compute_72,code=\[sm_72,compute_72\]/' Makefile
RUN cd /root/darknet && \
make -j4 && \
echo "** Bye :)"
CMD ["/bin/bash"]
FROM opencv430:103
RUN cd /root &&\
git clone https://github.com/AlexeyAB/darknet
RUN cd /root/darknet &&\
sed -i 's/GPU=0/GPU=1/' Makefile && \
sed -i 's/CUDNN=0/CUDNN=1/' Makefile && \
# sed -i 's/CUDNN_HALF=0/CUDNN_HALF=1/' Makefile && \
sed -i 's/OPENCV=0/OPENCV=1/' Makefile && \
sed -i 's/LIBSO=0/LIBSO=1/' Makefile && \
sed -i 's/-gencode arch=compute_61,code=\[sm_61,compute_61\]/#-gencode arch=compute_61,code=\[sm_61,compute_61\]/' Makefile && \
sed -i 's/# ARCH= -gencode arch=compute_53,code=\[sm_53,compute_53\]/ARCH= -gencode arch=compute_53,code=\[sm_53,compute_53\]/' Makefile
RUN cd /root/darknet && \
make -j4 && \
echo "** Bye :)"
CMD ["/bin/bash"]
git cloneした場合には
cd Jetson_docker
cd darknet
sudo mkdarknet.sh
で勝手にボードを判定してイメージを作成します
蛇足。。Darknetビルド時のエラー
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found
./src/image_opencv.cpp:16:10: fatal error: opencv2/core/version.hpp: No such file or directory
#include <opencv2/core/version.hpp>
^~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
っていわれてはまりました。pkgconfig用のファイルを作成する方法がわからずcmakeのコードを探しまわるはめになりました。
OPENCVをビルドするときに、cmakeのオプションに以下をつけないと発生します。
-D OPENCV_GENERATE_PKGCONFIG=ON