Linux を知らなくても使える Jetson Nano 講座

投稿者: | 2019/07/16

Jetson Nano tutorial for Linux beginners.

最近、AI(機械学習)がブームですね。Amazon の DeepLens、NVIDIA の Jetson Nano Developper Kit、Sipeed M1 など、入門者向けの機械学習体験キットが次々に登場しています。その中でも、価格が比較的手頃で、ネットでの情報が多い Jetson Nano は、特に人気のようです。

私は新しい物好きですが、皆さんの中にも、つい勢いで購入してしまった方がいらっしゃるのではないでしょうか!?  購入してみたものの、公式サポートサイトを見るといろいろ面倒そうで、まだ箱を開封しただけでそのまま、という方も多いのではないかと思います。(私も、実はそんな感じでした。)

今回は、以下のような皆さんを対象にいたします。

こんな方向けです

  • 勢いで Jetson Nano を買ってしまったが、Linux に詳しくないので頓挫した。
  • 英語のサイトを読むのがしんどい。
  • Getting Started with AI on Jetson Nano トレーニングに参加してみたが、説明を読んで「なんだよ、AC アダプタ電源が必要じゃないか!  ジャンパピンとやらも持ってないぞ、話が違うぞぉ」と憤慨している。
  • 「また変なものを買って…」と家族の目が冷たい。

今回は、NVIDIA 社の「Getting Started with AI on Jetson Nano」トレーニング(無償)を実際に受講しながら、カメラから画像を入力し、実際に画像を学習させてみましょう。最後まで進むと、

おい、見ろよ。これ、オレ(ワタシ)が自分で学習させた人工知能なんだぜ!
オレの顔を認識するんだぞ!

家族に自慢できること間違いなしです!(断言)

なお、以下のような方は対象外です。 🙂

  • ウチは、半導体特約店と付き合いがあるので、頼めば技術者がやってきて無償トレーニングをしてくれるんです。
  • Linux バリバリなので、届いた当日にパッと動かしてしまい、実はもう既に飽きてしまった…

大人の事情のお約束

機械学習のトレーニング中や推論動作中の Jetson Nano は電力を多く消費し(10ワット、あるいはそれ以上)、ヒートシンク(放熱器)が高温になることがあります。動作中は子供やペットが手を触れたりしないよう、十分にお気を付けください。

必要なブツ

  • Jetson Nano Developper Kit
    これがないと始まりません。
  • カメラ
    Raspberry Pi 用のカメラモジュール v2 が良さそうですが、フレキシブルケーブルの扱いが不安な方は、ロジクール(Logitech)の C270 という USB カメラでも行けるそうです。(ちなみにこのカメラは私も持ってますが、購入時期により内部ファームウェアのバージョンが違うらしく、私のカメラはいろいろ不安定です。安いので、うまく行かなかったら新しいのに買い換えるのも手だと思います。)
  • MicroSD カード
    最低でも 32GB の容量が必要です。現在売られているもので、この容量だと大抵そうだと思いますが、UHS-1 というタイプが良いでしょう。ちなみに公式サイトに 16GB 以上、とありますが、NVIDIA 社のトレーニング用のイメージファイル(後述)は 20GB あるので、16GB のカードでは納まりません
  • Ethernet ケーブル
    ケーブルが短い場合は、100Mbit Ethernet 用ケーブルなど、大抵なんでも大丈夫です。気になる場合は、ギガビット Ethernet 対応のケーブルを用意してください。
    なお、今回は(上記トレーニングで使っているような) USB 接続でなく、Ethernet ケーブルで接続することにします。Wi-Fi アクセスポイント(Ethernet のコネクタがあるもの)や Ethernet ハブ(スイッチ)がある方は、そこに繋いで自動的に IP アドレス取得ができるようにしてください。
    Wi-Fi アクセスポイントや Ethernet ハブを持っていない方は、パソコンと Jetson Nano は Ethernet 直結にします。こんなサイトを参考にしてパソコンに IP アドレスを設定し、Jetson Nano で使うアドレスも決めておいてください。たとえばパソコンの IP アドレスが 192.168.0.1 ならば、Jetson Nano では 192.168.0.2(一例)を使えば良いでしょう。以下、192.168.0.2 を「Jetson Nano 用のアドレス」と呼びます。また、「サブネットマスク」も併せてメモしておいてください。(下のほうに、直結の場合のアドレスの決め方の例を示しておきます。)
  • AC アダプタ電源…、は無くても良いです。私がなんとかしましょう!  ちなみに、ジャンパピンも不要です。
  • USB 電源と Micro USB ケーブル
    その代わりに、USB 電源を用意します。2.5A(アンペア)程度に耐えられるものが必要です。Raspberry Pi Model 3 などで使うものをお持ちであれば、たぶんそれが使えます。
  • HDMI ディスプレイとケーブル
    Ethernet のアドレスを設定するのに必要です。DisplayPort 接続でも大丈夫だと思います。
  • USB キーボードとマウス
    上記と同じ理由で必要です。(なんだ、AC アダプタを買ったほうが簡単じゃん、とか言われそう。)
  • パソコン
    Windows, Mac, Linux いずれでも大丈夫らしいです。新しめのウェブブラウザ(Google Chrome とか Safari とか Firefox)が動くものが良いと思います。Ethernet のソケットが付いてない場合は、USB タイプの Ethernet アダプタを用意してください。
  • 最後に、英語の説明を斜め読みする努力! 🙂

Ethernet 直結の場合のアドレスの決め方(一例)

パソコンの IP アドレス: 192.168.0.1
Jetson Nano の IP アドレス: 192.168.0.2
サブネットマスク: 255.255.255.0
(デフォルト)ゲートウェイ(あるいはルーター): 通常省略可能ですが、192.168.0.254 とか入力しても良いです
(優先)DNSサーバー: これも省略可能です

NVIDIA 社トレーニングコースへの登録

まず最初に、パソコンのブラウザで以下のサイトを開きます。

そこから、Get Started > ボタンをクリックし、Next Steps メニューを開きます。最後に、Getting Started with AI on Jetson Nano というリンクをクリックしましょう。分からない方は、直接こちらをクリックしても大丈夫なはずです。

このトレーニングは無償ですが、ユーザー登録が必要です。登録する際の画面をキャプチャしておけば良かったのですが、忘れてしまったので、ここは皆さん頑張って登録してください。なお、画面上に「8時間を要す」と脅しがありますが、今回、全ては紹介しませんので、それほどはかからないと思います。

以下は基本的に、NVIDIA 社のオンライントレーニング画面に従って頂くことになりますが、今回は電源の使い方とネットの繋ぎ方が異なるので、そこにポイントを絞って説明させて頂きます。また、英語を読むのがしんどい方に、手っ取り早く機械学習の実験をするところを御紹介したいと思います。

既にいろいろ試した人向けの TIPS

マイクロ SD カードに書き込むイメージファイルについて

マイクロ SD カード(Flash メモリ)に書き込むためのイメージファイルとして、Jetson Nano の紹介サイトでは jetson-nano-sd-r32.1.1-2019-05-31.zip といったものをダウンロードすることになっていますが、実は、上記トレーニングでは別のイメージ(dlinano_v1-0-0_image_20GB.zip)を使います。上記 jetson-nano... というファイルは JetPack と呼ばれるものらしいのですが、これは基本的に Jetson Nano で動く Ubuntu Linux に過ぎず、機械学習のためのツールはほとんどインストールされていません。トレーニングではそれでは不便ですので、トレーニング専用のイメージが用意されているようです。つまり、上記 jetson-nano... ファイルは、とりあえず忘れて頂いて結構です。

もう一点。NVIDIA 社からダウンロードするイメージファイルの .zip はサイズが大きく、私が使っている Mac OS X 10.11.6(El Capitan)では、次のようなエラーが出て正しく展開できませんでした。

Archive:  dlinano_v1-0-0_image_20GB.zip
warning [dlinano_v1-0-0_image_20GB.zip]:  3285468411 extra bytes at beginning or within zipfile
  (attempting to process anyway)
error [dlinano_v1-0-0_image_20GB.zip]:  start of central directory not found;
  zipfile corrupt.

そのような場合は、7z というツールを使うと展開できます。こちらを参考にしてください。

/usr/bin/unzip -p zipファイル名

という部分を、

7z x -so zipファイル名

に置き換えてください。

電源と本体の発熱について

実際に機械学習のデモを動かしてみると分かるのですが、Jetson Nano に付いている大きなヒートシンク(放熱器)は、かなり熱くなります。私の試した様子では、素手で触れないほどになりました。つまり、Jetson Nano は意外に消費電力が大きいのです。Micro USB ケーブルでの電源供給が不安になりますし、それ以上に「クーリングファン(冷却ファン)は要らんのか!?」という気分になります。興味ある方は、ネットで検索してみてください。(Google で jetson nano クーリングファン、など)

ポイントその 1(Ethernet を繋ぐ)

先に書いたように、自宅に Wi-Fi アクセスポイントや Ethernet ハブがある方は、そこに Jetson Nano の Ethernet ソケットを Ethernet ケーブルで繋ぎます。この設定を、以下「自宅 LAN 接続」と呼びます。Wi-Fi アクセスポイントや Ethernet ハブをお持ちでない方は、パソコンと Jetson Nano を Ethernet ケーブルで直接接続してください。こちらを以下、「直接 LAN 接続」と呼びます。

なおここで、HDMI ディスプレイと USB キーボード、マウスを繋いでおいてください。ちなみに、Jetson Nano の HDMI コネクタは基板に近い方(下側)です。上側は DisplayPort コネクタです。(つまり、HDMI でなく DisplayPort ケーブルで繋いでも良い。)

ポイントその 2(電源を繋ぐ)

トレーニングコースでは AC アダプタを使うことになっていますが、今回は USB 電源に Micro USB ケーブルで接続して電源を供給します。前述のように、最低でも 2.5A(アンペア)程度に耐える電源を使ってください。

ポイントその 3(Ethernet の設定をする)

電源を入れると、Micro USB コネクタそばの緑色の LED が点灯し、HDMI ディスプレイにメッセージがずらずら表示されるはずです。(1分ほど待つ必要があるかも知れません。)

瀟洒な緑色のログイン画面が表示されたら、Password のところに dlinano と入力し、リターンキーを押します。すると Ubuntu Linux のデスクトップが表示されます。

次に、Ethernet の IP アドレスの確認をしましょう。「自宅 LAN 接続」の場合は、おそらく自動的にアドレスが設定されているはずです。画面右上の「往復矢印(↑↓)」アイコンをマウスで左クリックし、Connection information というメニューを開きましょう。Wired connection 1 (default) というタブを開き、IPv4 のところに IP アドレスが表示されていれば、無事に設定されています。この IP Address が、Jetson Nano に割り当てられたアドレスで、後で必要なのでメモしておきましょう。

一方「直接 LAN 接続」の場合は、IP アドレスの手動設定が必要です。画面右上の「往復矢印(↑↓)」アイコンをマウスで左クリックし Edit Connections... を選択します。Network Connections というダイアログが開きますので、Ethernet の Wired connection 1 をダブルクリックします。(番号は異なるかも知れません。)

新しいダイアログが開いたら、IPv4 Settings というタブを選択します。

Add ボタンをクリックし、Additional static addresses のところに

  • Address: 前述の「必要なブツ」で決めた「Jetson Nano 用のアドレス」を入力します
  • Netmask: 同様にメモしておいた「サブネットマスク」を入力します

最後に、Save ボタンを押します。そして、再度 Connection Information を開き、下記のようにアドレスが設定されていれば OK です。

ここでは、「Jetson Nano 用のアドレス」が 172.21.141.250、サブネットマスクが 255.255.255.0 です。

補足: 2つ上のダイアログ画面で Method プルダウンメニューを Automatic (DHCP) のままにしてしまいましたが、Static に変更したほうが良いかも知れません。上記でうまくいかなかったら、Static をお試しください。(画面キャプチャし忘れた言い訳。)

いずれにしても、このように自動設定された、あるいは手動で設定した IP Address「Jetson Nano 用のアドレス」を後で使いますので、メモしておいてください。

HDMI ディスプレイとキーボード等を外す

上記の設定ができたら、もう HDMI ディスプレイ、USB キーボード、マウスは不要です。外してしまって OK です。

ポイント 4(JupyterLab に接続する)

オンライントレーニングの Logging Into The JupyterLab Server というところで、パソコンのブラウザから

  • 192.168.55.1:8888

というアドレスに接続する旨の説明がありますが、以下では、この代わりに

  • Jetson Nano 用のアドレス:8888

と入力します。例えば、172.21.141.250:8888 のようにです。これ以降は、オンライントレーニングの説明通りの操作で大丈夫です。

なお、以下ではカメラが既に接続済みと仮定します。

ポイント 5(カメラの動作確認)

前述のように JupyterLab Server に接続すると、次のような画面になると思います。

そうしたら、パスワードに dlinano と入力し、Log in ボタンを押します。すると次のような画面になります。

続いて、画面左の nvdli-nano フォルダをダブルクリックし、さらに hello_camera フォルダをダブルクリックします。Raspberry Pi カメラモジュールを繋いだ場合は csi_camera.ipynb を、USB カメラの場合は usb_camera.ipynb をダブルクリックします。

すると、JupyterLab のテキストブックのような画面が開きます。画面の上のほうには、右向き三角のマークがあるはずです。(ビデオデッキ、もとい、DVD プレイヤーの再生ボタンのようなマークですね。)

その右向き三角を(ゆっくり)次々とクリックしていくと、テキストブック左の青色の縦棒がどんどん下に移動しながら、カッコ([ ])の中に次々と数字が表示されていくはずです。

数字は、実行した順番に増えていきます。カッコの右横にあるボックスは、JupyterLab の「セル」と呼びます。これは、Python というプログラミング言語で書かれた指示を、Jetson Nano 上で実行するための命令入力窓です。カッコ([ ])の中に数字が表示されていないセルは、まだ命令を実行していないセルということになります。

詳しくはネットで、JupyterLab、Jupyter Notebook と検索し、勉強してみてください。Jupyter は、パソコンのブラウザを使って、遠隔で(Jetson Nano のようなコンピュータに)プログラミング言語で命令できる優れたツールです。今回 NVIDIA 社が提供しているように、説明書き(英語ですが)とプログラムを一緒にテキストブック形式にまとめることができて、大変便利なものです。

さて。上記のように右向き三角をクリックしてセルを実行していくと、5番目あたりのセルの Python プログラムコードを実行した段階で、カメラの画像がセルの下に表示されるはずです。うまくいかない場合は、カメラの接続を再確認しましょう。Raspberry Pi カメラの場合は、一度 Jetson Nano の電源を切ってから確認しましょう。再度電源を投入すると、Ethernet の設定は自動的に完了しますので、再度パソコンのブラウザから「Jetson Nano 用のアドレス:8888」を開けば、トレーニングを再開できます。(最起動には 1分間程度の時間がかかるはずです。)

なお、テキストブックのプログラムがうまく動かない場合は、メニューから Kernel → Restart Kernel and Clear All Outputs... を選択し、テキストブックの一番上のセルをマウスで左クリックして選択し、もう一度右向き三角のクリック(の繰り返し)をやり直してください。

ポイント 6(最初の機械学習)

トレーニングをしばらく続けていくと、AI And Deep Learning というセクションに入ります。ここも、簡単にポイントまとめておきます。

Thumbs Project という副セクションまで進むと、また JupyterLab のテキストブックを開くことになります。一度 JuperLab 画面左のファイルブラウザで「家」アイコン(こんなの )をクリックしてホームフォルダに戻り、そこから順々に nvdli-nano → classification → classification_interactive.ipynb を(ダブルクリックで)開きます。

この JupyterLab テキストでは、カメラの種類によって設定変更が必要です。最初の Python プログラムコードセル(# Full reset of the camera で始まるセル)の中で、USB カメラの場合は

from jetcam.usb_camera import USBCamera
camera = USBCamera(width=224, height=224, capture_device=0) # confirm the capture_device number

のようになっていて変更不要なのですが、Raspberry Pi カメラモジュールの場合は、その前後  6行(空行を除く)を以下のように修正してください。

# USB Camera (Logitech C270 webcam)
# from jetcam.usb_camera import USBCamera
# camera = USBCamera(width=224, height=224, capture_device=0) # confirm the capture_device number

# CSI Camera (Raspberry Pi Camera Module V2)
from jetcam.csi_camera import CSICamera
camera = CSICamera(width=224, height=224)

# で始まる行はプログラムのコメント(プログラム命令でなく、ただの説明)になるので、USB カメラのための指示をコメントに変更して(これを、コメントアウトと呼びます)、CSI Camera のほうの指示を有効にします。# CSI Camera... で始まる行の先頭の # を取り除かないように注意しましょう。

このテキストブックでも、カメラのテストと同様に右向き三角をクリックしていくと、プログラムが進んでいきます。一つのセルの実行に数十秒以上かかる場合もあるので、カッコ([ ])の中に数字が表示されるまで待って、落ち着いて進めていきましょう。(実行に時間がかかっているセルのカッコ内には、アスタリクス(*)が表示されます。時間が経つと数字に変わります。)

最後のセル(# Combine all the widgets... で始まるセル)のコードを実行すると、少し時間がかかりますが、カメラの画像が表示されます。以下、詳細は NVIDIA 社のトレーニングに従って頂きたいのですが、せっかちな皆さんのために、ちょっとだけ説明をしましょう。

まず、カメラを何らかの形で固定しましょう。私はこんなのを使い、Raspberry Pi カメラを三脚に固定しています。

トレーニングでは、上向き指立てと、下向き指立て(指下げ?)を Jetson Nano に覚えさせて(学習させて)推論させよう、ということになっていますが、実はなんでも大丈夫です。例えば、「指立て」の代わりには自分の顔、「指下げ」の代わりに奥様の顔(彼氏、彼女、御主人、娘、ペットのネコ)でも OK です。ただし、30枚のトレーニング画像でうまくいかない場合は、もっと枚数を増やしてみてください。

まず、カメラに指立てを見せながら(空いているほうの手で)、画像の下のほうにある add というボタンをクリックします。以下のようなイメージです。

少しずつ手の位置や向きを変えながら、繰り返し add ボタンで画像を追加していきます。30枚ほど追加したら、今度は category プルダウンメニューで thumbs_down に変更し、こんどは指を下に向けた画像を、これも 30枚ほど追加します。

次に、epochs(エポック)という入力窓を確認します。初期値は 1 ですが、トレーニングコースでは、この値を 10 にするように指示があります。この数字は何なのでしょうか?  機械学習モデル(ニューラルネット)の「学習(トレーニング)」では、全てのトレーニングサンプル(ここでは、指上げ 30枚、指下げ 30枚、計 60枚の画像)を与えて、ニューラルネットの中にある、たくさんの「重みパラメタ」という数値を調整していきますが、これは 1回だけでなく、何度も繰り返し調整したほうが、機械学習モデルによる推論精度が向上します。この調整の「繰り返し回数」のことを epoch と呼んでいます。

ちなみに、epoch を増やしても推論精度が向上しないことがあります。正確に言うと、トレーニングサンプルについては正しく推論できるのに、テストサンプルを使って後からテストしてみると思ったほど正しく推論できない、というケースです。この場合はトレーニングの epoch をいくら増やしても推論精度は向上しません。このような状況を「過学習」(overfitting)と言います。(high variance ということもあります。) 過学習を解決するには、トレーニングサンプルを増やす(リンゴであれば、大きさや色、品種などの異なる多くの写真を用意して、偏りを減らす)必要があります。

最後に train ボタンを押し、Jetson Nano 上で機械学習モデルに学習をさせます。これには 1分ほどかかるかも知れません。epochs の数字が 0 までカウントダウンし、画面上の progress というバーが停止するまで待ちましょう。

時間がかかるなあ、と思われるかも知れませんが、今回は既に学習済みのニューラルネットモデルに transfer learning という手法で指の画像を追加学習させているだけなので、非常に短時間で実現できているのです。一からニューラルネットを学習させるには、下手をすると何日もかかるほどのコンピュータ負荷になります。そのために、ネットワークコンピューティングとかクラスタとか GPU とか(GPU は Jetson Nano にも載ってますね)とか TPU とか、いろんな技を駆使します。

ここまでできたら、一度学習結果を保存しておくと良いでしょう。save model というボタンを押すと、学習結果が保存できます。後で load model というボタンを押すことで、そのデータを読み直すことができます。

続いて、実際に Jetson Nano に「推論」をさせてみましょう。それには、evaluate ボタンを押します。

なおここで、もし画像が固まって動かない場合は、一度 JupyterLab メニューで Kernel → Restart Kernel and Run All Cells... をすると良いでしょう。そして、load model で学習結果を読み直します。

カメラに向けて指を見せると、画像右にある棒グラフ(スライダー)が変化するでしょう。変化しない場合は、state というところにあるボタン live をクリックしてみてください。指を立てると thumbs_up の値が増え、指を下げると thumbs_down の値が増えたら、Jetson Nano 上の機械学習(ニューラルネット)は、正しく画像を学習している、また、新しい未知の画像に対して指の向きを正しく推論している、ということになります。

繰り返しますが、ここでは指の形を学習させましたが、他のものでも分類、推論できます。また今回は 30枚ほどのトレーニング画像を使っていますが、トレーニング画像はたくさん用意したほうが、より正しい推論ができるようになります。特に、似ている画像の識別には大量のトレーニング画像を用意すべきです。またできれば、背景なども変えながらトレーニング画像を用意すると、より良い結果に繋がります。

ちなみに余談ですが、ここで Jetson Nano のヒートシンク(放熱器)が非常に熱くなっていることが分かると思います。火傷には十分注意してください。機械学習、推論というのは、非常にコンピュータに負荷をかけるということが分かるかと思います。消費電流を測ってみました。

かなり変動があるのですが、ここでは 1.83A(アンペア)を示しています。今回は USB 電源を使っていますが、やはりできたら AC アダプタ電源、そしてクーリングファンが欲しいところですね。

さて、ここまでうまくいったら、家族を呼んできて、自慢してみましょう!

ポイント 7(電源の切り方)

最後に、電源の切り方です。そのまま USB 電源をブチっと切ってしまっても大抵大丈夫なのですが、いちおう、Linux OS の電源の切り方を説明します。

まず、JupyterLab のメニューで、File → New Launcher を選びます。Launcher 画面の中の Other の下に、Terminal というボタンがありますので、それをクリックします。

黒い画面に

dlinano@jetson-nano:~$

というメッセージ(シェルのプロンプトと言います)が出ますので、プロンプトに続けて

sudo shutdown -h now

と入力しリターンキーを押します。これは、Linux OS のシャットダウンコマンドと言います。

パスワードを聞いてきますので、dlinano と入力して再度リターンキーを押します。Sorry, try again. と言われたらパスワードが間違ってますので、もう一度慌てずに入力します。

10秒ほど待つと、Jetson Nano の基板上の緑色 LED が消えますので、あとは電源を抜いて大丈夫です。再度電源を入れた場合は、「ポイント 4(JupyterLab に接続する)」の JupyterLab へのログイン画面から再開してください。

今日はここまで。おつかれさまでした。皆さんも頑張って、修了証を貰いましょう!

もっと詳しい説明が欲しい方に

ぜひ、お気軽にお問い合わせください。