このような感じで、Jetson NanoにRaspberry PiカメラモジュールV2やUSBカメラを接続して、YOLOでオブジェクト認識を行えるようです。
手順を記録しておこうと思います。
※20.6.29追記:
YOLOv4に対応する新しい記事を作成しました。
以下はYOLOv3の記事になります。
リアルタイムオブジェクト検出、YOLOはこちらのサイトになります。
こちらのページに記載された手順でdarknetをビルドしますが。
Jetson NanoでGPU、OpenCVを使用するために、次の設定を行いました。
目次
YOLOビルドオプション変更
GPU有効化
Makefileを書き換えて、GPUを有効にしますが。
vi Makefile
GPU=1に変更する他に、NVCCのパスを指定する必要がありました。
GPU=1
#24行目
NVCC=/usr/local/cuda/bin/nvcc
これでJetson NanoでYOLOを実行する際にGPUが有効になりました。
OpenCVの有効化
OPENCV=1
念の為先にlibopencv-apps-devをインストールしましたが、なくてもビルドできたのでしょうか?
libopencv-apps-devはインストールしなくてもビルドすることができました。
sudo apt-get install libopencv-apps-dev
以上の設定変更でmakeしたところ、Jetson NanoでGPUとOpenCVが有効なdarknetをビルドすることができました。
リアルタイム認識デモの実行
USBカメラ等/dev/videoデバイスの場合
USBカメラを接続した場合、YOLOのサイトと同じ下記のコマンドでカメラ映像のリアルタイム認識が可能のようです。
./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiniy.weights
CSI-2カメラの場合。上記のコマンドでは、ピクセルフォーマットの違いから、うまく動作しないようです。(ピクセルフォーマットの調べ方は、記事の最後に記載致しました。)
CSI-2カメラ等GStreamerデバイスの場合
CSI-2カメラの接続手順はこちらの記事になります。
Raspberry PiカメラモジュールV2の場合、下記のコマンドでリアルタイム認識デモを動かす事ができました。
実行前に、yolov3-tiny.weightsをダウンロードして下さい。(通常のyolov3では負荷が高すぎるため)
./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights "'nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1920, height=1080, format=(string)NV12, framerate=(fraction)30/1 ! nvtee ! nvvidconv flip-method=2 ! video/x-raw, width=(int)1280, height=(int)720, format=(string)BGRx ! videoconvert ! appsink'"
ポイントは、GStreamerデバイスとしてnvarguscamerasrcを指定するところでしょうか。画面の上下反転(180°回転)等もGStreamerのパイプラインで指定しています。
GStreamerのパイプライン全体を”(ダブルクォート)と'(シングルクォート)で囲ってありますが、コピー&ペーストで文字コードが変わることがあるため、”と’は手入力されたほうが宜しいかもしれません。
こちらの画面キャプチャは、実際にCSI-2端子に接続したRaspberry PiカメラモジュールV2でYOLOv3を動かした画面になります。
「とりあえずこれで動いた」レベルで、パラメータの微調整はしておりません。映像のサイズやフォーマット等、調整の余地があるかと思います。
GStreamerの設定は、こちらの資料を参考にさせて頂きました。
2019年5月現在、L4T Accelerated GStreamer User Guideのバージョン32.1が最新の資料で、Jetson Nano向けの情報が追記されているようです。
nvarguscamerasrcは、ARGUS API用のカメラプラグイン。nvteeはmemory:NVMMを扱うためのプラグイン、nvvidconvは映像のスケーリング(拡大/縮小)や回転のプラグインになります。
カメラ関係の付加情報
ピクセルフォーマットの調べ方
v4l-utilsをインストールして、CSI-2カメラのピクセルフォーマットを調べてみました。
sudo apt install v4l-utils
v4l2-ctl -d /dev/video0 --list-formats
CSI-2端子にRaspberry PiカメラモジュールV2を接続した場合、対応しているピクセルフォーマットはRG10のみのようです。OpenCV経由でCSI-2カメラを使用すると、こちらのフォーマットを考慮する必要があるようです。
GStreamer経由の場合、パイプラインでプラグインを指定できるため、UYVY、BGRx等のOSS(raw)ビデオフォーマットや、NV12等のNVIDIAフォーマットの相互変換が可能のようです。キャプチャ(入力)以外に、ファイル入出力や音声の処理も可能のようです。
映像/画像/音声の処理に関しては、GStreeamerはフォーマットやエンコードの変換の他、リサイズや回転、さらにCUDAによる後処理(POST-PROCESSING)もできるようですので、汎用性はずいぶん高い感じがします。
OpenCVのGStreamer有効化
YOLOからGStreamerを使用するために、OpenCVのリビルドが必要と考えていたのですが。実際に試したところ、リビルドしなくても大丈夫でした。
CSI-2カメラを使用する場合、OpenCVをリビルドして、GStreamerを有効にしました。
こちらの記事の内容に従って、GStreamerが有効なOpenCVをインストールしました。
インストール・ldconfigコマンド実行後、YOLOをビルドし直しました。
make clean
make
ビルドし直したdarknetは、OpenCVデバイスとしてGStreamerを指定できるようになりました。