Jetson Nanoで学習済みモデルを使って、いろいろやってみる(2-2)転移学習(SSD-Mobilenet)


New(2021/02/17)

Jetson Nanoで学習済みモデルを使って、いろいろやってみる(2-1)転移学習(ResNet-18)

でやった再学習(トレーニング)をColabでやってみました。

Resnet-18の場合

 


Jetson Nanoで学習済みモデルを使って、いろいろやってみる(2-1)ではResNet-18の学習済みモデルを使ってみました。ここではSSD-Mobilenetを使ってみます。

チュートリアルはこちら。Re-training SSD-Mobilenet

画像を使うトレーニングはかなりのリソースを使います。Jetson Nano には負担が大きいです。

そこで今回はトレーニングはGoogle Colab、推論はJetson Nano という具合に役割を分担してやってみます。

チュートリアルでは8種類のフルーツを分類検出していますが、趣向を変えてオフィス用品を分類検出してみます。

使うデータセットはGoogleのOpen Images  Dataset V6です。601クラスあります。

その中から以下の5クラスを使います。

Printer:プリンタ
Television:テレビジョン
Whiteboard:ホワイトボード
Chair:いす
Desk:つくえ

こんな感じ。

 

以下で/home/jetson となっている部分は適宜ご自分のユーザー名で置き換えてください。

 


チュートリアルにあるようにまずはJetsonにコンテナを作成

これはJetsonの推論実行用の環境です。

ここで作られるコンテナにはdetectnet(バイナリ)やTensorRT(共有オブジェクト)、jetsonモジュールなどが含まれています。

イメージはjetpack(4.4.1)ベースで、OSはUbuntu 18.04.5 LTSです。

 

Docker Hubからイメージを引っ張ってきます。

作業用のフォルダーを作っておきます。

jetson-inferense をクローン

コンテナ作成用のシェルを編集。

コンテナはmy_ssdという名前で永続化しておきます。

 

コンテナを作成して起動

途中でモデルのダウンロードを聞いてきますが、デフォルトのままで了解しておきます。

コンテナ作成後、起動

アップデートと必要なアプリのインストール

事前学習済みのネットワークモデルをダウンロードしておきます。

wget https://nvidia.box.com/shared/static/djf5w54rjvpqocsiztzaandq1m3avr7c.pth -O models/mobilenet-v1-ssd-mp-0_675.pth

exit か Ctrl + D で一旦コンテナを終了。

 

作業用に新しくフォルダーを作ってそこにssdフォルダをコピーしておきます。

このssdフォルダーがColabの作業環境になります。

/jetson-inferenceはコンテナからマウントされているので、ホストとコンテナでデータを共有できます。

sudo cp /home/jetson/work-ssd/jetson-inference/python/training/detection/ssd /home/jetson/Colab-SSD

 

 


Google Driveでトレーニングの事前準備

作業環境をColabでも使えるようにGoogleドライブにアップしておきます。

Google Drive はColabからマウントでき、15GBまでなら無償で使えます。

ブラウザーでドライブにアクセスして、先のColab-SSDフォルダーをアップロード

 


Google Colabでトレーニング準備

ブラウザーでGoogle Colabを開きます。

最初にNotebookを作成する際にGPUも使えるようにします。

ファイルー>ノートブックを新規作成

ランタイムをクリックー>ランタイムのタイプを変更

GPUを選んで保存します。

ファイルのアイコンをクリック

事前にGoogleドライブにアップしておいた環境が使えるようにドライブをマウントします。

マウントするとドライブが表示されるので、カレントディレクトリを変更します。

ColabのNotebookではセルの左にある矢印付きの丸いボタンをクリックすれば実行されます。

 

環境をチェックしてみます。

visionフォルダーが見えます。ここにトレーニングに必要なモジュールが置かれています。

トレーニングに使うライブラリがそろっているかチェック。

セルに以下をコピー・ペーストして実行、エラーが出なければOKです。

その他はこんな感じ。

Pythonのバージョンは3.6.9

torchでGPUが使えることが確認できます。

NVIDIAのCUDAのバージョンは10.1です。

 

ついでに、どんなGPUが使えるのか見てみます。

おお!Tesla T4 です。でもいつもこれとは限らないようです。k80が割り当てられたりp100だったり。

 


学習用の画像データをダウンロードしてトレーニング実行

AWSのs3 からOpen images の画像データをダウンロードできるようにします。

チュートリアルに倣って、 ダウンロード実行。

!python3 open_images_downloader.py --max-images=2500 --class-names "Printer,Television,Whiteboard,Chair,Desk" --data=data/office

 

トレーニング開始

!python3 train_ssd.py --data=data/office --model-dir=models/office --batch-size=4 --epochs=30

トレーニングにはだいたい1時間ちょっとかかります。

Tesla T4 なので、むちゃくちゃ速いかというとそんなでもなく、Jetson Nano(4GB)の4~5倍という体感です。

終了したらモデルをTensorRTで推論に使えるように、ONNX形式に変換しておきます。

こんなファイルです。30MBくらい。


Jetson Nano で推論準備

作成されたファイルを推論実行用にJetson nano へフィードバックしておきます。

ファイルはマウントしておいたGoogleドライブに作成されているので、ドライブを開いてダウンロードします。

対象になるのは、Colab-SSD/ssd/models/office/labels.txt , ssd-mobilenet.onnxの2つです。

右クリックで実行、ブラウザーのダウンロードフォルダーに保存されます。

ホスト側で、フィードバック先のフォルダーを作っておきます。

ダウンロードしたファイルをコピーします。

sudo cp /home/jetson/Downloads/* /home/jetson/work-ssd/jetson-inference/python/training/detection/ssd/models/office

 


Jetson Nano で推論

画像を準備して検証してみます。

適当な画像を探してきて、/home/jetson/Picturesフォルダーなどにoffice_1.jpgなどの名前で保存しておきます。

 

コンテナを起動。

推論実行

detectnetはバイナリ版とpython版の2種類あります。上記はバイナリで実行されていますが、detectnet.pyでも実行可です。

また、バイナリ版とpython版ではオブジェクト検出の結果の表示が若干異なります。

 

TesnsorRTはコンテナを作成する際に使ったイメージ(jetson-inference:r32.4.4)に共有オブジェクトとして含まれています。(/usr/lib/python3.6/dist-packages/tensorrt/tensorrt.so)

detectnetは初回実行時、モデルのロードとコンパイルで少々お時間かかります。

でも2回目以降の実行は高速化されています。

 

以下のフォルダー内の結果を確認

/home/jetson/work-ssd/jetson-inference/data/images/test

椅子と机が検出されています。

 


Appendix

NVIDIAのTransfer Learing についてはここも参照

NVIDIA Transfer Learning Toolkit

NVIDIA Transfer Learning Toolkit を使用したカスタムの学習済みモデル (Pre-Trained Model) による学習

:TLT(Transfer Learning Toolkit)のコンテナーはx_86アーキテクチャーのプラットフォームでのみ実行できます。TLTでトレーニングされたモデルは、Jetsonを含むすべてのNVIDIAプラットフォームにデプロイできます。

 


Appendix2

コンテナを別のPCに移行させる場合

コンテナはホストのディレクトリをマウントする設定になっているので、ホスト側のディレクトリをtarボールアーカイブしておきます。

コンテナをイメージにします

Dodcker Hub にアカウントをもっている場合はこのままpush してもいいかもしれません。

イメージやコンテナはLinuxなどのファイルシステムからは見えません(DockerはOverlayFSというのを使っているそうです)。

tarボールアーカイブすることでファイルシステムで扱えるようになります。

この2つのファイルを適当な手段で移行しておきます。

移行したら展開します。

ディレクトリをホームで展開

イメージを展開

後はrunなりcreateなりしてコンテナを起動

run.shを使う場合は、使用する$CONTAINER_IMAGE名をmy_ssd:latestに変更しておきます。

 

 


Resnet-18の場合

手順のみ

Jetson Nanoで学習済みモデルを使って、いろいろやってみる(2-1)転移学習(ResNet-18)

の内容に準じます。

コンテナmy_contで画像のダウンロードまでをやっておきます。

このフォルダーをホスト側にディレクトリを作っておいて、そこにコピーします。

コピー。

sudo docker cp my_cont:/jetson-inference/python/training/classification/.  /home/jetson/resnet18-classific

train.pyを修正しておきます。

なぜかColabではviewでサイズ数を変更するTensorの各要素が、メモリ上で要素順に並んでくれないようです。

500行目で以下のようなエラー

RuntimeError: view size is not compatible with input tensor’s size and stride (at least one dimension spans across two contiguous subspaces). Use .reshape(…) instead.

viewの前にcontiguous()を付ければメモリ上で要素順に並び、上記のエラーを回避できるようです。

correct_k = correct[:k].view(-1).float().sum(0, keepdim=True)

correct_k = correct[:k].contiguous().view(-1).float().sum(0, keepdim=True)

あるいはメッセージ通りにreshapeを使う。

correct_k = correct[:k].reshape(-1).float().sum(0, keepdim=True)

 

 

このフォルダーを上で実行したようにGoogle Drive にフォルダーごとアップロード

Google Colab を開いてGPUを使うNotebookを作成。

Driveをマウントして、カレントディレクトリを移動

ライブラリーをチェック

で、再トレーニングを実行します。

Jetson Nano では4時間くらいかかっていましたが、Colab(T4)では1時間くらいで終了しました。

 

以上


 

Be the first to comment

Leave a Reply

Your email address will not be published.


*