2019-09-27

Jetson Nano でディープラーニング (3)

NVIDIA Jetson Nano 開発者キットは、組込み設計者や研究者、個人開発者がコンパクトで使いやすいプラットフォームに本格的なソフトウェアを実装して最先端の AI を活用できるようにするコンピューターで、64 ビット クアッドコア ARM CPU と 128 コアの NVIDIA GPU により 472 GFLOPS の演算性能を発揮します。

偶然 Amazon.jp で見つけて、9 月の後半三連休にセットアップしようと即注文してしまいました。使いこなせるようになるまでの試行錯誤をまとめていきます。

私は R で機械学習を利用したデータ解析、具体的には多変量の異常値の検出や、モデルの学習・予測に携わってきました。今回、NVIDIA Jetson Nano でディープラーニングに取り組むにあたって、Python がプログラミングの主役になることは想定内だったのですが、勝手が違い過ぎてずいぶんと戸惑っています。

"Hello AI World"ってなんですか?

NVIDIA の Getting Started With Jetson Nano Developer Kit のサイトに従って microSD カードに OS などのイメージを書き込んで起動するところまで進むと、次の Next Steps で、Jetson Nano を使って AI コンピュータを使ってみる段階に入ります。このページに Hello AI World のリンクがあるので、最初に試すのに最適なのだろうとクリックすると、最終的に参考サイト [1] の GitHub の jetson-inference プロジェクトのサイトに辿り着きます。

どうやらこのデモは、既に学習済みのモデルがいくつもあって、それらを用いて画像を認識して Inference(推論)するプログラムのようです。この GitHub のサイトには英文ですが丁寧な説明があります。ひとつひとつ進めてみます。

Jetson に JetPack をインストール

NVIDIA JetPack は AIコンピュータービジョンのアプリケーションを開発し、デプロイするための包括的な SDK で、以下が含まれているとのことです。

  • L4T Kernel / BSP
  • CUDA Toolkit
  • cuDNN
  • TensorRT
  • OpenCV
  • VisionWorks
  • Multimedia API's

NVIDIA の Jetson シリーズの他のものは判りませんが、Jetson Nano の場合は、作成した microSD カードのイメージの中に含まれているそうです。

そう言われても…、それらはどこにあるのでしょうか? /usr/local および /usr/local/bin 以下はこんな感じです。

Jetson Nano: /usr/local 以下

一方、dpkg コマンドで、Jetpack に関連のありそうな deb パッケージを検索すると、それらしきパッケージを確認できます。

Jetson Nano: 関連 deb パッケージの確認

JetPack の全貌はよく判りませんが、上記リストのパッケージは Jetson Nano 用のイメージには含まれているようです。

ソースからプロジェクトをビルド

ここでは GitHub から jetson-inference レポジトリをクローンして、ソースからビルドする方法をまとめました。いや、最初は右も左も判らなかったので、とりあえずビルドしてしまいましたが、そもそも必要な SDK はインストールされているので、ここは(最新バージョンをビルドしたいという目的以外)必要なさそうです。

GitHub から jetson-inference レポジトリをクローンしてビルドします。まずクローンするために git パッケージ、ビルドに必要な cmake パッケージをインストールします。

リスト: git パッケージと cmake パッケージのインストール 
$ sudo apt-get install git cmake

GitHub から jetson-inference レポジトリをクローンします。

リスト: GitHub から jetson-inference レポジトリをクローン 
$ git clone https://github.com/dusty-nv/jetson-inference
Cloning into 'jetson-inference'...
remote: Enumerating objects: 631, done.
...
...
$ cd jetson-inference
$ git submodule update --init
Submodule 'python/training/imagenet' (https://github.com/dusty-nv/pytorch-imagenet) registered for path 'python/training/imagenet'
Submodule 'tools/camera-capture' (https://github.com/dusty-nv/camera-capture) registered for path 'tools/camera-capture'
...
...

Python 開発用パッケージのインストール

Python3 の開発用パッケージをインストールします。

リスト: Python 開発用パッケージのインストール 
$ sudo apt-get install libpython3-dev python3-numpy

ついでに Python の仮想環境を使えるようにして、仮想環境(myenv という名前にしました)を作成してその仮想環境で作業を続けます。

リスト: Python3 仮想環境の設定 
$ cd ~/
$ sudo apt-get install python3-venv
[sudo] bitwalk のパスワード: 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
...
...
$ python3 -m venv myenv
$ source $HOME/myenv/bin/activate
(myenv) $ python -V
Python 3.6.8

CMake による設定

再び jetson-inference 内にカレントディレクトリを移し、ビルド用のディレクトリ build を作成し、そこで cmake します。

リスト: CMake による設定 
(myenv) $ cd jetson-inference
(myenv) $ mkdir build
(myenv) $ cd build
(myenv) $ cmake ../
-- The C compiler identification is GNU 7.4.0
-- The CXX compiler identification is GNU 7.4.0
...
...
Pre-build]  build root directory:   /home/bitwalk/ドキュメント/jetson-inference/build
 
[sudo] bitwalk のパスワード: 
取得:1 file:/var/cuda-repo-10-0-local-10.0.326  InRelease
...
...

モデルのダウンロード

ダウンロードするモデル(学習済みのネットワーク)の選択の画面になります。デフォルトで GoogleNet と RedNet-18 が選択されていますが、せっかくなので 1 の all models を選択しました。

ダウンロードするモデルの選択

ダウンロードするモデルを上下カーソルとスペースで選択後、[了解]でエンターして次へ進みます。

リスト: モデルのダウンロード 
[jetson-inference]  Model selection status:  0
[jetson-inference]  Models selected for download:  1 3 5 14 16 18 19 26
[jetson-inference]  Downloading all Image Recognition models...
[jetson-inference]  Downloading AlexNet...
bvlc_alexnet.caffem 100%[===================>] 232.56M  4.61MB/s    時間 2m 48s
...
...

PyTorch のインストール

PyTouch を稼動させる python のバージョンを選択する画面になりますが、ここでは Python 3.6 を選択しました。

Python のバージョン選択

プロジェクトのコンパイルとインストール

make でコンパイルして、ルート権限で make install します。

リスト: プロジェクトのコンパイルとインストール 
(myenv) $ make
[  1%] Building NVCC (Device) object utils/CMakeFiles/jetson-utils.dir/cuda/jetson-utils_generated_cudaYUV-YV12.cu.o
...
...
[100%] Built target jetson-inference-python-36
(myenv) $ sudo make install
[ 32%] Built target jetson-utils
[ 45%] Built target jetson-inference
[ 47%] Built target imagenet-console
,,,
...
[ 95%] Built target jetson-inference-python-27
[100%] Built target jetson-inference-python-36
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/include/jetson-inference/detectNet.h
-- Installing: /usr/local/include/jetson-inference/homographyNet.h
...
...
-- Installing: /usr/lib/python2.7/dist-packages/Jetson
-- Installing: /usr/lib/python2.7/dist-packages/Jetson/Utils
...
...
-- Installing: /usr/lib/python3.6/dist-packages/jetson/inference/__init__.py
-- Installing: /usr/lib/python3.6/dist-packages/jetson/__init__.py
(myenv) bitwalk@jetson:~/ドキュメント/jetson-inference/build$ 

(myenv) $ sudo ldconfig

sudo でインストールするので、Python の仮想環境下でコンパイル・インストールすれば、/usr/lib/python3.6/ 以下などに直接インストールされるのを回避できるかもしれないと期待していたのですが、残念ながらそうはなりませんでした。😭

ただ、C++ 用のバイナリなどは /usr/local/ 以下にインストールされていて、Python の実行プログラムも /usr/local/bin/ 以下にインストールされています。 /usr/local/lib/python3.6/dist-packages/ などの Python ライブラリ用のディレクトリは作成されているのですが、中は空でした。

imagenet-console コマンドで画像認識して分類してみる

ImageNet [3] にあるデータセットで学習(トレーニング)したモデルを使って画像を認識するために、imagenet-console というコンソールプログラムが利用できます。C++ でビルドしたものと Python スクリプトの二種類があります。

  • imagenet-console (C++)
  • imagenet-console.py (Python)

imagenet-console の引数は --help で確認すると下記のようになっています。Python 版のコマンドも同じ引数です。

リスト: imagenet-console の引数 
(myenv) $ imagenet-console --help
usage: imagenet-console [h] [--network NETWORK]
                        file_in [file_out]

Classify an image using an image recognition DNN.

positional arguments:
  file_in              filename of the input image to process
  file_out             filename of the output image to save (optional)

optional arguments:
  --help               show this help message and exit

imageNet arguments: 
  --network NETWORK    pre-trained model to load, one of the following:
                           * alexnet
                           * googlenet (default)
                           * googlenet-12
                           * resnet-18
                           * resnet-50
                           * resnet-101
                           * resnet-152
                           * vgg-16
                           * vgg-19
                           * inception-v4
  --model MODEL        path to custom model to load (.caffemodel, .uff, or .onnx)
  --prototxt PROTOTXT  path to custom prototxt to load (for .caffemodel only)
  --labels LABELS      path to text file containing the labels for each class
  --input_blob INPUT   name of the input layer (default is 'data')
  --output_blob OUTPUT name of the output layer (default is 'prob')
  --batch_size BATCH   maximum batch size (default is 1)

(myenv) $ 

例えば、以下のようにコマンドを実行すると、orange_1.jpg の画像が、モデル googlenet で画像認識・分類され、元の画像に分類名とその一致率(確率)が左上に書き込まれた画像が orange_output_1.jpg に出力されます。

リスト: imagenet-console の引数 
(myenv) $ imagenet-console --network=googlenet orange_1.jpg orange_output_1.jpg

試しに、三種類のオレンジの画像を用意して画像認識させてみました。左は本物の葉っぱ付きオレンジ、真ん中は本物そっくりなクリップアートのオレンジ、右はまだ青い温州蜜柑です。画像のサイズは 580 × 580 pixels に揃えました。

三種類のオレンジの画像を画像認識させて分類させた結果

右図は Granny Smith に分類されてしまいましたが、これはリンゴの栽培品種で黄緑色をしています。青い温州蜜柑の認識は難しいようです。

まとめ

ディープラーニングでやってみたいことは数多くあるのですが、画像認識がきっともっとも応用しやすい分野なのでしょう。使い方に慣れるために、しばらくはモデルの比較をしたりして画像認識のプログラムをもっと使い込んでみようと思います。

参考サイト

  1. GitHub - dusty-nv/jetson-inference: Guide to deploying deep-learning inference networks and deep vision primitives with TensorRT and NVIDIA Jetson.
  2. 「Jetson Nano」のCUDAコアで“Hello AI World”を動作させてみる (1/2) - MONOist(モノイスト)
  3. ImageNet
  4. jetson-inference/imagenet-console-2.md at master · dusty-nv/jetson-inference

ブログランキング・にほんブログ村へにほんブログ村

0 件のコメント: