NVIDIA Jetson Orin NX 8GBを搭載しながらも、まさかのファンレスを謳うVIA Technologies社のAMOS-9100をセットアップする

# 評価キットで終わらせない、実環境へのデプロイに適したNVIDIA Jetson Orin NX 8GBを搭載したVIA Technologies社の製品「AMOS-9100」

NVIDIA Jetson Orin NX 8GBを搭載した **VIA Technologies社が誇る「AMOS-9100」** ですが、この度、ご縁がありまして無事購入することができました。AMOS-9100はJetson Orin NXと互換を持ちながらファンレス、つまり **ファンを搭載していないという、非常に産業用途に向いたエッジデバイスです。** デバイス背面にはレガシーな機器と統合できるよう「RS-232/RS-422/RS-485」「CAN/UART」のポートが設けられています。

https://www.viatech.com/ja/edge-ja/via-amos-9100/

![DSC01570.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/6b3f0e30-b266-4a0b-b1df-7625c583908b.jpeg)

https://cdn.viaembedded.com/products/docs/amos-9100/Datasheet/VIA_AMOS-9100_datasheet_v250224.pdf

本記事では、**「AMOS-9100」のセットアップ方法** について紹介します。
**初のJetson Orin NX！楽しみです！**

# 必要な機材（ターゲット）

開発には以下の機材が必要になります。M.2 SSDは必須というわけではありませんが、折角、ハイパフォーマンスのJetson Orin NXを利用するので、メモリスワップ等のコストを考えて **`M.2 SSD`** を搭載しました。

- **VIA Technologies社 AMOS-9100** ... ターゲット本体
- **M.2 SSD** ... メインストレージ（本体内蔵）
- **USB Type-Cケーブル** ... ホストとターゲットを接続するためのType-Cケーブル
- **4Kモニタ、HDMIケーブル、キーボード、マウス** ... 操作用のUI
- **LANケーブル** ... ターゲットをネットワークへ接続するために利用

## セットアップ

AMOS-9100は **NVIDIA Jetson Orin NX 8GBを搭載した機材** ですが、ブートローダーやVIA独自の拡張機能が搭載されているため、OSをフラッシュするには **VIAのサポートデスクから固有の追加ファームウェアを入手する必要があります。**

### 必要なパッケージを入手する

NVIDIAのサイトと、VIAのサポートデスクから、以下のファイルを入手します。 **`VIA_AMOS-9000_Ubuntu_22.04_EVK_v1.0.0_250113.zip` は公開されていないファイルのため、AMOS-9100購入後にVIAへ問い合わせをし、入手しました。**

- Jetson_Linux_R36.4.0_aarch64.tbz2
- Tegra_Linux_Sample-Root-Filesystem_R36.4.0_aarch64.tbz2
- VIA_AMOS-9000_Ubuntu_22.04_EVK_v1.0.0_250113.zip

```bash
$ mkdir ~/jetson
$ cd ~/jetson
$ wget https://developer.nvidia.com/downloads/embedded/l4t/r36_release_v4.0/release/Jetson_Linux_R36.4.0_aarch64.tbz2
$ wget https://developer.nvidia.com/downloads/embedded/l4t/r36_release_v4.0/release/Tegra_Linux_Sample-Root-Filesystem_R36.4.0_aarch64.tbz2

######
### Download "VIA_AMOS-9000_Ubuntu_22.04_EVK_v1.0.0_250113.zip"
### from VIA Customer Support
######

$ ls
# Jetson_Linux_R36.4.0_aarch64.tbz2
# VIA_AMOS-9000_Ubuntu_22.04_EVK_v1.0.0_250113.zip
# Tegra_Linux_Sample-Root-Filesystem_R36.4.0_aarch64.tbz2
```

### NVIDIA Jetson Linux Driver Package (L4T) を展開する

入手したNVIDIA Jetson Linux Driver Package (L4T) を展開します。続いて、Jetsonのルートファイルシステムも展開し、OSのフラッシュに必要なバイナリを `./tools/l4t_flash_prerequisites.sh` と `./apply_binaries.sh` コマンドで生成します。

```bash
$ tar xf Jetson_Linux_R36.4.0_aarch64.tbz2
$ export L4T=$PWD/Linux_for_Tegra
$ sudo tar xpf Tegra_Linux_Sample-Root-Filesystem_R36.4.0_aarch64.tbz2 \
-C $L4T/rootfs/

$ cd $L4T/
$ sudo ./tools/l4t_flash_prerequisites.sh
$ sudo ./apply_binaries.sh
```

### VIA AMOS-9100専用のドライバを展開する

NVIDIA Jetson Orin NXを制御しているVIA AMOS-9100固有のハードウェアドライバをL4Tのディレクトリ内に展開し、結合します。

```bash
$ cd $L4T/..
$ ls 
# Jetson_Linux_R36.4.0_aarch64.tbz2
# Linux_for_Tegra
# VIA_AMOS-9000_Ubuntu_22.04_EVK_v1.0.0_250113.zip
# Tegra_Linux_Sample-Root-Filesystem_R36.4.0_aarch64.tbz2
$ unzip VIA_AMOS-9000_Ubuntu_22.04_EVK_v1.0.0_250113.zip
$ tar xvf ./VIA_AMOS-9000_Ubuntu_22.04_EVK_v1.0.0_250113/Firmware/VIA_AMOS-9000_Ubuntu_22.04_EVK.tgz
$ ls 
# Jetson_Linux_R36.4.0_aarch64.tbz2
# VIA_AMOS-9000_Ubuntu_22.04_EVK_v1.0.0_250113
# Linux_for_Tegra
# VIA_AMOS-9000_Ubuntu_22.04_EVK_v1.0.0_250113.zip
# Tegra_Linux_Sample-Root-Filesystem_R36.4.0_aarch64.tbz2
```

### ホストPCとAMOS-9100を接続する

**AMOS-9100の側面に `Flash` とかかれたUSB Type-Cポートがあるので、これをホストPCと接続してください。接続後、下記の写真にある `FW更新ボタン` を押しながら `Resetボタン` を押すと、ホストPCと接続した状態になります。** なお、 `FW更新ボタン` と `Resetボタン` は共に埋没したボタンのため、ペーパークリップ等を用意して押すと良いです。私はスマホのSIMカード取り外し用のピンを利用しました。

![DSC01564.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/f3b3cde6-4bce-4d3e-8977-21cfd9102f73.png)

接続に成功すると、ホストPC上で `lsusb` コマンドを実行した際に、以下のように **`NVIDIA Corp. APX`** のデバイスが検出されます。

```bash
$ lsusb
# ...
# Bus 001 Device 018: ID 0955:7423 NVIDIA Corp. APX
# ...
```

### AMOS-9100にOSを書き込む

ホストPC上で **`Linux_for_Tegra` ディレクトリへ移動し `./flash.sh` コマンドを実行する** ことで、AMOS-9100へのOS書き込みが開始されます。書き込みには5-10分程度かかります。 **USB Type-C接続になるため、ホストPC上の比較的速度の速いポートと、USB3.2/3.1に対応した速度の出るケーブルを利用すると良いでしょう。**

```bash
$ cd ~/jetson/Linux_for_Tegra
$ sudo ./flash.sh -r amos_9k internal
# ...
# [ 694.7173 ] [................................................] 100%
# [ 697.7592 ] tegradevflash_v2 --write B_MEM_BCT mem_coldboot_sigheader.bct.encrypt
# [ 697.7603 ] Bootloader version 01.00.0000
# [ 697.9576 ] Writing partition B_MEM_BCT with mem_coldboot_sigheader.bct.encrypt [ 243712 bytes ]
# [ 697.9584 ] [................................................] 100%
# [ 700.9983 ] Flashing completed
# 
# [ 700.9984 ] Coldbooting the device
# [ 700.9996 ] tegrarcm_v2 --chip 0x23 0 --ismb2
# [ 701.0007 ] MB2 version 01.00.0000
# [ 701.1980 ] Coldbooting the device
# [ 701.1992 ] tegrarcm_v2 --chip 0x23 0 --reboot coldboot
# [ 701.2001 ] MB2 version 01.00.0000
# *** The target generic has been flashed successfully. ***
# Reset the board to boot from internal eMMC.

```

OSをフラッシュした後に、自動的にインストールスクリプトがAMOS-9100のベンダー固有の部分のセットアップが開始されます。HDMI上にOSフラッシュ後のセットアップメッセージが表示されます。 **完了まで待ちたいところですが、私の手元の環境では、この画面が2時間半近く続いていたため、電源を抜去し、再起動してしまいました。現状特に問題なく動いています。**

![WIN_20250303_20_12_37_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/bd64f040-fd68-4b5e-86df-d433f8eb2f57.jpeg)

## AMOS-9100上でのセットアップ

<font color="blue">**以降は、OSを書き込んだAMOS-9100上での操作となります。**</font>

### Ubuntu22.04をセットアップする

セットアップスクリプトが完了し、電源を抜去、再度挿入しAMOS-9100を再起動すると、Ubuntuのインストール画面が表示されます。 **ここでキーボード配列やユーザー名を選択できます。** セットアップを完了させましょう

![WIN_20250303_19_15_35_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/d3e27d98-acba-48af-abfd-0538a106ec29.jpeg)

### 便利に使うためのパッケージをインストールする

以下のコマンドを実行し、AMOS-9100を使いやすくする、またはリモートから利用できるようにする設定を行います。SSH周りについては下記の記事をご参照ください。

https://qiita.com/xtrizeShino/items/30dca87bc0789fcacfab

```bash
###
$ sudo apt update 

###
$ sudo apt install openssh-server vim
$ sudo systemctl start ssh
$ sudo systemctl enable ssh

###
$ sudo vim /etc/sudoers
# 以下の行を設定ファイルの最後に追加
# via     ALL=(ALL:ALL) NOPASSWD:ALL

### Ubuntu上での操作
$ mkdir -p /home/via/.ssh
$ touch /home/via/.ssh/authorized_keys
$ sudo chmod 700 /home/via/.ssh
$ sudo chmod 640 /home/via/.ssh/authorized_keys

### 公開鍵を登録する
$ vi /home/via/.ssh/authorized_keys
# -->> Windows上の "id_rsa.pub" の内容を書き込む
```

### 更新してはいけないパッケージをholdする<font color="red">（重要）</font>

AMOS-9100環境では、起動時に参照するハードウェア情報を維持するために、VIA固有のドライバが適用されているカーネル周りのパッケージを更新してはいけません。  `apt-mask hold` コマンドを利用して、関連ファイルが更新されないようにロックしましょう。

```bash
### リポジトリ情報を更新する
$ sudo apt update
### カーネル周りのパッケージを更新しないように設定する
$ sudo apt-mark hold linux-image-generic linux-headers-generic nvidia-l4t-kernel nvidia-l4t-kernel-headers nvidia-l4t-jetson-io nvidia-l4t-kernel-oot-modules nvidia-l4t-display-kernel nvidia-l4t-kernel-oot-headers nvidia-l4t-kernel-dtbs
### 全パッケージを更新する
$ sudo apt upgrade
### 再起動
$ sudo reboot
```

### Jetsonのセットアップ進捗を確認するツールをインストールする

Jetsonの環境をセットアップし、Aiアプリケーションを開発するには `CUDA` や `cuDNN` などいくつものパッケージをインストールする必要があります。 **インストール状況を確認するためのツール `jetson-stats` を入手しておきましょう。** 実行すると、現時点では、何もツールがインストールされていないことがわかります。

https://qiita.com/koppe/items/f211a8bd0b979b4b359f

```bash
###
$ sudo apt install python3-pip
$ sudo -H pip3 install jetson-stats

###
$ jetson_release
# Software part of jetson-stats 4.3.1 - (c) 2024, Raffaello Bonghi
# Model: NVIDIA Jetson Orin NX Engineering Reference Developer Kit - Jetpack 6.1 [L4T 36.4.0]
# NV Power Mode[2]: 15W
# Serial Number: [XXX Show with: jetson_release -s XXX]
# Hardware:
#  - P-Number: p3767-0001
#  - Module: NVIDIA Jetson Orin NX (8GB ram)
# Platform:
#  - Distribution: Ubuntu 22.04 Jammy Jellyfish
#  - Release: 5.15.148-tegra
# jtop:
#  - Version: 4.3.1
#  - Service: Inactive
# Libraries:
#  - CUDA: Not installed
#  - cuDNN: Not installed
#  - TensorRT: Not installed
#  - VPI: Not installed
#  - Vulkan: 1.3.204
#  - OpenCV: 4.5.4 - with CUDA: NO

$ sudo reboot
```

### JetPackをインストールする

上記の結果からわかるようにOSインストール直後は `CUDA` や `cuDNN` 、`TensorRT` などGPUを利用して高速な計算を実現するために必要なライブラリが入っていない状態となっています。 **`JetPack` はこれらのライブラリを一括でインストールすることのできるパッケージです。NVIDIA Orin NX向けには2025年3月現在、JetPack6.1がリリースされています。** `apt install nvidia-jetpack` を実行し、JetPackをインストールした後、`jetson_release` を実行するとすべてのツールがインストールされていることを確認できます。また、ツールを利用するためには環境変数の設定も必要ですので `~/.bashrc` に設定を追記しましょう。

https://developer.nvidia.com/embedded/jetpack-sdk-61

```bash
### 
$ sudo apt update
$ sudo apt install nvidia-jetpack

### 
$ vi ~/.bashrc
# 以下の行をファイル末尾に追加
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"

# 環境変数を更新
$ source ~/.bashrc

### ツールにパスが通っていることを確認する
$ nvcc --version
# nvcc: NVIDIA (R) Cuda compiler driver
# Copyright (c) 2005-2024 NVIDIA Corporation
# Built on Wed_Aug_14_10:14:07_PDT_2024
# Cuda compilation tools, release 12.6, V12.6.68
# Build cuda_12.6.r12.6/compiler.34714021_0

###
$ jetson_release
# Software part of jetson-stats 4.3.1 - (c) 2024, Raffaello Bonghi
# Model: NVIDIA Jetson Orin NX Engineering Reference Developer Kit - Jetpack 6.1 [L4T 36.4.0]
# NV Power Mode[2]: 15W
# Serial Number: [XXX Show with: jetson_release -s XXX]
# Hardware:
#  - P-Number: p3767-0001
#  - Module: NVIDIA Jetson Orin NX (8GB ram)
# Platform:
#  - Distribution: Ubuntu 22.04 Jammy Jellyfish
#  - Release: 5.15.148-tegra
# jtop:
#  - Version: 4.3.1
#  - Service: Active
# Libraries:
#  - CUDA: 12.6.68
#  - cuDNN: 9.3.0.75
#  - TensorRT: 10.3.0.30
#  - VPI: 3.2.4
#  - Vulkan: 1.3.204
#  - OpenCV: 4.8.0 - with CUDA: NO

###
$ sudo reboot
```

念のため、再起動します。

### DeepStreamをインストールする

以下の記事で紹介した「DeepStream」をインストールします。「DeepStream」はGStreamerを拡張したミドルウェアであり、動画に対して、ONNX形式/TensorRT形式の推論を適用することができます。

https://qiita.com/xtrizeShino/items/46a3a10da6d12c65943d

以下のドキュメントを参考にインストールします。

https://developer.nvidia.com/deepstream-getting-started

https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_Installation.html#jetson-setup

https://github.com/mesonbuild/meson/issues/7258#issuecomment-703920433

まず、DeepStreamに必要なパッケージをインストールします。**必要なパッケージは `meson` `ninja` `glib` `librdkafka` `gstreamer*` 等です。** 

```bash
$ pip3 install meson
$ pip3 install ninja

$ vi ~/.bashrc
export PATH="/home/via/.local/bin:$PATH"
$ source ~/.bashrc

$ sudo -i
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python3 get-pip.py
$ python3 -m pip install meson
$ exit

$ git clone https://github.com/GNOME/glib.git
$ cd glib
$ git checkout 2.76.6
$ meson build --prefix=/usr
$ ninja -C build/
# ninja: Entering directory `build/'
# [613/1392] Compiling C object gio/libgio-2.0.so.0.7600.6.p/gbytesicon.c.o
# ...
$ cd build
$ ninja install
# [0/1] Installing files
# Installing glib/gversionmacros.h to /usr/include/glib-2.0/glib
# Installation failed due to insufficient permissions.
# Attempt to use /usr/bin/sudo to gain elevated privileges? [y/n] y
# ...

###
$ pkg-config --modversion glib-2.0
# 2.76.6

###
$ sudo apt install libssl3 libssl-dev libgstreamer1.0-0 gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav libgstreamer-plugins-base1.0-dev libgstrtspserver-1.0-0 libjansson4 libyaml-cpp-dev

###
$ cd ~
$ git clone https://github.com/confluentinc/librdkafka.git
$ cd librdkafka
$ git checkout tags/v2.2.0
$ ./configure --enable-ssl
$ make
$ sudo make install
```

続いて、**NGC (NVIDIA GPU Cloud)** からDeepStreamをダウンロードしてインストールします。 **Jetsonはarm64アーキテクチャのため `deepstream-7.1_7.1.0-1_arm64.deb` を選択しましょう。** パッケージ名の横にある「…」をクリックするとダウンロードするためのwgetのコマンドを入手することができますので、そのコマンドを使ってDeepStreamをダウンロードし、`apt` コマンドを使ってインストールします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/52df73cc-d392-4dc8-aefa-13477c7fdc81.png)

https://catalog.ngc.nvidia.com/orgs/nvidia/resources/deepstream/files


```bash
####
# https://catalog.ngc.nvidia.com/orgs/nvidia/resources/deepstream
$ cd ~
$ wget --content-disposition 'https://api.ngc.nvidia.com/v2/resources/org/nvidia/deepstream/7.1/files?redirect=true&path=deepstream-7.1_7.1.0-1_arm64.deb' -O deepstream-7.1_7.1.0-1_arm64.deb

###
$ sudo apt-get install ./deepstream-7.1_7.1.0-1_arm64.deb
# ...
# ---------------------------------------------------------------------------------------
# NOTE: sources and samples folders will be found in /opt/nvidia/deepstream/deepstream-7.1
# ---------------------------------------------------------------------------------------
# Processing triggers for libc-bin (2.35-0ubuntu3.8) ...
# ...
```

インストール後、以下のコマンドを実行することにより、DeepStreamによって動画に対して推論が適用される様子を見ることができます。

```bash
### サンプルが格納されているディレクトリへ移動する
$ cd /opt/nvidia/deepstream/deepstream-7.1/samples

### NVIDIA DeepStreamにより動画に対して推論を実行する
$ sudo deepstream-app -c configs/deepstream-app/source30_1080p_dec_infer-resnet_tiled_display_int8.txt 
# ...
# (TensorRT形式のモデルに変換するために30分ぐらいかかります)
```

![WIN_20250304_01_30_59_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/bdafa410-eb6c-4984-877b-bf712a8a3afb.jpeg)


## NGCから入手したPeopleNetモデルを実行する

最後に、DeepSteamのデモに含まれていないモデルを利用して推論をしてみましょう。デモ以外のモデルはNGC Model Catalogから入手することができます。 **今回は、PeopleNetのモデルを利用しました。**

### NGC CLI をセットアップする

**NGCからモデルを入手するためのツール `ngc` を取得して、設定します。** JetsonはArm64アーキテクチャのため **`Arm64 Linux`** のセクションを選択し、下部に表示された手順を参考にダウンロードとセットアップをします。

https://org.ngc.nvidia.com/setup/installers/cli

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/1205def6-071c-4ddd-ac87-ba3bd164969e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/a3aae6f2-b1d3-4b62-be31-35ca07b24fdd.png)


```bash
$ wget --content-disposition https://api.ngc.nvidia.com/v2/resources/nvidia/ngc-apps/ngc_cli/versions/3.60.2/files/ngccli_arm64.zip -O ngccli_arm64.zip && unzip ngccli_arm64.zip

$ find ngc-cli/ -type f -exec md5sum {} + | LC_ALL=C sort | md5sum -c ngc-cli.md5
# -: OK
$ sha256sum ngccli_arm64.zip
# 908c20f331fdece1f5335234001f7cd15575a0bdfa967603b80b439f5b441e7b  ngccli_arm64.zip

$ chmod u+x ngc-cli/ngc
$ echo "export PATH=\"\$PATH:$(pwd)/ngc-cli\"" >> ~/.bashrc && source ~/.bashrc
```

続いて、 **ブラウザでNGCにアクセス** し、アクセストークンと呼ばれる **NGCへログインするための鍵を取得して `ngc config set` コマンドを利用してNGC CLIに鍵を登録** します。NGCへログインするための鍵は、下記の手順で入手することが可能です。 **本手順を行うには、NGCのユーザー登録［無料］が必要です。**

https://org.ngc.nvidia.com/setup

![NGCCLI](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3919880%2F5a605c6b-e650-e8f3-663d-8df6de45ac61.jpeg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=9ab97de23bcadc163f2d5004c4d9bec0)

https://docs.nvidia.com/ai-enterprise/deployment/spark-rapids-accelerator/latest/appendix-ngc.html

作成したNGCへログインするための鍵を `ngc` へ登録します。

```bash
$ ngc config set
# Enter API key [no-apikey]. Choices: [<VALID_APIKEY>, 'no-apikey']: dGdzM3EwYW0zcWUwaGtua2IyMmo4bHExNXE6Y2MyNDBjZGItZDU3ZS00M2Q0L...
# Enter CLI output format type [ascii]. Choices: ['ascii', 'csv', 'json']:
# Enter org [no-org]. Choices: ['xtrize (063599...)']: xtrize (0635990...)
# Enter team [no-team]. Choices: ['no-team']:
# Enter ace [no-ace]. Choices: ['no-ace']:
# Validating configuration...
# Successfully validated configuration.
# Saving configuration...
# Successfully saved NGC configuration to /home/via/.ngc/config

```

https://qiita.com/xtrizeShino/items/46a3a10da6d12c65943d#5-ngc-cli%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B

### NGCからモデルをダウンロードする

以上で `ngc` コマンドを利用できるようになりましたので、以下の手順により、Jetson上にNGCからPeopleNetをダウンロードしましょう。

```bash
### ngcコマンドによりNGC Model CatalogからPeopleNetをダウンロードする
$ ngc registry model download-version "nvidia/tao/peoplenet:pruned_quantized_decrypted_v2.3.4"
# -----------------------------------------------------------------------------------------------------------
#    Download status: COMPLETED
#    Downloaded local path model: /home/shino/sandbox_deepstream/peoplenet_vpruned_quantized_decrypted_v2.3.4
#    Total files downloaded: 4
#    Total transferred: 8.4 MB
#    Started at: 2025-02-13 11:30:46
#    Completed at: 2025-02-13 11:30:49
#    Duration taken: 2s
# -----------------------------------------------------------------------------------------------------------

### ダウンロードしたモデルの内容を確認する
$ ls peoplenet_vpruned_quantized_decrypted_v2.3.4/
# labels.txt  nvinfer_config.txt  resnet34_peoplenet_int8.onnx  resnet34_peoplenet_int8.txt
```

### NGCから入手したモデルで推論する

NGCから入手したモデルを使って推論を行うために、動画を処理するための設定が含まれたファイルを `git` で `NVIDIA-AI-IOT/deepstream_tao_apps` から取得します。この中にはPeopleNetの推論に必要な以下のファイルが含まれています。

- deepstream_app_source1_peoplenet.txt
- config_infer_primary_peoplenet.txt 
- labels_peoplenet.txt

```bash
$ cd ~
$ mkdir -p ~/sandbox/deepstream
$ cd ~/sandbox/deepstream/

### githubからNVIDIA TAO Toolkit x DeepStream向けのサンプルスクリプトを入手する
$ git clone https://github.com/NVIDIA-AI-IOT/deepstream_tao_apps.git
# Cloning into 'deepstream_tao_apps'...
# remote: Enumerating objects: 2930, done.
# remote: Counting objects: 100% (2930/2930), done.
# remote: Compressing objects: 100% (1140/1140), done.
# remote: Total 2930 (delta 1744), reused 2803 (delta 1681), pack-reused 0 (from 0)
# Receiving objects: 100% (2930/2930), 97.70 MiB | 24.07 MiB/s, done.
# Resolving deltas: 100% (1744/1744), done.
# Updating files: 100% (389/389), done.

### サンプルが含まれているディレクトリへ移動する
$ cd deepstream_tao_apps/deepstream_app_tao_configs/

### 
$ mkdir ~/sandbox/deepstream/peoplenet

###
$ cp deepstream_app_source1_peoplenet.txt ~/sandbox/deepstream/peoplenet/
$ cp nvinfer/config_infer_primary_peoplenet.txt ~/sandbox/deepstream/peoplenet/
$ cp labels_peoplenet.txt ~/sandbox/deepstream/peoplenet/
$ cd ~/sandbox/deepstream/peoplenet/
$ ls
# config_infer_primary_peoplenet.txt  
# deepstream_app_source1_peoplenet.txt  
# labels_peoplenet.txt
```

`ngc` コマンドでダウンロードしたディレクトリからモデルを、推論に利用する動画ファイルをWebから、AMOS-9100上にコピーします。今回はShutterStock様のサンプル動画に対して推論ができるかも試してみました。 **有償動画販売サイトは高品質で推論に適した動画を入手しやすいため、とても使いやすいです。サンプルをダウンロードできるので、試してみたい方は是非お試しください。** 

<font color="blue">**推論結果も掲載したいところですが、有償動画の取り扱いは難しいため、以降はDeepStreamに付属している `/opt/nvidia/deepstream/deepstream-7.1/samples/streams/sample_1080p_h265.mp4` の動画を例に手順を紹介します。**</font>

- 1033798799-preview.mp4
- labels.txt
- nvinfer_config.txt
- resnet34_peoplenet_int8.onnx
- resnet34_peoplenet_int8.txt

https://www.shutterstock.com/video/clip-1033798799-kids-playing-soccer-on-big-stadium-dribbling

![スクリーンショット 2025-03-05 125814.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/9ffe49a0-0178-49b6-a8ba-1422c40befdf.png)

```bash
######
### x86-64のngcコマンドで取得したPeopleNetのモデルをコピーする
######

######
### 推論に利用する動画データを準備する
### -->> テスト用に以下を利用しました
### -->> https://www.shutterstock.com/video/clip-1033798799-kids-playing-soccer-on-big-stadium-dribbling
######

$ ls
# 1033798799-preview.mp4
# config_infer_primary_peoplenet.txt
# deepstream_app_source1_peoplenet.txt
# labels.txt
# labels_peoplenet.txt
# nvinfer_config.txt
# resnet34_peoplenet_int8.onnx
# resnet34_peoplenet_int8.txt

### 起動用スクリプトを編集
### -->> 記入内容は次の節に記載
$ vi config_infer_primary_peoplenet.txt

### PeopleNetの設定用スクリプトを編集
### -->> 記入内容は次の節に記載
$ vi deepstream_app_source1_peoplenet.txt
```

#### スクリプト内の設定内容

入手した設定ファイルの **`config_infer_primary_peoplenet.txt`** と **`deepstream_app_source1_peoplenet.txt`** のファイルパスと設定値を変更します。

https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_ref_app_deepstream.html

**推論の設定をするスクリプト**
**config_infer_primary_peoplenet.txt の設定例**

```config
[property]
gpu-id=0
net-scale-factor=0.0039215697906911373
#tlt-model-key=tlt_encode
######
### -->> ファイルパスを変更する
onnx-file=./resnet34_peoplenet_int8.onnx
######
### -->> ファイルパスを変更する
labelfile-path=./labels_peoplenet.txt
######
### -->> ファイルパスを変更する
### -->> resnet34_peoplenet_int8.onnxから自動生成される (ファイル不要)
model-engine-file=./resnet34_peoplenet_int8.onnx_b1_gpu0_int8.engine
######
### -->> ファイルパスを変更する
int8-calib-file=./resnet34_peoplenet_int8.txt
######

input-dims=3;544;960;0
uff-input-blob-name=input_1:0
batch-size=1
process-mode=1
model-color-format=0
## 0=FP32, 1=INT8, 2=FP16 mode
network-mode=1
num-detected-classes=3
cluster-mode=2
interval=0
gie-unique-id=1
output-blob-names=output_bbox/BiasAdd:0;output_cov/Sigmoid:0

#Use the config params below for dbscan clustering mode
#[class-attrs-all]
#detected-min-w=4
#detected-min-h=4
#minBoxes=3
#eps=0.7

#Use the config params below for NMS clustering mode
[class-attrs-all]
topk=20
nms-iou-threshold=0.5
pre-cluster-threshold=0.2

## Per class configurations
[class-attrs-0]
topk=20
nms-iou-threshold=0.5
pre-cluster-threshold=0.4

#[class-attrs-1]
#pre-cluster-threshold=0.05
#eps=0.7
#dbscan-min-score=0.5
```

**起動用スクリプト**
**deepstream_app_source1_peoplenet.txt の設定例**

```config
[application]
enable-perf-measurement=1
perf-measurement-interval-sec=1

[tiled-display]
enable=1
rows=1
columns=1
width=1280
height=720
gpu-id=0

[source0]
enable=1
#Type - 1=CameraV4L2 2=URI 3=MultiURI
type=3
num-sources=1

######
### -->> ファイルパスを変更する
# uri=file:///home/via/sandbox/deepstream/peoplenet/1033798799-preview.mp4
uri=file:///opt/nvidia/deepstream/deepstream-7.1/samples/streams/sample_1080p_h265.mp4
######
gpu-id=0

[streammux]
gpu-id=0
batch-size=1
batched-push-timeout=40000
## Set muxer output width and height
width=1920
height=1080

[sink0]
enable=1
#Type - 1=FakeSink 2=EglSink 3=File
type=2
sync=1
source-id=0
gpu-id=0

[osd]
enable=1
gpu-id=0
border-width=3
text-size=15
text-color=1;1;1;1;
text-bg-color=0.3;0.3;0.3;1
font=Arial

[primary-gie]
enable=1
#(0): nvinfer; (1): nvinferserver
plugin-type=0
gpu-id=0
# Modify as necessary
batch-size=1
#Required by the app for OSD, not a plugin property
bbox-border-color0=1;0;0;1
bbox-border-color1=0;1;1;1
bbox-border-color2=0;0;1;1
bbox-border-color3=0;1;0;1
gie-unique-id=1

######
### -->> ファイルパスを変更する
config-file=./config_infer_primary_peoplenet.txt
######

[sink1]
enable=0
type=3
#1=mp4 2=mkv
container=1
#1=h264 2=h265 3=mpeg4
codec=1
#encoder type 0=Hardware 1=Software
enc-type=0
sync=0
bitrate=2000000
#H264 Profile - 0=Baseline 2=Main 4=High
#H265 Profile - 0=Main 1=Main10
profile=0
output-file=out.mp4
source-id=0

[sink2]
enable=0
#Type - 1=FakeSink 2=EglSink 3=File 4=RTSPStreaming 5=Overlay
type=4
#1=h264 2=h265
codec=1
#encoder type 0=Hardware 1=Software
enc-type=0
sync=0
bitrate=4000000
#H264 Profile - 0=Baseline 2=Main 4=High
#H265 Profile - 0=Main 1=Main10
profile=0
# set below properties in case of RTSPStreaming
rtsp-port=8554
udp-port=5400

[tracker]
enable=1
# For NvDCF and DeepSORT tracker, tracker-width and tracker-height must be a multiple of 32, respectively
tracker-width=640
tracker-height=384

######
### -->> ファイルパスを変更する
ll-lib-file=/opt/nvidia/deepstream/deepstream-7.1/lib/libnvds_nvmultiobjecttracker.so
######

# ll-config-file required to set different tracker types
# ll-config-file=/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/config_tracker_IOU.yml

######
### -->> ファイルパスを変更する
ll-config-file=/opt/nvidia/deepstream/deepstream-7.1/samples/configs/deepstream-app/config_tracker_NvDCF_perf.yml
######

# ll-config-file=/opt/nvidia/deepstream/deepstream-7.1/samples/configs/deepstream-app/config_tracker_NvDCF_perf.yml
# ll-config-file=/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/config_tracker_NvDCF_accuracy.yml
# ll-config-file=/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/config_tracker_DeepSORT.yml
gpu-id=0
enable-batch-process=1
enable-past-frame=1
display-tracking-id=1

[tests]
######
### -->> ループ再生を有効にする
file-loop=1
######
```

#### スクリプトを実行する

スクリプトを実行すると、動画に対して推論が実行され、人物が検出されます。

```bash
### DeepStreamでスクリプトを実行する
$ cd ~/sandbox/deepstream/peoplenet/
$ sudo deepstream-app -c deepstream_app_source1_peoplenet.txt
```

![WIN_20250305_12_54_33_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/1114bf93-f1f2-4a72-805c-f430bdb4d0c6.jpeg)

----

以上がNVIDIA Jetson Orin NX 8GBを搭載したAMOS-9100の
セットアップ方法と推論のデモの紹介となります！

**ほぼ x86-64 x GeForceのように開発できるので**
**とても快適に活用することができます**
**気になる方は是非お試しください！**

お疲れ様でした！また何か実装したら更新します！


https://www.viatech.com/ja/edge-ja/via-amos-9100/

![DSC01570.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/6b3f0e30-b266-4a0b-b1df-7625c583908b.jpeg)

https://cdn.viaembedded.com/products/docs/amos-9100/Datasheet/VIA_AMOS-9100_datasheet_v250224.pdf

----