Jetson-Nanoの使い方 JetPack4.6.1でTensorflowとDeepStream環境構築

スポンサーリンク
Jetson-Nano Top

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

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

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

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

本記事の内容は以下の動画でも実施していますので、よろしければ参考にしてください。

実行環境

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

アイテム説明適用購入例
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イメージをダウンロードします。

項目が多くて探しにくいですが、以下の画像のようにJetPack 4.6.1を使用します。

SEARCHの欄に”jetson nano”と入れると候補がしぼられるので探しやすくなります。

JetPack 4.6.1 SD card 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

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

USBのWi-Fi子機を自動認識した場合、使用するアクセスポイントを選択してパスワードを入れます。

以下の画面ではそのままContinueを押します。

ユーザ名やマシン名などお好みの設定にすると良いと思います。

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 update
$ sudo apt upgrade

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

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

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

$ sudo visudo

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

nanoエディタを使う場合はsudo visudoの前に以下のようにnanoのインストールと環境変数EDITORの設定を行います。(viを使う場合は実行不要)

$ sudo apt 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

冷却ファンの設定

Jetson-Nanoは高負荷時にかなり熱を持つので冷却ファンの使用をおすすめします。

購入の際にはJetson-Nano用と記載のある5Vで4端子のものを選択すると良いです。

冷却ファンは単に接続しても回らず、以下のコマンドの実行が必要です。

git clone https://github.com/Pyrestone/jetson-fan-ctl.git
cd jetson-fan-ctl/
sudo ./install.sh

ファンの回転の設定は以下のファイルで行っており、テキストエディタで編集することで設定を変えられます。

sudo vi /etc/automagic-fan/config.json

中身は以下のようになっています。

{
"FAN_OFF_TEMP":20,
"FAN_MAX_TEMP":50,
"UPDATE_INTERVAL":2,
"MAX_PERF":1
}

20℃まで冷えたらファンを止め、50℃以上で最大回転数、20〜50℃の間は温度に応じた回転数になります。

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

Tensorflow

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

$ git clone https://github.com/karaage0703/jetson-nano-tools
$ cd jetson-nano-tools
$ ./install-tensorflow-v45.sh

install-tools.shはOpenCVやMatplotlibのインストールとのことで、こちらも後々使うと思うので、合わせてインストールしました。

$ ./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の実行サンプルをダウンロードします。

$ 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.1 \
  libgstreamer1.0-0 \
  gstreamer1.0-tools \
  gstreamer1.0-plugins-good \
  gstreamer1.0-plugins-bad \
  gstreamer1.0-plugins-ugly \
  gstreamer1.0-libav \
  libgstreamer-plugins-base1.0-dev \
  libgstrtspserver-1.0-0 \
  libjansson4 \
  libyaml-cpp-dev
$ git clone https://github.com/edenhill/librdkafka.git
$ cd librdkafka
$ git reset --hard 7101c2310341ab3f4675fc565f64f0967e135a6a
$ ./configure
$ make
$ sudo make install
$ sudo mkdir -p /opt/nvidia/deepstream/deepstream-6.0/lib
$ sudo cp /usr/local/lib/librdkafka* /opt/nvidia/deepstream/deepstream-6.0/lib

続いてNVIDIA公式サイトからDeepStream SDKをダウンロードします。アカウント登録が必要です。
JetPack 4.6.1用のDeepStream 6.0.1は、最新バージョンではなくなっているため、下図の赤枠のリンクに進みます。

DeepStream Other

ここでログインが必要になります。

NVIDIAのアカウントをお持ちでない方は、アカウントを取得し、2段階認証を有効にして、スマホのGoogle Authenticatorアプリを使って表示される6桁の認証コードを使ってログインします。

DeepStream 6.0.1 tar

JetPack 4.6.1用のDeepStream 6.0.1を探し、「Download .tar」をクリックしてダウンロードします。

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

$ cd ~/Downloads
$ sudo tar -xvf deepstream_sdk_v6.0.1_jetson.tbz2 -C /
$ cd /opt/nvidia/deepstream/deepstream-6.0
$ sudo ./install.sh
$ sudo ldconfig

〜.tbz2のファイル名は、ダウンロードした時点のバージョンが入るため、上記と異なる場合がありますのでご注意ください。

以下のコマンドで画面が8分割された動画が表示されれば成功です。
動画が表示されるまでに少し時間がかかりますので、じっくり待ってください。

$ cd /opt/nvidia/deepstream/deepstream-6.0/samples
$ deepstream-app -c configs/deepstream-app/source8_1080p_dec_infer-resnet_tracker_tiled_display_fp16_nano.txt
DeepStream 8screen

続いてYOLOを試します。
以下のコマンドでモデルをダウンロードします。

$ cd /opt/nvidia/deepstream/deepstream-6.0/sources/objectDetector_Yolo
$ sudo ./prebuild.sh

次にnvccのバージョンを確認します。

$ /usr/local/cuda/bin/nvcc -V
10.2

環境変数CUDA_VERにnvccのバージョンを設定してmakeを実行します。

$ export CUDA_VER=10.2
$ sudo -E make -C nvdsinfer_custom_impl_Yolo

以下のコマンドでYOLOを実行します。

$ deepstream-app -c deepstream_app_config_yoloV2_tiny.txt

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

DeepStream Yolo

参考情報

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

無線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インストール後に以下のコマンドでコンテナを起動し、あとは上記と同様の方法でデモが動作することは確認しました。

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

ものづくりに興味があり、いろいろ触り始めたらLinuxの知識が必要になって困っているという方向けに以下のページを作成しましたので、よろしければ参考にしてください。

書籍紹介

Pythonや画像処理、機械学習関連のおすすめ書籍を紹介します。

人気ブロガーからあげ先生のとにかく楽しいAI自作教室

実践して楽しむことを重視していて、充実のサンプルコードで画像認識やテキスト分析、GAN生成といったAI応用をGoogle Colab環境下で体験できます。

入門 Python 3

基礎から応用までわかりやすい説明でコード例も多数載っていて、初学者の入門書としては必要十分と感じています。

さらにPythonらしいコードの書き方も言及されていて、スマートなコードが書けるようになります。

詳解 OpenCV 3 ―コンピュータビジョンライブラリを使った画像処理・認識

最新のOpenCV4には対応していないのですが、やはりオライリー、基礎を学ぶには十分な情報があり、この本から入ることをおすすめします。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

この本は、機械学習の仕組みを学ぶのにとても良い本だと思います。

Tensorflow/Kerasなどの既存プラットフォームを使うのではなく、基本的な仕組みを丁寧に説明し、かんたんなPythonコードで実装していく手順を紹介してくれます。

機械学習のコードがどのような処理をしているのか、想像できるようになります。

参考文献

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