AbudoriLab.

自律ロボットで誰でも遊べるよう試行錯誤するブログです。

Jetson Nano -お手軽ロボティクス計算機を使いこなそう OSインストールからお試しYOLO -

AbudoriLab.です。

前記事ではjetson nanoと周辺機器についてご紹介しました。
www.abudorilab.com
次にJetsonへOSをインストールし、人気の深層学習手法の一つであるYOLOv4を実行できるところまで準備してみましょう。

高性能計算機でしか実行できなかった深層学習をお手軽に体験してみてください!

OSのインストール

Jetsonは立派なコンピュータですが、素のままだと何もできません。
記憶媒体(PCだとハードディスクやSSD、ここではSDカード)にOSを書き込み、それを読み込ませることで普段使用されているPCと同じようにブラウザなどを利用できます。
インストールするOSはWindowsでもMacOSでもなくUbuntuになります。
Windows(やMacOS)はアプリケーションを使い何かをすることには長けていますが、プログラミング時にはかゆいところに手が届きません。
一方でUbuntuLinuxの一種で誰でも使いやすくを目標に作られているようで、GUIがしっかりしており初めての方でも簡単に扱うことができます。
初めは多少違和感を持たれるかもしれませんが、頑張って慣れていきましょう。慣れるとこちらのほうが快適と思われる方もいます。

以前のJetsonでは、Ubuntuのインストール後にドライバ類などを入れて開発環境をなにからなにまで自分で用意することが必要な、ハードルの高い代物でした。
最近ではNVIDIAがOSやドライバー等をイメージファイルにパッケージとしてまとめ、配布してくれているので以下のインストール作業を実行するだけで環境構築が完了します。
早速、普段使用されているPCで”Jetson Nano Developer Kit SD Card Image”から最新のイメージファイル(JetPack)を入手しましょう!
jetson 4.6(2021年9月時点最新)を使用しました。
developer.nvidia.com
ダウンロードが出来ましたら、zipファイルを解凍してイメージファイルをmicroSDカードに焼いていきます。
※ データを書き込むアプリとしてはEtcherが、フォーマットから書き込みまで全てやってくれるのでおすすめです。

f:id:abudori:20210809232556p:plain
Etcherでブートイメージを焼く
WindowsmacOS版どちらもあるので、ご自身の環境に合わせてご利用ください。

OS初期設定

先ほどOSイメージを焼いたSDカードを挿して電源を入れます。電源を入れれば勝手にOSのインストール画面が表示されます。簡単に手順を紹介します。


1. 規約に同意
"accept"にチェックを入れてcontinueをクリックします。

f:id:abudori:20211010234521p:plain
NVIDIAのライセンス認証

2. 言語設定
一番下に日本語の設定があります

f:id:abudori:20211010234812p:plain
言語設定

3. キーボードレイアウトの選択
日本語-日本語 でOKです(そのままではうまく認識しない文字もありますので後に設定してください。{,},8,9など)。

f:id:abudori:20211010234946p:plain
キーボード選択

4. インターネット接続設定
無線LANを接続するか、認識しなければEthernetを接続して次にいきましょう。

f:id:abudori:20211010235616p:plain
ネットワーク接続

5. エリア選択

f:id:abudori:20211010235837p:plain
エリア選択

6. ユーザ登録
ユーザ名は特に頻繁に使うので(sshなど)忘れにくい名前の設定にしましょう。

f:id:abudori:20211010235955p:plain
PC名

7. ブートドライブ設定
ブートドライブ(今回はSDカード)のUbuntuで使っていい容量を聞かれます。
もし、”WindowsUbuntuも共用したい時に開けておきたい”という時に任意の容量に制限できる機能ですが、今回は不要なのでMaxで表示されている容量を入力しましょう。(何もせずそのまま次へでOK)

f:id:abudori:20211011000155p:plain
ディスク容量指定

8. Nvpmodel modeの設定
Jetsonならではの項目です。
電源によってCPUやGPUの制限がかかり、モバイルでも安心して使用できるようになっています。(バッテリーの性能以上に消費して爆発…がないですね!)
USB供給だと最大5Wになり、CPUもデュアルコア1GHzになるようです。
最大性能を使うときはMAXNを選択すると、4コア1.5GHz駆動できるようになります。

f:id:abudori:20211011000559p:plain
電源モードの選択1
f:id:abudori:20211011000633p:plain
電源モードの選択:USB-C供給の場合

以上、デスクトップが表示されれば完了です!

terminalの歩き方

はじめてLinuxを触った時に最初にぶち当たる壁がterminalだと思います。
デスクトップが表示されている状態で、control + alt + "T" を押し、出てくるものがterminalです。(日本語では端末です)
昔コンピュータが貴重だった時、何十人で一台を共有していました。
工場などの建物のあちこちに中央のコンピュータにアクセスできる窓口が必要で、それを可能になる場所が端末です。*1

terminalでできることを大雑把に言うと、Windowsエクスプローラと同じです。
ファイルにアクセスしたり、コピーしたり、削除したりでき、特定のアプリケーションの実行もできます。
それならばGUIエクスプローラでいいのでは?と思うかもしれませんが、プログラミングをする上ではコマンドラインを使用すると手数を省略できて非常に便利です。

とりあえず、エクスプローラと同じことができること体験しましょう。
兎にも角にも打ち込んでEnterを押してみましょう。
$は打ち込まなくて良いです。ここではフォルダでなくディレクトリと呼びます。

現在のディレクトリの中身を表示

$ ls

list。"あいえす"ではなく、"えるえす"です。今のディレクトリの位置をリスト状に表示してくれます。

現在位置を表示

$ pwd

現在位置を教えてくれます。どこにも移動してなければ
/home/ユーザ名/
と表示されます。ここに作業ディレクトリを作ったりしてこれから作業をしていきます。

ファイルのコピー

$ cp コピーしたいファイル コピーしたい場所と名前

正規表現を使えば一度にたくさんのコピーができます。

ファイルの移動

$ mv 移動したいファイル 移動したい場所と名前

ファイルネームを変えるときもmvです。同じところに別の名前で移動させるイメージです

YOLOのインストールと物体認識テスト

YOLOのソースコードgithubからコピーしてテスト画像で物体認識を試してみます。
まずは、細かな設定などは気にせず済むようにGPUを使用せずCPUだけで物体認識を実行してみましょう。

1. darknetをgithubからクローン
※ gitからコピーしたソースコードを利用するにあたり、開発する際には作業用のディレクトリを作成して、そこにまとめるようにしています。
control + alt + "T"でターミナルを起動して下記のコマンドを実行してください。

mkdir ./workspace
cd workspace
mkdir git
cd git 
git clone https://github.com/AlexeyAB/darknet

YOLOにもいろいろありますが、本家を使用することを推奨します。
github.com

2. weightファイルのダウンロード
学習済みのモデルをダウンロードします。
このファイルに認識した結果から当たりハズレを教え込ませて訓練し、ベストパフォーマンスになるようにチューニングされたパラメータ情報がまとめられています。

cd ~/workspace/git/darknet
mkdir weights
cd weights
wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights

3. ビルドと実行
準備が整いましたので、ビルドしてテスト画像で認識をさせていきます。

cd ~/workspace/git/darknet
make -j3

※ -j3は早くビルドを完了させるために並列処理を指示しています。NANOのcpuは4コア4スレッドなので、他の処理用に1つ余らせて3スレッド使用するように指定しています。

ビルドが完了しましたら認識開始です。

cd ~/workspace/git/darknet
./darknet detect cfg/yolov4.cfg weights/yolov4.weights data/dog.jpg

コマンドを実行すると…

f:id:abudori:20211012000716p:plain
YOLO実行画面
f:id:abudori:20211012000758p:plain
CPU実行結果

CPUだけだと結果が出るまでに80秒以上も時間が必要でした。
Makefileが以下の状態だと、CPUのみで処理されます。

f:id:abudori:20211012000846p:plain
CPU Makefile


次に、GPUも使用して計算速度の差を確認してみます。
やり方は他の方もまとめてくださっているので、リンクを紹介するのみに留めます。
zenn.dev

GPUで処理した場合、20秒で完了しました。
数倍も認識速度が早くなることが確認できます。
ただ、全くリアルタイムには程遠いですね。YOLOのモデルのうち精度重視のモデルを使用しているので、デスクトップPCでもかなり重いです。Jetsonのような環境ではモバイル版の軽量なモデルもあるので、実際に利用するときはそちらを使用することをお勧めします。

f:id:abudori:20211012000945p:plain
GPU実行結果

GPUで処理するには以下のように設定してmakeします。
ただし、GPU周辺の設定がうまくできていないと実行時にエラーで止まります。

f:id:abudori:20211012001031p:plain
GPU Makefile

YOLOコマンド紹介

今後、自身で用意したデータを学習させて検証することもあると思いますので、必要なコマンドをご紹介します。
コマンドラインの記述ルールは次の通りです。

./darknet detector FUNTION名 cfg/coco.data cfg/yolov4.cfg weights/yolov4.weights (推論対象の画像や動画) OPTION

主に使用するFUNCTION名を以下にまとめます。

train 学習
test 画像を指定して物体認識
demo 指定する動画を使って物体認識
map mAPの算出
valid あるデータセットで認識したオブジェクトの信頼度、バウンディングボックス情報を出力

よく使用するOPTIONは以下になります。
※ FUNCTIONによって使えないOPTIONもあります。

-dont_show 認識結果やグラフを非表示にします(結果をあとでまとめて確認したい方にとっては完了まで早くなるのでおすすめです)
-ext_output バウンディングボックスの座標を出力します
-thresh 0.xx 認識結果を採用する信頼度の閾値を設定します
-output_filename [保存先のパス]/[動画名].[拡張子] 認識結果を重畳させた動画を保存します
-iou_thresh 0.xx IoU率0.xx%以上ある認識結果のみを使ってmAPを計算します
-map 学習時のlossの変動や認識精度の変動をグラフ化します

おわりに

次は、様々なYOLOのverを試して性能の比較表を作成したりしたいと思っています。
論文の結果表の見方なども解説してもいいかもしれません。
Jetson1つでいろいろ遊べますね。

また、terminalの歩き方編でGUIよりCUIがプログラミングには適するのか軽くお話しましたが、”なぜGUIではなくCUIが便利な理由5選”みたいな記事に需要があればまとめてもいいかもですね。

*1:ツリー状に構成されていて、それの一番端っこだから"端末"でそれの名残です。