Darknetをビルド済みなXavierNX/JetsonNANOのDockerイメージを作成

#はじめに
JetsonではDockerがつかえますが、Nvidiaはが[NGC](https://ngc.nvidia.com/catalog/all)から取得させてくれるイメージの中には、OpenCVが動くものも、Darknetが動くものもありません。
[Jetson Xavier NX/JetsonNANOでDNN_BACKEND_CUDAが使えるOpenCV4.3をDockerでビルド](https://qiita.com/sowd0726/items/57a4e867d358283bdf20)で作成したイメージを使って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でビルド](https://qiita.com/sowd0726/items/57a4e867d358283bdf20)で作成したイメージをつかってるので、そっちを先につくるか、OpenCVがはいってるイメージをベースに指定する必要があります。


```Dockerfile:XavierNX
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"]
```

```Dockerfile:JetsonNANO
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