RHEL on Power10 で ONNX ランタイム推論とYOLOv4 model による画像の物体検出

#### はじめに

YOLOv4 モデルを使用して IBM Power10 システム上で ONNX ランタイム推論による画像の物体検出を確認したログです。

---


・Yolo (よーろー)とは？

> Yolo は You Only Look Once の略で、畳み込みニューラル ネットワークを介したシングル パスで画像を処理する物体検出モデルです。 


・ONNX (オニキス)とは?
https://github.com/onnx/onnx

> Open Neural Network Exchange (ONNX) は、AI 開発者がプロ​​ジェクトの進化に合わせて適切なツールを選択できるようにするオープン エコシステム。 ONNX は、ディープ ラーニングと従来の ML の両方の AI モデルのオープンソース形式を提供します。これは、拡張可能な計算グラフ モデルを定義するだけでなく、組み込み演算子と標準データ型の定義も定義します。現在、推論 (スコアリング) に必要な機能に焦点を当てている。

---

#### 環境


RHEL 9.2 on Power10 (S1022) (CPU 0.25, Memory 4GB)
  (GPU ではなくPower10 CPUの環境です)
 - micromamba 導入、RocketCE 設定

 

以下で作成したサーバーを使用しています。

https://qiita.com/c_u/items/154097a6fc0b89c93974

---

#### 仮想環境設定

・ base 環境から抜けます。

```
(base)  # micromamba deactivate
```

・python3.11 の test_yolo という名前の仮想環境を作成

```
 # conda create --name test_yolo python=3.11

~ ログは省略 ~
```

conda コマンドはありますが、activate オプションが実行できず...

```
 # conda activate test_yolo
usage: conda [-h] [-v] [--no-plugins] [-V] COMMAND ...
conda: error: argument COMMAND: invalid choice: 'activate' (choose from 'clean', 'compare', 'config', 'create', 'info', 'init', 'install', 'list', 'notices', 'package', 'remove', 'uninstall', 'rename', 'run', 'search', 'update', 'upgrade', 'doctor', 'env')
```

原因究明はひとまず置いておいて、micromamba コマンドを使用して環境作成します。


```
 # micromamba activate test_yolo

~ ログは省略 ~
```

rocketce チャネルからそれぞれモジュールを導入します。

・onnx のインストール

```
(test_yolo) # conda install onnx -c rocketce

~ ログは省略 ~
```

onnx 1.14 が導入されました。

```
(test_yolo) # conda list | grep onnx
onnx                      1.14.0          h3cbdf76_py311_pb4.21.12_1    rocketce
```

・onnxruntimeのインストール

```
(test_yolo) # conda install onnxruntime -c rocketce

~ ログは省略 ~
```

・scipy のインストール

```
(test_yolo) # conda install scipy -c rocketce

~ ログは省略 ~
```

・opencv のインストール

```
(test_yolo) # conda install opencv -c rocketce

~ ログは省略 ~
```

・pillow のインストール

```
(test_yolo) # conda install pillow -c rocketce

~ ログは省略 ~
```

・matplotlib のインストール

```
(test_yolo) # conda install matplotlib

~ ログは省略 ~
```

モジュール導入はここまで。

---

#### YOLO設定


onnx model zoo から yolo4 モデル、ラベル、アンカーをダウンロードします。

https://github.com/onnx/models/tree/main/validated/vision/object_detection_segmentation/yolov4


・work ディレクトリ作成

```
(test_yolo) # mkdir /work
(test_yolo) # cd /work
```

・yolo4.onnx のダウンロード

```
(test_yolo) # wget https://github.com/onnx/models/raw/main/validated/vision/
```

・coco.names のダウンロード

```
(test_yolo) # wget https://github.com/onnx/models/raw/main/validated/vision/object_detection_segmentation/yolov4/dependencies/coco.names
```

・yolov4_anchors.txt のダウンロード

```
(test_yolo) # wget https://github.com/onnx/models/raw/main/validated/vision/object_detection_segmentation/yolov4/dependencies/yolov4_anchors.txt
```

・onnx_yolo.py を作成します。
　中身は[ブログ記事](https://community.ibm.com/community/user/powerdeveloper/blogs/daniel-schenker/2024/02/28/how-to-run-a-yolo-model-on-ibm-power10-using-onnxr?CommunityKey=068c1cf5-2cf5-4d82-88c5-e067df2580bd) にあるスクリプトそのままの内容です。

```
(test_yolo) # touch onnx_yolo.py
(test_yolo) # vi onnx_yolo.py
```


・使用する image.jpg を同じフォルダにアップロードします。

```
(test_yolo) # ls -ltr
total 254260
-rw-r--r--. 1 root root 257470589 Apr  7 04:08 yolov4.onnx
-rw-r--r--. 1 root root       627 Apr  7 04:08 coco.names
-rw-r--r--. 1 root root        69 Apr  7 04:09 yolov4_anchors.txt
-rw-r--r--. 1 root root      9555 Apr  7 04:10 onnx_yolo.py
-rw-r--r--. 1 root root   2866017 Apr  7 04:18 image.jpg
```



image.jpg は手元にあった頂き物の個人撮影の写真を使用しています。(写真使用許諾済みです)

中米に生息する ケツァール (Quetzal, 最も美しいと言われている幻の鳥)  の写真です。


<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/b4a2e8a5-6692-7415-100e-617f0c786bfa.jpeg">


こちらをサンプルの python script を実行します。

```
(test_yolo) # time python3 onnx_yolo.py -i ./image.jpg

real	0m5.477s
user	0m2.632s
sys	0m0.100s
```

わずかな時間で検出が完了しています。

onnx_yolo.py 実行後、output.jpg が作成されました。

```
(test_yolo) # ls -ltr
total 255480
-rw-r--r--. 1 root root 257470589 Apr  7 04:08 yolov4.onnx
-rw-r--r--. 1 root root       627 Apr  7 04:08 coco.names
-rw-r--r--. 1 root root        69 Apr  7 04:09 yolov4_anchors.txt
-rw-r--r--. 1 root root      9555 Apr  7 04:10 onnx_yolo.py
-rw-r--r--. 1 root root   2866017 Apr  7 04:18 image.jpg
-rw-r--r--. 1 root root   1247093 Apr  7 04:30 output.jpg
(test_yolo) #
```

#### 結果確認


output.jpg ではケツァールの身体部分が赤い四角に囲まれて認識されています。(尾は途中まで...)

<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/7daf631f-84fe-e946-2f48-6faf443729d1.jpeg">

----


上記はトレーニング済みモデルを使用して推論(inference)のみを実行した確認でした。
(推論は Power10 が得意とするところです! )



以上です。