はじめに
これからJetson-Nanoを使い始める方、もしくは一度トライしたけど環境構築でつまづいて動かせずにいる者の方のための記事です。
楽しく機械学習を始められるお手伝いになれば幸いです。
手軽に機械学習を実践でき、コンパクトで様々な工作にも載せられるNVIDIA社の小型マイコンボードJetson-Nanoの使い方を紹介していきます。
JetPack(本稿ではバージョン4.3を使用)と呼ばれるNVIDIA社提供のSDカードイメージの準備から、Jetson-Nanoの立ち上げ、Tensorflow(Google社開発の機械学習用オープンソースライブラリ)環境構築、DeepStream SDK(NVIDIA社提供の動画認識に最適化された開発環境)のサンプルである動画の物体認識を体験できます。
本稿の手順にたどり着くまでに多数のサイトを参考にしましたが、情報が古かったりしてうまく流れないことがあり、それなりに苦労したので、みなさまが同じ苦労をしないように記録として残したいと思います。
実行環境
以下のようなものが必要になります。
Ubuntu OSイメージの作成
公式サイトからJetPackイメージをダウンロードします。
2020年7月現在最新のJetPack 4.4はTensorflowのバージョンが2になり、動作が不安定との情報があったので、Tensorflowバージョン1が使えるJetPack 4.3を使うことにしました。

ダウンロードしたzipファイルは圧縮ファイルですが、解凍せずに使いますのでそのままにしておいてください。
以下、Macで実施する例を載せていますが、ここで使用するSD Card FormatterとBalena EtcherはWindows用もありますので、同様に実行できます。
SD Card Formatterでフォーマットします。通常、Quick formatで問題ないようですが、うまく行かない場合はOverwrite formatしてください。

Balena EtcherでJetPackイメージをSDカードに書き込みます。
「Flash from file」からJetPackイメージのzipファイルを指定し、「Flash!」を押します。

書き込み直後に失敗することがありますが、Retryすることで問題なく書き込めると思います。
Jetson-Nanoセットアップ
周辺機器の接続
Jetson-Nanoの黒い放熱板側に下図赤丸の向きにmicroSDカードを差して、カチッと鳴るまで押し込みます。

電源ポートから給電する場合、下図の箇所にジャンパーを付けます。(microUSBから給電する場合は不要)

ディスプレイ、キーボード、マウス、LANケーブル、電源デーブルを下図のように接続します。

私が使用しているキーボードはUSBハブが一体になっていて、そちらにマウスをつないでも問題なく使えました。
Ubuntuの初期設定
電源アダプターをコンセントに差し込み、Jetson-Nanoを起動します。
途中、言語の選択がありますが、Englishにしておいた方が良いと思います。
日本語にすると問題が起きるという情報を見かけたのと、Ubuntuで日本語設定にした際にディレクトリ名が「ダウンロード」などのようになってしまい、コマンドラインが使い辛くなってしまうので、英語にしておくことをお勧めします。

なお、ここで英語にした場合も日本語入力はできるので特に不都合は無いと思います。
ユーザ名やマシン名などお好みの設定にすると良いと思います。
Log in automaticallyを選択すると起動したらパスワード入力なくログインした状態で始まります。
工作等に載せることを考えると、通電したら即使える状態になって欲しいので、この設定にしました。

以下のようにパーティションサイズを聞かれますが、デフォルトの値で問題ありません。

スリープ無効化
時間がかかるコマンドを実行している最中にスリープに入ってしまうとインストールやジョブの実行に失敗することがあるので、スリープにならない設定にします。
画面右上のアイコン→System Settings…→Brightness & Lockから、Turn screen off when inactive for:を”Never”に設定します。

Upgrade
環境を更新します。
Ctrl+Alt+Tや画面上で右クリック→Open Terminalでターミナルを立ち上げ、以下のコマンドを実行します。これにはかなり時間がかかります。
$ sudo apt-get update $ sudo apt-get upgrade
行頭の$はコマンドプロンプトで、ターミナルからコマンド入力をすることを表現しており、$を入力する必要はありません。
sudoパスワードタイムアウト無効化
時間がかかるコマンド実行時に、何度もsudoのパスワードを入れるのが面倒な場合、以下のコマンドでsudoのパスワードタイムアウトを無効にできます。
$ sudo visudo
viエディタの編集になりますが、viの操作に不慣れな方は以下の動画で最低限のテキスト編集方法を紹介しているので参考にしてください。
nanoエディタを使う場合はsudo visudo
の前に以下のようにnanoのインストールと環境変数EDITORの設定を行います。(viを使う場合は実行不要)
$ sudo apt-get install nano $ export EDITOR=nano $ sudo visudo
visudoでviやnano立ち上がったら、以下の行を書き足すことでsudoのパスワードがタイムアウトしなくなります。
Defaults timestamp_timeout=-1
日本語入力設定
ブラウザ等に日本語が入力できないと何かと不便なので、日本語入力の設定をします。
画面右上のアイコン→System Settings…→Language Supportを開くと追加のインストールを促すメッセージが出るので「Install」を押します。
ここで再起動します。

続いて画面右上のアイコン→System Settings…→Text Entryを開き、「+」ボタンから”Japanese (Mozc) (IBus)”を選択して「Add」を押します。

お好みでSwitch to 〜を変更して言語切り替えの操作を指定します。
私はCtrl+Space、Shift+Ctrl+Spaceにしています。
あと、こちらもお好みですが、私はAllow different sources for each windowにしています。
ブラウザ等では日本語を使いますが、ターミナルではほぼ日本語を入力することが無く、ウィンドウ毎に入力モードが分かれている方が便利なためです。
Mozcにしたあと、Input ModeをHiraganaにすることで日本語入力できるようになります。

機械学習環境構築と実行テスト
Tensorflow
からあげ(karaage0703)さんが環境構築用のスクリプトを用意して下さっているので、ありがたく使わせて頂きます。
$ git clone https://github.com/karaage0703/jetson-nano-tools $ cd jetson-nano-tools
$ vi install-tensorflow.sh
編集後の内容を以下に記載します。
h5pyのインストールをcythonのインストール後に移動したのと、何かのコマンドで失敗したときにその先に進まず処理が終了するように1行目のbashに-euオプションを付けています。
#!/bin/bash -eu # Reference Site # https://docs.nvidia.com/deeplearning/dgx/install-tf-xavier/index.html sudo apt-get update # Install HDF5 sudo apt-get -y install libhdf5-serial-dev hdf5-tools # Install pip sudo apt-get -y install python3-pip # Update # pip3 install -U pip # Install required packages sudo apt-get -y install zlib1g-dev zip libjpeg8-dev libhdf5-dev sudo pip3 install -U numpy==1.16.1 grpcio absl-py py-cpuinfo psutil portpicker grpcio six mock requests gast astor termcolor sudo pip3 install -U cython sudo pip3 install -U h5py # Install TensorFlow pip3 install --no-cache-dir --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu==1.13.1+nv19.4 --user # Upgrade Numpy sudo pip3 install numpy==1.18 #sudo pip3 install scipy==1.1.0
install-tools.shはOpenCVやMatplotlibのインストールとのことで、こちらも後々使うと思うので、合わせてインストールしました。
実行にはかなり時間がかかります。
$ ./install-tensorflow.sh $ ./install-tools.sh
以下のコマンドで使用CPU数とクロック周波数を最大にできるそうなので設定します。
$ sudo nvpmodel -m 0 $ sudo jetson_clocks
JetsonHacksNanoさんのスクリプトを利用してSWAP領域を拡大します。
$ free -h total used free shared buff/cache available Mem: 3.9G 1.9G 645M 114M 1.3G 2.0G Swap: 1.9G 212M 1.7G $ git clone https://github.com/JetsonHacksNano/installSwapfile $ cd installSwapfile $ ./installSwapfile.sh $ free -h total used free shared buff/cache available Mem: 3.9G 1.9G 606M 121M 1.4G 2.0G Swap: 7.9G 212M 7.7G
上記のように、約2GBから約8GBへSWAP領域が増えました。
Jetson-Nanoにはnvidia-smiコマンドが存在しないため、代わりにjtopコマンドを使えるようにします。
$ sudo -H pip3 install jetson-stats $ sudo reboot
続いてGitHubからMNISTの実行サンプル(Tensorflow同梱のKerasを使うように修正したもの)をダウンロードします。
$ git clone https://github.com/tak6uch1/cuda-tensorflow
mnist_cnn.pyを実行します。実行時間測定のためにtimeコマンドを使用しています。
$ cd cuda-tensorflow/work $ time python3 mnist_cnn.py
MNISTの実行にはかなり時間がかかります。
その間にもう1つターミナルを立ち上げてjtopを実行するとCPU、GPUの使用率や温度などがリアルタイムで表示され、見ていて楽しいです。
$ jtop

Qを押すとjtopが終了します。
MNISTの最終結果が以下のように表示されれば成功です。
Test loss: 0.02674859367765239 Test accuracy: 0.9915 real 15m7.864s user 5m0.820s sys 1m24.272s
この実行時間が他の機械学習環境と比べてどうなのかを比較した結果は以下の記事にまとめましたので、気になる方は参考にしてください。
機械学習ベンチマーク
DeepStream
DeepStream SDK環境を構築し、サンプルとして入っている動画の物体認識を試していきます。
$ sudo apt install \ libssl1.0.0 \ libgstreamer1.0-0 \ gstreamer1.0-tools \ gstreamer1.0-plugins-good \ gstreamer1.0-plugins-bad \ gstreamer1.0-plugins-ugly \ gstreamer1.0-libav \ libgstrtspserver-1.0-0 \ libjansson4=2.11-1 $ sudo apt-get install librdkafka1=0.11.3-1build1
続いてNVIDIA公式サイトからDeepStream SDKをダウンロードします。アカウント登録が必要です。
JetPack 4.3用のDeepStream 4.0.2は、既に最新バージョンではなくなっているため、下図の赤枠のリンクに進みます。

「Download .deb」をクリックしてダウンロードします。

以下のコマンドでインストールし、再起動します。
$ cd Downloads $ sudo apt-get install ./deepstream-4.0_4.0.2-1_arm64.deb $ sudo reboot
以下のコマンドで画面が8分割された動画が表示されれば成功です。
動画が表示されるまでに少し時間がかかりますので、じっくり待ってください。
$ cd /opt/nvidia/deepstream/deepstream-4.0/samples $ deepstream-app -c configs/deepstream-app/source8_1080p_dec_infer-resnet_tracker_tiled_display_fp16_nano.txt
続いてYOLOを試します。
以下のコマンドでモデルをダウンロードします。
$ cd /opt/nvidia/deepstream/deepstream-4.0/sources/objectDetector_Yolo $ ./prebuild.sh
次にnvccのバージョンを確認します。
$ /usr/local/cuda/bin/nvcc -V
環境変数CUDA_VERにnvccのバージョンを設定してmakeを実行します。
$ export CUDA_VER=10.0 $ make -C nvdsinfer_custom_impl_Yolo
以下のコマンドでYOLOを実行します。
$ deepstream-app -c deepstream_app_config_yoloV2_tiny.txt
下の動画のように道路を走る車と歩道を歩く歩行者の認識デモを見ることができます。
参考情報
ここからは、必須の内容ではありません。お好みで参考にして頂ければと思います。
無線LAN接続
このページを参考にTP-Link TL-WN725Nを使うと、ドライバのインストール不要でメニューバーに無線LANアイコンが出るので、接続するWi-Fiを選択してパスワードを設定するだけで無線LAN接続できました。
値段もお手頃なので大変助かっています。
次に紹介するSSH接続とセットで使うとJetson-Nanoにつながるのは電源ケーブルのみにできるので、机の上がスッキリします。
SSH接続
私は普段パソコンを使う際に外付けキーボードとマウスを使っていますが、さらにJetson-Nano用にキーボードなどをもう1セット置くスペースが無く、Jetson-Nanoを使う際にキーボードやディスプレイを差し替えるのも面倒なため、SSH接続してパソコンの画面上でJetson-Nanoを操作できるようにしています。
SSH接続する場合、IPアドレスを固定にしておかないと不便なため、IPアドレスを固定します。
まず、ifconfigコマンドで現在のIPアドレスを確認します。
$ ifconfig <<< ↓ 有線LANの場合 >>> eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.179.13 netmask 255.255.255.0 broadcast 192.168.179.255 <<< ↓ 無線LANの場合 >>> wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.179.16 netmask 255.255.255.0 broadcast 192.168.179.255
ネットワーク内で使用されているIPアドレスを調べます。
Macの場合は以下のコマンドを使います。
Mac$ arp -a
Windowsの場合、NetEnumなどで確認できるようです。
以下で有線LANと無線LANそれぞれでIPアドレスを固定する方法を説明します。
◆ 有線LANの場合
画面右上のアイコン→System Settings…→Network→Wired(複数あるWiredのうち接続のあるもの)と進み、以下のように設定します。

Addressには事前に調べてネットワーク内で使われていないものを使用すると良いです。上記例では192.168.179.44としました。
たいていの場合、inetの4つの10進数のドットつなぎのアドレスのうち、一番右の数値を使われていない2〜254(1はGateway用、255はbroadcastを表すのでそれ以外)の値にすれば良いと思います。
事前にifconfigで調べたnetmask=255.255.255.0を2進数にしたときに上位24ビットが1のため、上記Netmaskの列は24とします。
Gatewayにはinet=192.168.179.13(ifconfigで事前に調べた有線LAN eth0のIPアドレス)に対し、netmask=255.255.255.0とANDを取り、一番右の桁を1にしたもの(上記例では192.168.179.1)を指定します。
◆ 無線LANの場合
画面右上のアイコン→System Settings…→Network→Wirelessから接続されているWi-Fi名の右にある>マークを押し、以下のように設定します。

IPアドレス等に指定する内容は「有線LANの場合」に記載した内容をご覧ください。
IPアドレスを固定できたら、そのアドレスとJetson-Nanoのログイン名を使い、パソコン側で以下のようにSSHコマンドを入力します。
PC$ ssh -Y user@192.168.179.33
-YはX11 Forwardingを有効にするためのオプションで、GUIを表示できるようになります。
以下のようにxcalc(計算機アプリ)が立ち上がることを確認してください。
PC$ xcalc
ただし、DeepStreamの動画などが表示できず、全てのGUIが表示できるわけではありません。
VNC接続
こちらのページのVinoを使う方法を参考にRealVNCを使ってUbuntuの画面をPCに写す方法を試しましたが、リアルタイム表示とはほど遠くDeepStreamの動画もカクカクの状態だったので、お勧めできません。
LAN環境による部分があるのかもしれませんが、マウスの追従も遅く、使いづらかったので、普段はSSH接続、動画を見るときにモニターをつなぐことにしました。

Dockerイメージ
NVIDIA NGC/DeepStream-l4tのサイトにDeepStreamのDockerイメージがあり、JetPack 4.4インストール後に以下のコマンドでコンテナを起動し、あとは上記と同様の方法でデモが動作することは確認しましたが、ビルド環境が用意されていないようなので、Dockerでの試行はこれのみとしました。
$ sudo gpasswd -a $USER docker $ sudo systemctl restart docker $ sudo reboot $ docker pull nvcr.io/nvidia/deepstream-l4t:5.0-dp-20.04-samples $ xhost + $ docker run -it --rm --net=host --runtime nvidia -e DISPLAY=$DISPLAY -w /opt/nvidia/deepstream/deepstream-5.0 -v /tmp/.X11-unix/:/tmp/.X11-unix nvcr.io/nvidia/deepstream-l4t:5.0-dp-20.04-samples
ビルド環境も整えば、Dockerでの環境構築が最も簡単な環境構築方法になるはずです。
今後の発展に期待します。
まとめ
Jetson-Nanoの立ち上げ、環境設定から始めて、TensorflowとDeepStreamの実行まで説明しました。
動画の物体認識は見ていて楽しいですね。
機械学習の体験はできると思いますが、本記事の内容は用意されたデモを実行しただけなので、自分独自の認識をさせるにはどうすれば良いかが気になりますよね。
今後、独自の認識をさせるためのやり方についても紹介していきたいと思います。
パソコンを用いた機械学習やクラウドのGoogle Colabとの実行速度の比較についてはこの記事に載せています。
書籍紹介
Pythonや画像処理、機械学習関連のおすすめ書籍を紹介します。
実践して楽しむことを重視していて、充実のサンプルコードで画像認識やテキスト分析、GAN生成といったAI応用をGoogle Colab環境下で体験できます。
基礎から応用までわかりやすい説明でコード例も多数載っていて、初学者の入門書としては必要十分と感じています。
さらにPythonらしいコードの書き方も言及されていて、スマートなコードが書けるようになります。
詳解 OpenCV 3 ―コンピュータビジョンライブラリを使った画像処理・認識
最新のOpenCV4には対応していないのですが、やはりオライリー、基礎を学ぶには十分な情報があり、この本から入ることをおすすめします。
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
この本は、機械学習の仕組みを学ぶのにとても良い本だと思います。
Tensorflow/Kerasなどの既存プラットフォームを使うのではなく、基本的な仕組みを丁寧に説明し、かんたんなPythonコードで実装していく手順を紹介してくれます。
機械学習のコードがどのような処理をしているのか、想像できるようになります。
参考文献
- Jetson Nanoでディープラーニング(https://qiita.com/karaage0703/items/b09f3c65eb3913d087e4)
- 即できる!初めてのJetson nanoでAI入門:DeepStream編(https://ai-coordinator.jp/jetson-nano-deepstream)
- 2020年 Jetson Nanoのおすすめwifiドングルはコレ!(https://qiita.com/akinko/items/c01ed6b891f2117f5ed9)
- Jetson Nanoにリモートデスクトップ(VNC)環境を用意する(https://qiita.com/iwatake2222/items/a3bd8d0527dec431ef0f)
- NVIDIA GeForce GT 650M(https://www.techpowerup.com/gpu-specs/geforce-gt-650m.c547)
- NVIDIA GeForce GT 750M(https://www.techpowerup.com/gpu-specs/geforce-gt-750m.c2224)
- NVIDIA Jetson Nano GPU(https://www.techpowerup.com/gpu-specs/jetson-nano-gpu.c3643)
- NVIDIA Tegra X1 GPU(https://www.techpowerup.com/gpu-specs/tegra-x1-gpu.c3230)