AbudoriLab.です。
前記事ではjetson nanoと周辺機器についてご紹介しました。
www.abudorilab.com
次にJetsonへOSをインストールし、人気の深層学習手法の一つであるYOLOv4を実行できるところまで準備してみましょう。
高性能計算機でしか実行できなかった深層学習をお手軽に体験してみてください!
OSのインストール
Jetsonは立派なコンピュータですが、素のままだと何もできません。
記憶媒体(PCだとハードディスクやSSD、ここではSDカード)にOSを書き込み、それを読み込ませることで普段使用されているPCと同じようにブラウザなどを利用できます。
インストールするOSはWindowsでもMacOSでもなくUbuntuになります。
Windows(やMacOS)はアプリケーションを使い何かをすることには長けていますが、プログラミング時にはかゆいところに手が届きません。
一方でUbuntuはLinuxの一種で誰でも使いやすくを目標に作られているようで、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が、フォーマットから書き込みまで全てやってくれるのでおすすめです。Windows、macOS版どちらもあるので、ご自身の環境に合わせてご利用ください。
OS初期設定
先ほどOSイメージを焼いたSDカードを挿して電源を入れます。電源を入れれば勝手にOSのインストール画面が表示されます。簡単に手順を紹介します。
1. 規約に同意
"accept"にチェックを入れてcontinueをクリックします。
2. 言語設定
一番下に日本語の設定があります
3. キーボードレイアウトの選択
日本語-日本語 でOKです(そのままではうまく認識しない文字もありますので後に設定してください。{,},8,9など)。
4. インターネット接続設定
無線LANを接続するか、認識しなければEthernetを接続して次にいきましょう。
5. エリア選択
6. ユーザ登録
ユーザ名は特に頻繁に使うので(sshなど)忘れにくい名前の設定にしましょう。
7. ブートドライブ設定
ブートドライブ(今回はSDカード)のUbuntuで使っていい容量を聞かれます。
もし、”WindowsもUbuntuも共用したい時に開けておきたい”という時に任意の容量に制限できる機能ですが、今回は不要なのでMaxで表示されている容量を入力しましょう。(何もせずそのまま次へでOK)
8. Nvpmodel modeの設定
Jetsonならではの項目です。
電源によってCPUやGPUの制限がかかり、モバイルでも安心して使用できるようになっています。(バッテリーの性能以上に消費して爆発…がないですね!)
USB供給だと最大5Wになり、CPUもデュアルコア1GHzになるようです。
最大性能を使うときはMAXNを選択すると、4コア1.5GHz駆動できるようになります。
以上、デスクトップが表示されれば完了です!
terminalの歩き方
はじめてLinuxを触った時に最初にぶち当たる壁がterminalだと思います。
デスクトップが表示されている状態で、control + alt + "T" を押し、出てくるものがterminalです。(日本語では端末です)
昔コンピュータが貴重だった時、何十人で一台を共有していました。
工場などの建物のあちこちに中央のコンピュータにアクセスできる窓口が必要で、それを可能になる場所が端末です。*1
terminalでできることを大雑把に言うと、Windowsのエクスプローラと同じです。
ファイルにアクセスしたり、コピーしたり、削除したりでき、特定のアプリケーションの実行もできます。
それならばGUIのエクスプローラでいいのでは?と思うかもしれませんが、プログラミングをする上ではコマンドラインを使用すると手数を省略できて非常に便利です。
とりあえず、エクスプローラと同じことができること体験しましょう。
兎にも角にも打ち込んでEnterを押してみましょう。
$は打ち込まなくて良いです。ここではフォルダでなくディレクトリと呼びます。
ファイルの移動
$ 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
コマンドを実行すると…
CPUだけだと結果が出るまでに80秒以上も時間が必要でした。
Makefileが以下の状態だと、CPUのみで処理されます。
次に、GPUも使用して計算速度の差を確認してみます。
やり方は他の方もまとめてくださっているので、リンクを紹介するのみに留めます。
zenn.dev
GPUで処理した場合、20秒で完了しました。
数倍も認識速度が早くなることが確認できます。
ただ、全くリアルタイムには程遠いですね。YOLOのモデルのうち精度重視のモデルを使用しているので、デスクトップPCでもかなり重いです。Jetsonのような環境ではモバイル版の軽量なモデルもあるので、実際に利用するときはそちらを使用することをお勧めします。
GPUで処理するには以下のように設定してmakeします。
ただし、GPU周辺の設定がうまくできていないと実行時にエラーで止まります。
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:ツリー状に構成されていて、それの一番端っこだから"端末"でそれの名残です。