Jetson-Nanoの使い方 JetPack4.3でTensorflowとDeepStream

スポンサーリンク

はじめに

これからJetson-Nanoを使い始める方、もしくは一度トライしたけど環境構築でつまづいて動かせずにいる者の方のための記事です。
楽しく機械学習を始められるお手伝いになれば幸いです。

手軽に機械学習を実践でき、コンパクトで様々な工作にも載せられるNVIDIA社の小型マイコンボードJetson-Nanoの使い方を紹介していきます。

JetPack(本稿ではバージョン4.3を使用)と呼ばれるNVIDIA社提供のSDカードイメージの準備から、Jetson-Nanoの立ち上げ、Tensorflow(Google社開発の機械学習用オープンソースライブラリ)環境構築、DeepStream SDK(NVIDIA社提供の動画認識に最適化された開発環境)のサンプルである動画の物体認識を体験できます。

読者の方からJetPack 4.5でもうまくいったとご連絡を頂いております。(感謝!)

本稿の手順にたどり着くまでに多数のサイトを参考にしましたが、情報が古かったりしてうまく流れないことがあり、それなりに苦労したので、みなさまが同じ苦労をしないように記録として残したいと思います。

実行環境

以下のようなものが必要になります。

アイテム説明適用購入例
Jetson-NanoNVIDIA社製GPU(Tegra X1)搭載の機械学習向け小型マイコンボード必須
電源電源ポート接続用5V, 4Aの電源任意(またはmicroUSB給電)
microUSB電源5V, 3Aの供給能力は必要(2Aだと起動できませんでした)任意(または電源ポート供給の電源)
ジャンパーピン電源ポートから給電する場合に使用任意(microUSB給電時不要)
モニターHDMI端子付きモニター必須
HDMIケーブルモニター接続用ケーブル必須
USBキーボード必須
USBマウス必須
LANケーブル有線LAN接続用ケーブル任意(または無線LAN子機)
無線LAN子機TP-Link TL-WN725N
無線LAN接続する場合に使用
任意(または有線LANケーブル)
冷却ファン安定動作のため任意
ラズパイカメラRaspberry Pi用MIPIカメラ(V2)任意
USBカメラUSB接続のカメラ任意

Ubuntu OSイメージの作成

公式サイトからJetPackイメージをダウンロードします。
2020年7月現在最新のJetPack 4.4はTensorflowのバージョンが2になり、動作が不安定との情報があったので、Tensorflowバージョン1が使えるJetPack 4.3を使うことにしました。

Download JetPack 4.3 Image

ダウンロードしたzipファイルは圧縮ファイルですが、解凍せずに使いますのでそのままにしておいてください。

以下、Macで実施する例を載せていますが、ここで使用するSD Card FormatterとBalena EtcherはWindows用もありますので、同様に実行できます。

SD Card Formatterでフォーマットします。通常、Quick formatで問題ないようですが、うまく行かない場合はOverwrite formatしてください。

SD Card Formatter

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

Balena Etcher

書き込み直後に失敗することがありますが、Retryすることで問題なく書き込めると思います。

Jetson-Nanoセットアップ

周辺機器の接続

Jetson-Nanoの黒い放熱板側に下図赤丸の向きにmicroSDカードを差して、カチッと鳴るまで押し込みます。

Insert microSD Card

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

Jumper Pin

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

Cable Connection

私が使用しているキーボードはUSBハブが一体になっていて、そちらにマウスをつないでも問題なく使えました。

Ubuntuの初期設定

電源アダプターをコンセントに差し込み、Jetson-Nanoを起動します。

途中、言語の選択がありますが、Englishにしておいた方が良いと思います。
日本語にすると問題が起きるという情報を見かけたのと、Ubuntuで日本語設定にした際にディレクトリ名が「ダウンロード」などのようになってしまい、コマンドラインが使い辛くなってしまうので、英語にしておくことをお勧めします。

Select English

なお、ここで英語にした場合も日本語入力はできるので特に不都合は無いと思います。

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

Name and password settings

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

Partition size

スリープ無効化

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

Brightness & Lock setting

Upgrade

環境を更新します。
Ctrl+Alt+Tや画面上で右クリック→Open Terminalでターミナルを立ち上げ、以下のコマンドを実行します。これにはかなり時間がかかります。

$ sudo apt-get update
$ sudo apt-get upgrade

行頭の$はコマンドプロンプトで、ターミナルからコマンド入力をすることを表現しており、$を入力する必要はありません。

sudoパスワードタイムアウト無効化

時間がかかるコマンド実行時に、何度もsudoのパスワードを入れるのが面倒な場合、以下のコマンドでsudoのパスワードタイムアウトを無効にできます。

$ sudo visudo

viエディタの編集になりますが、viの操作に不慣れな方は以下の動画で最低限のテキスト編集方法を紹介しているので参考にしてください。

viで編集・・・わからん 最低限の知識で乗り切る【Mac/Linux】

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」を押します。
ここで再起動します。

Install language

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

Add Japanese Mozc

お好みでSwitch to 〜を変更して言語切り替えの操作を指定します。
私はCtrl+Space、Shift+Ctrl+Spaceにしています。

あと、こちらもお好みですが、私はAllow different sources for each windowにしています。
ブラウザ等では日本語を使いますが、ターミナルではほぼ日本語を入力することが無く、ウィンドウ毎に入力モードが分かれている方が便利なためです。

Mozcにしたあと、Input ModeをHiraganaにすることで日本語入力できるようになります。

Hiragana input mode

機械学習環境構築と実行テスト

Tensorflow

からあげ(karaage0703)さんが環境構築用のスクリプトを用意して下さっているので、ありがたく使わせて頂きます。

$ git clone https://github.com/karaage0703/jetson-nano-tools
$ cd jetson-nano-tools

ただし、ここでinstall-tensorflow.shをそのまま実行するとh5pyのインストールに失敗しました。
こちらにcythonとh5pyの依存関係でpipが失敗する問題についての情報があったので、解決策の1つであるcythonとh5pyのインストール順を入れ替える編集を行いました。

$ 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
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は、既に最新バージョンではなくなっているため、下図の赤枠のリンクに進みます。

Archived Version - Jetson

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

Download DeepStream 4.0.2

以下のコマンドでインストールし、再起動します。

$ 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

下の動画のように道路を走る車と歩道を歩く歩行者の認識デモを見ることができます。

DeepStreamのデモ動画

参考情報

ここからは、必須の内容ではありません。お好みで参考にして頂ければと思います。

無線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のうち接続のあるもの)と進み、以下のように設定します。

Fixed IP address for 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名の右にある>マークを押し、以下のように設定します。

Fixed IP address for wireless

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との実行速度の比較についてはこの記事に載せています。

参考文献

タイトルとURLをコピーしました