Jetson NanoでDarknetのYolov4を試してみる

公開:2020/10/11
更新:2020/10/17
4 min読了の目安(約3800字TECH技術記事

はじめに

2GBが$59で販売されることが直近で話題になったJetson Nanoを使ってDarknetフレームワークのYolov4を動かしてみたいと思い、実践した記録を残しています。

使用した機材

  • JetsonNano Development Kit B01 4GB
  • ACアダプター
  • Jetson Nano ケース & ファン
  • USBマウス
  • USBキーボード
  • SDカード 128GB UHS-I(最大104MB/s) V30(最低保証30MB/s) A2規格
  • USBカメラ

前提条件

ここでインストールする環境はJetPack4.4を使用する
その他著名なライブラリは下記がプリインストールされている

package version
L4T 32.4.3
TensorRT 7.1.3
cuDNN 8.0
CUDA 10.2

環境構築手順

  1. NVIDIA Jetson Download Centerにアクセスし、SD ImageのDownload実行
    2020/10/09時点ではJetPack4.4が提供されている。
    https://developer.nvidia.com/embedded/downloads

  2. microSDカードにimgを書き込み

  3. Jetson NanoにSDカードを差し込み, 電源ON
    ACアダプタを使用するため、ジャンパーピンをJ48に接続している。

  4. 電源ONしてUbuntu向けの初期設定を実施
    Desktop

  5. ひとまずOceanFFTが動くかどうか確認するため下記を実行

  cd /usr/local/cuda/samples/5_Simulations/oceanFFT
  sudo make
  ./oceanFFT

以下は画像ですが、実際に波打っている様子が出ています。
OceanFFT

YOLOv4を動かす by Darknet

公式Githubを参考に実施していきます。
[https://github.com/AlexeyAB/darknet]

  1. 上記からgit repogitoryをclone
   git clone https://github.com/AlexeyAB/darknet
  1. Makefile内の下記を変更。README.mdにはNVCCの変更が記されてないため注意。
   GPU=1
   CUDNN=1
   CUDNN_HALF=1
   OPENCV=1
   L.64 NVCC=/usr/local/cuda/bin/nvcc
  1. 下記コマンドでweightファイルを取得
   wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights
  1. make実行。JetsonNanoは4コアあるため5スレッドで分散ビルド。
    なぜ5スレッドなのかはこちらを参考にしています。
   make -j5
  1. 画像に対するテストを実行
   ./darknet detect cfg/yolov4.cfg yolov4.weights data/dog.jpg

yolov4

※camberra-gtk-moduleが入ってないとfailed to load module errorが出るが、動作上の影響は見つからなかった。
気になる場合は下記を実行。

   sudo apt install libcamberra-gtk-module

他との結果比較

  1. Yolov4-tiny
    自転車が犬で隠れているせいか認識率が少し悪いです。全景が見えてればBoundingBoxの精度もよさそうです。
    yolov4-tiny

  2. Yolov3-tiny
    こちらはBoundingBoxの精度があまりTargetを正確にとらえられてないのが気になりますね。
    Github上に出ているようにmAP@0.5がYolov4-tinyの方が高いのも頷けます。
    yolov3-tiny

デモ実行

  • Yolov4
   ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights [input device name]

試しに動かしてみましたが流石にネットワークが重たすぎて1FPSも出てないですね...
でもちゃんと見えていないキーボードも検出しており、精度は凄い。
yolov4_demo

  • Yolov3-tiny
   ./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights [input device name]

チラ見してるkeyboardが見える代わりに、検出精度が悪い模様。mouseがあまり検出できてなかったのでエッジが目立ちにくいとダメそう。
6FPS位出てますね。
yolov3-tiny_demo

  • Yolov4-tiny
   ./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights [input device name]

検出精度はそれなりで、チラ見しかできないものは検出不可。
yolov3-tinyとの演算量に差はないはずだが、14FPS出てるのが気になる...
Training仕様になっていたのをTest仕様に変更しなおしても変わらなかったのでどこかに差分があるのでしょうか...
すぐには理由がわからなかったので後々の確認課題とします。(詳しい方がいたら教えてください)
yolov4-tiny_demo

[10/13 追記]
本日確認した際にはyolov4-tinyが7.5FPSになっており結局謎が深まってしまいました...
detectの結果的には妥当なFPSになっていそうなのでここまでにしておきます。

その他

実はCSI-2のカメラモジュールも用意していたのですが、
こちらを参考に動かしてみただけなので、ここでは割愛します。
Gstreamerの勉強もしないとなぁ...

終わりに

初投稿なのでまずは実践が容易なDarknet環境をUSBそのまま動かしただけの紹介です。
実際にここまで動かすのも特に詰まった個所はなく、3時間あれば全部できる内容だったので、
手軽に試せるSDKが十分に整っている証だと思います。
次回は最適化を施した状態で動かしてみたいのでONNXに変換した後にTensorRTで動かせるかどうか試したいと思います。