1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Jetsonの応用を検討

Last updated at Posted at 2022-03-06

はじめに

 Jetsonの記事をまとめます。Jetsonを応用するために、まずはJetsonを勉強するところから始めようと考えています。当面は、cuda環境の構築を行い、特定のAIモデルを選択し、気軽に学習できる環境を構築することを目標とします。

環境

  • Jetson Xavier NX
  • USBカメラ(Logicool C270)
  • NVIDIA A100 Tensor Core GPU

背景

 AIのエッジコンピューティング環境を画像処理のために用意したが、実際にどのように使用してよいか、よくわからないというところがあり、現状活用できていない。Jetsonに関係する情報を集め、サンプルプログラムを動作させるところからはじめ、最終的には学習環境(NVIDIA A100 Tensor Core GPU)と推論環境(Jetson)の連携を図ることを模索します。

やりたいこと

  遠隔に機械学習環境が準備できたので、以下のNVIDIAが示すネットワークモデルを目標に環境を構築します。
スクリーンショット 2022-02-26 10.36.27.png

調査概要

 Getting Started With Jetson Xavier NX Developer Kitの顔トラッキングができたので、その次のサンプルプログラムを動作させてみたいと思います。

  1. Jetsonのセットアップ
  2. (参考)Jetsonの推論結果をRTPでPCに転送する
  3. サンプルスクリプトを作成し、動作させる
  4. Jetson内でイメージ分類モデルを学習させる(途中)
  5. 遠隔の機械学習環境と連携させる(途中)
  6. サンプルではなく、独自の環境を構築する(途中)

調査詳細

1 Jetsonのセットアップ

 NVIDIA公式ページを参考にJetsonのセットアップを行います。VideoWalkThroughsには動画コンテンツもあるのでおすすめできます。

1. 事前にUSBカメラをJetsonに接続しておく

2. まず現在のJetsonのセットアップ状況を確かめる

 (1). L4Tバージョンは以下のとおり

L4Tバージョン
$ cat /etc/nv_tegra_release
# R32 (release), REVISION: 6.1, GCID: 27863751, BOARD: t186ref, EABI: aarch64, DATE: Mon Jul 26 19:36:31 UTC 2021

 (2). nvidia-l4t-coreバージョンは以下のとおり

nvidia-l4t-coreバージョン
$ dpkg-query --show nvidia-l4t-core
nvidia-l4t-core	32.6.1-20210726122859

 (3). JetPackのバージョンは以下のとおり

JetPackバージョン
$ sudo apt show nvidia-jetpack
Version: 4.6-b199

3. 次にdocker containerをクローンし、docker上でAI環境セットアップ

docker container クローン&セットアップ
$ git clone --recursive https://github.com/dusty-nv/jetson-inference
$ cd jetson-inference
$ docker/run.sh

4. 2のAI環境セットアップで0で接続したカメラを自動でマウントしたことを確認

マウント確認
$ cd build/aarch64/bin
$ ls /dev/video*
$ ./video-viewer /dev/video0

5. USBカメラから取得したストリーミング映像でリアルタイム物体判定

detectnetと映像の接続
$ detectnet /dev/video0

Screenshot from 2022-03-02 04-26-44.png

6. USBカメラから取得したストリーミング映像でリアルタイム物体判定

imagenetと映像の接続
$ imagenet /dev/video0

Screenshot from 2022-03-02 05-03-25.png

7. (参考)

 色々な画像、動画、プロトコルに対応している。手持ちのGenie Nanoで動作させるためには、プロトコル変換(ファイル保存、rtp配信等)する必要があるかもしれない(要調査)。
 Camera Streaming and Multimedia

  • MIPI CSI cameras
  • V4L2 cameras
  • RTP / RTSP
  • Videos & Images
  • Image sequences
  • OpenGL windows

2 (参考)Jetsonの推論結果をRTPでHostPC(MacOS)に転送する

 HostPC(MacOS)のターミナルウインドウをTerminal1, Terminal2と分けて、それぞれで操作します(混乱しやすいので、記載を分けました。)。

1. (Terminal1)HostPC(MacOS)にGStreamerをインストールする

GStreamerのインストール
$ brew install gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad
$ brew install gst-plugins-ugly

2. (Terminal1)HostPC(MacOS)からJetsonにssh接続する

HostPCからJetsonにssh接続
$ ssh -XY xxxx@hostname

3. (Terminal1)Jetson上の1-3で起動したdockerコンテナをbashで立ち上げ、detectnetを起動する

既存docker imageへの接続(ポートは1234)
$ sudo docker exec -it (containerid) /bin/bash
$ detectnet /dev/video0 rtp://HostPC名(IPアドレス):1234

(注意)sshでリモート接続した後にコンテナをアタッチする必要がある

4. (Terminal2)MacOSでのRTP受信

GStreamerでポート1234に届くudpパケットを受信する
$ gst-launch-1.0 -v udpsrc port=1234 \
 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! \
 rtph264depay ! decodebin ! videoconvert ! autovideosink

5. 結果
IMG_7206.jpg

  • nvidiaの公式ページで説明があるように多少の遅延が生じる
  • Jetsonそのものにはモニターをつけずに、遠隔PCから確認することも可能になる

3 サンプルスクリプトを作成し、動作させる

 まずは、お手本のとおりmy-recognition.pyスクリプトを作成し、動作させる(nvidiaのページほぼそのまま)。

1. 外部にディスク作成し、それをコンテナからマウントする

$ cd ~/
$ mkdir my-recognition
$ cd my-recognition
$ touch my-recognition.py
$ chmod +x my-recognition.py
$ wget https://github.com/dusty-nv/jetson-inference/raw/master/data/images/black_bear.jpg 
$ wget https://github.com/dusty-nv/jetson-inference/raw/master/data/images/brown_bear.jpg
$ wget https://github.com/dusty-nv/jetson-inference/raw/master/data/images/polar_bear.jpg 
$ cd jetson-inference
$ docker/run.sh --volume ~/my-recognition:/my-recognition

2. my-recognition.pyを修正する

my-recognition.py
import jetson.inference
import jetson.utils

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("filename", type=str, help="filename of the image to process")
parser.add_argument("--network", type=str, default="googlenet", help="model to use, can be:  googlenet, resnet-18, ect. (see --help for others)")
args = parser.parse_args()

img = jetson.utils.loadImage(args.filename)

net = jetson.inference.imageNet(args.network)

class_idx, confidence = net.Classify(img)

class_name = net.GetClassDesc(class_idx)

print('classified image as {:s} (class ID {:d}, confidence {:f})'.format(class_name, class_idx, confidence))

3. 実行する
 一部のモデルは再インストールが必要となる。下記はgooglenetとresnet-18の例

googlenet(default)
$ python3 ./my-recognition.py polar_bear.jpg
resnet-18
$ python3 ./my-recognition.py polar_bear.jpg --network=resnet-18 

 推論時間を比較すると圧倒的にgooglenetが速い。

4 Jetson内でイメージ分類モデルを学習させる(途中)

参考記事

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?