Jetson Xavier NX で YOLOv4 による物体検出


はじめに

この記事では,Jetson Xavier NXを使ってdarknetをインストールし,YOLOv4を動作させる手続きをまとめます.

Jetson Xavier NXのセットアップについては別記事にまとめており,本記事はセットアップが完了したところから作業を始めています.

YOLOv4とは

darknetのインストール

本家にしたがってインストールします.

リポジトリをクローン.

$ git clone https://github.com/pjreddie/darknet.git
$ cd darknet

Makefileの編集

darknetディレクトリ直下にMakefileがあるので,これを編集します.

  1. GPU, CUDNN, CUDNN_HALF, OPENCV, LIBSOの設定を1に変更
  2. ARCHの設定のうち,-gencode arch=compute_61,code=[sm_61,compute_61]をコメントアウト
  3. ARCH= -gencode arch=compute_72,code=[sm_72,compute_72]をコメントイン

詳しく書くと以下の通りです.

GPU=0
CUDNN=0
CUDNN_HALF=0
OPENCV=0
AVX=0
OPENMP=0
LIBSO=0

GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
AVX=0
OPENMP=0
LIBSO=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]

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]

のように書き換えます.また,

# Jetson XAVIER
# ARCH= -gencode arch=compute_72,code=[sm_72,compute_72]

# Jetson XAVIER
ARCH= -gencode arch=compute_72,code=[sm_72,compute_72]

のように書き換えます.

コンパイル

makeでコンパイルするのですが,そのままだとCUDAへのパスが通っておらず,途中でエラーを吐いて失敗します.

CUDAその他のパスを通します.

$ export DARKNET_HOME=/home/_name_/darknet/
$ export CUDA_HOME=/usr/local/
$ export PATH=${DARKNET_HOME}:${CUDA_HOME}bin:${PATH}
$ export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
$ source ~/.bashrc

パスが通っているか確認

$ nvcc -V

以下のように出力されれば成功です.

output
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_21:14:42_PDT_2019
Cuda compilation tools, release 10.2, V10.2.89

コンパイル

$ make

画像に対する物体検出

YOLOv4の重みファイルをダウンロード

$ wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights

最初に,darknetのリポジトリにデフォルトで含まれている画像に対して物体検出コードを実行します.

$ ./darknet detect cfg/yolov4.cfg yolov4.weights data/dog.jpg

処理が完了すると,~/darknet配下にpredictions.jpgが生成されます.

動画に対する物体検出

適当な動画(5~10秒程度を推奨)をダウンロードし,~/darknet直下に置きます.(以下ではvideo.mp4という名前にしています)

動画を対象として物体検出を実行し,検出後の動画をout.mp4として保存します.

$ ./darknet detector demo ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4.weights video.mp4 -i 0 -thresh 0.25 -dont_show -out_filename out.mp4

FPSは11.0~12.0程度でした.Jetson nanoでは1~2FPS程度でしたので,かなり速くなりましたね.

最後に

Webカメラを用いたリアルタイム物体検出を試みたのですが,動作するものの1~2FPSになってしまい,満足な速度が得られていません.

また,Raspberry Pi Camera Module V2から画像を取り込んで物体検出も試みましたが,yolov4にうまく画像が渡せない問題を抱えています.

方法をご存じの方がおられましたら,ご教示ください.

免責

本記事の内容は個人的な主張であり,著者の属する企業・集団の公式見解ではありません.

掲載しているコードは著者のメモ程度で,動作を保証するものではありません.