【物体検出】vol.12 :YOLOv4をNVIDIA Jetson AGX Xavierで動かす

2020/04/23 Alexey氏のGithubにYOLOv4が登場しました。
記事"YOLOv4 -- Superior, Faster & More Accurate Object Detection"によると、従来のYOLOv3と比較して、速度はほぼ同等(数パーセントは低下している模様)で、mAPで15%ほど向上しているようです。
※同じデータセットを使って学習したオリジナルモデルにおいて、どの程度の差が出るのかについては、別途記事にします。
今回は、毎度おなじみのNVIDIA Jetson Xavierに最新のYOLOv4を入れて、PreTrainedModelを使った動作検証をします。
最初に結論:
XavierでOpenCV4.2+YOLOv4が動作します。セットアップには少しだけ工夫が必要です。YOLOv3で動作させていたpythonのプログラムもそのまま動作しました。
OpenCVを最新にする
OpenCV4.2をXavierに導入する手順は、以前の記事"【物体検出】vol.10 :YOLOv3をNVIDIA Jetson AGX Xavierで動かす~その2(OpenCV4対応)"をご参考にしてください。
cmakeも最新版にしておいた方が良いです。ここでは既に導入済として話を進めます。
Darknetのセットアップ
darknetの最新版を入手する
$ git clone https://github.com/AlexeyAB/darknet.git darknet0604
MakeファイルをXavierに合わせて修正する
ここがとても重要です。さもなくば、エラーでMakeが止まります。(もちろん、その先のビルドもできません)
上でダウロードしたディレクトリ(~/darknet0604)にCmakeList.txtがありますので、テキストエディタで開き、編集します。
修正内容は、 -mavx -mavx2 -msse3 -msse4.1 -msse4.2 -msse4aなどのXavierが対応しないオプションの指定を外すことだけです。
162行目辺り
# set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -ffp-contract=fast -mavx -mavx2 -msse3 -msse4.1 -msse4.2 -msse4a")
# set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -ffp-contract=fast -mavx -mavx2 -msse3 -msse4.1 -msse4.2 -msse4a")
ビルド
cmakeを使ってbuilldをします。
今回から、build.shというシェルスクリプトが準備されていて、これを実行するだけでインストールまで完了します。
$ cd darknet0604
$ ./build.sh
動作確認
darknetコマンドを実行します。
$ ./darknet --version
CUDA-version: 10000 (10000), cuDNN: 7.6.3, CUDNN_HALF=1, GPU count: 1
CUDNN_HALF=1
OpenCV version: 4.2.0
OpenCVが4.2でCUDAもcuDNNもちゃんと認識されていて、かつCUDNN_HALFも使えるようになっています。
USBカメラを使って物体検出を実行
...の前に、pre-trained-modelをダウンロードしておかなければなりません。 yolov4.weightsというのが目当ての品です。
~/darknet0604にダウンロードします。
対応するcfgは~/darknet0604/cfg/に既に入っていますので、不要です。
./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -c 0

すごく大事な事
YOLOv3として動作する?
以前のモデルが動作するかどうかも気になるところです。
当然ながら、過去のモノとはちゃんと互換が取れているようです。
./darknet detector demo cfg/coco.data cfg/yolov3-spp.cfg yolov3-spp.weights -c 0

ちゃんと動作しました。
既存のプログラムは動作する?
YOLOv3のコマンド実行ではなく、Pythonの中から動かせるように、darknet.pyを使っている場合は、既存のプログラムがちゃんと動作するのかが気になります。
ご安心あれ!ちゃんと動きました。
但し、若干の修正が必要だったのは、libdarknet.soを読み込んでいるところを、libdark.soに書き換えただけでした。
細かなところでどんな違いがあるのかまでは確認できていませんが、一応それっぽく動作しています。
YOLOv3からYOLOv4への移行は、とてもスムーズに行きました。cmakeやOpenCV4.2などの依存ライブラリ類をちゃんと動作させることが出来れば、.build.shで楽々インストールです。
パフォーマンスの最適化だとか、独自モデルだとか、Windows版だとか、モデルそのものの変化、新しいpre-trained-modelだとか、気になることはたくさんありますが、追々フォローしていこうと思います。
▼この記事を書いたひと

R&Dセンター 松井 良行
R&Dセンター 室長。コンピュータと共に35年。そしてこれからも!
おすすめの関連記事
- 【物体検出】vol.10 :YOLOv3をNVIDIA Jetson AGX Xavierで動かす~その2(OpenCV4対応)
- 【物体検出】vol.9 :YOLOv3をNVIDIA Jetson AGX Xavierで動かす
- 【物体検出】vol.2 :YOLOv3をNVIDIA Jetson Nanoで動かす
機械学習・AIの最新記事
- 【エッジAI】Raspi5+SONY IMX500で30FPS枕木検出チャレンジ!~鉄道技術展2025デモ編 vol.25
- 【エッジAI】Raspi+SONY IMX500で30FPS物体検出チャレンジ!~オリジナルモデル、静止画・ログ保存編 vol.24
- 【エッジAI】Raspi5+SONY IMX500で30FPS物体検出チャレンジ!~環境整備編 vol.23
- 【エッジAI】Raspi5+SONY IMX500で30FPS物体検出チャレンジ!~検出実行編 vol.22