【推論#03】環境構築（CPUでONNXモデルを動かす準備）

前置き

- この記事は[こちら](https://qiita.com/Reotech/items/b9f3fa8a6435b660836a)の記事の続きです
- 専門家ではないので、誤った情報を書いている可能性があります
- 本稿は環境構築の作業内容を備忘録として残す目的もあります
- 環境はWSL上で動いているubuntu24.04.2です

動作環境

```bash
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.2 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo
```


## 今回のゴール
- ONNX形式のAIモデルをPythonで動かすための環境を作る
  - モデルを読み込んで、推論を実行できるようにする

## ゴールまでのロードマップ
1. Pythonの実行環境（Ubuntuなど）
1. 仮想環境構築&モデル変換(YOLOv5s.pt → YOLOv5s.onnx)
1. 画像ファイルを用意（テスト推論に使う）
1. スクリプトを書いて動作確認

## ステップ１：Pythonの実行環境
既にインストール済みの場合は飛ばしてください

**python & pip のインストール**

```bash
sudo apt update
sudo apt install python3 python3-pip
```
**バージョン確認**

```bash
python3 --version
pip3 --version
```

**実行結果**

```bash
Python 3.12.3
pip 24.0 from /usr/lib/python3/dist-packages/pip (python 3.12)
```

## ステップ２：仮想環境構築&モデル変換
**作業用ディレクトリの作成**
```bash
mkdir ~/yolo_export
cd ~/yolo_export
```

**python仮想環境のインストール**

```bash
apt install python3.12-venv
```

**仮想環境を作成&有効化**
```bash
python3 -m venv venv
source venv/bin/activate
```

**YOLOv5をクーロン**

```bash
git clone https://github.com/ultralytics/yolov5.git
cd yolov5
```

**必要なライブラリをインストール**

```bash
pip install -r requirements.txt
```

**PyTorchモデルをダウンロード**

```bash
wget https://github.com/ultralytics/yolov5/releases/download/v6.2/yolov5s.pt
```
`yolov5s.pt`は小型の学習済み物体検知モデルで、YOLOv5の中でも最軽量

**onnxパッケージのインストール**

```bash
pip install onnx
```

**ONNX形式に変換！！**

```bash
python export.py --weights yolov5s.pt --include onnx
```

**出力結果**

```bash
(venv) user1@pc-hogehoge:~/yolo_export/yolov5$ python export.py --weights yolov5s.pt --include onnx
export: data=data/coco128.yaml, weights=['yolov5s.pt'], imgsz=[640, 640], batch_size=1, device=cpu, half=False, inplace=False, keras=False, optimize=False, int8=False, per_tensor=False, dynamic=False, cache=, simplify=False, mlmodel=False, opset=17, verbose=False, workspace=4, nms=False, agnostic_nms=False, topk_per_class=100, topk_all=100, iou_thres=0.45, conf_thres=0.25, include=['onnx']
YOLOv5 🚀 v7.0-405-g61c22e2d Python-3.12.3 torch-2.6.0+cu124 CPU

Fusing layers...
YOLOv5s summary: 213 layers, 7225885 parameters, 0 gradients, 16.4 GFLOPs

PyTorch: starting from yolov5s.pt with output shape (1, 25200, 85) (14.1 MB)

ONNX: starting export with onnx 1.17.0...
ONNX: export success ✅ 0.5s, saved as yolov5s.onnx (28.0 MB)

Export complete (0.9s)
Results saved to /home/hogehoge/yolo_export/yolov5
Detect:          python detect.py --weights yolov5s.onnx
Validate:        python val.py --weights yolov5s.onnx
PyTorch Hub:     model = torch.hub.load('ultralytics/yolov5', 'custom', 'yolov5s.onnx')
Visualize:       https://netron.app
```

**onnx形式でモデルが出力されたことを確認**
```bash
(venv) user1@pc-hogehoge:~/yolo_export/yolov5$ ls | grep *.onnx
yolov5s.onnx
```


**補足**
仮想環境を終了する場合は以下のコマンドで終了できます

```bash
deactivate
```

## ステップ３：画像ファイルを用意
**推論用に使用するディレクトリを作成する**

```bash
mkdir ~/onnx_infer
cp ~/yolo_export/yolov5/yolov5s.onnx ~/onnx_infer/
cd ~/onnx_infer
```

**テスト用画像をダウンロード**
YOLOv5の公式テスト画像
```bash
wget https://github.com/ultralytics/yolov5/releases/download/v1.0/zidane.jpg -O cat.jpg
```

## ステップ４：スクリプトを書いて動作確認

**推論スクリプトを作成**
```bash
vim infer.py
```
```python
# infer.py

import onnxruntime
import numpy as np
import cv2

# モデル読み込み
session = onnxruntime.InferenceSession("yolov5s.onnx", providers=['CPUExecutionProvider'])
input_name = session.get_inputs()[0].name

# 画像読み込みと前処理
img = cv2.imread("cat.jpg")
img_resized = cv2.resize(img, (640, 640))
input_tensor = img_resized.transpose(2, 0, 1).astype(np.float32) / 255.0
input_tensor = np.expand_dims(input_tensor, axis=0)

# 推論実行
outputs = session.run(None, {input_name: input_tensor})

# 結果表示
print("推論結果（最初の5件）:")
print(outputs[0][0][:5])
```

**推論実行に必要なライブラリをインストールしておく**
```bash
pip install onnxruntime numpy opencv-python pillow
```
| ライブラリ名 | 用途 |
|--------------|------|
| `onnxruntime` | モデルの読み込み・推論 |
| `numpy` | データ処理 |
| `opencv-python` | 画像の読み込み＆前処理 |
| `pillow` | 画像操作補助（JPEG/PNG対応など） |

**ついに推論実行**

```bash
python infer.py
```
<details><summary>クリックして推論結果を展開</summary>

```bash
推論結果（最初の5件）:
[[4.60047150e+00 4.16389656e+00 9.39333057e+00 1.04818144e+01
  3.80575657e-05 2.94646651e-01 5.80260158e-03 9.09625590e-02
  3.10921669e-03 3.17320228e-03 4.71746922e-03 3.38616967e-03
  1.15715861e-02 4.38219309e-03 8.84476006e-02 1.73011422e-03
  1.14671290e-02 1.02069676e-02 7.45278597e-03 1.20970905e-02
  1.51357055e-03 1.18538737e-03 1.57317519e-03 2.07108259e-03
  1.73816085e-03 7.73370266e-04 3.62813473e-04 1.13889575e-03
  1.09535456e-03 6.70602918e-03 2.99057961e-02 1.07992589e-02
  9.39661264e-03 4.48149443e-03 1.31395459e-03 2.16788054e-03
  1.12858415e-03 6.69628382e-03 4.31805849e-03 2.22900510e-03
  9.47833061e-04 2.60114670e-03 2.82427669e-03 2.29215622e-03
  2.07547545e-02 5.39946556e-03 1.93217397e-02 2.54511833e-03
  5.43254614e-03 3.68407369e-03 2.92974710e-03 2.45100260e-03
  1.41710043e-03 3.10927629e-04 2.31024623e-03 9.79930162e-04
  1.69652700e-03 5.28514385e-04 1.04814768e-03 1.20350718e-03
  1.04835629e-03 5.90691864e-02 1.41942501e-03 1.45716667e-02
  1.17054582e-03 8.23852420e-03 2.06834078e-03 5.76671958e-03
  1.69667602e-03 1.48096681e-03 3.93342972e-03 1.31231546e-03
  8.27994943e-03 1.48966908e-03 1.60786510e-03 4.50164080e-04
  3.60700488e-03 1.62482262e-03 1.34252310e-02 1.22582614e-02
  5.00935316e-03 1.83251500e-03 1.05044246e-03 1.01250410e-03
  1.98215246e-03]
 [1.29365435e+01 5.19810963e+00 2.63305187e+01 1.04390993e+01
  4.15444374e-05 2.17057437e-01 7.19624758e-03 1.40852004e-01
  3.50877643e-03 4.56395745e-03 7.08630681e-03 4.58362699e-03
  1.70014203e-02 6.98190928e-03 8.04540515e-02 1.38911605e-03
  1.17300451e-02 9.19440389e-03 1.23658478e-02 1.24607980e-02
  1.58196688e-03 1.34202838e-03 1.71381235e-03 2.42108107e-03
  2.04387307e-03 1.09437108e-03 4.57972288e-04 1.48898363e-03
  1.32241845e-03 6.72015548e-03 3.94449830e-02 9.41750407e-03
  6.99025393e-03 4.30676341e-03 2.19982862e-03 2.78499722e-03
  1.39001012e-03 6.12443686e-03 5.45051694e-03 2.81038880e-03
  1.04600191e-03 3.69468331e-03 3.97974253e-03 2.89049745e-03
  1.43159926e-02 4.62719798e-03 1.58945620e-02 2.67139077e-03
  4.52718139e-03 3.97631526e-03 4.33894992e-03 3.06382775e-03
  1.73145533e-03 4.54545021e-04 2.31999159e-03 1.18583441e-03
  1.99425220e-03 7.71105289e-04 1.58351660e-03 1.65829062e-03
  1.33273005e-03 6.08043969e-02 1.75139308e-03 1.07770562e-02
  1.73026323e-03 1.41476691e-02 2.77146697e-03 5.55872917e-03
  2.08368897e-03 2.03418732e-03 4.48283553e-03 1.75869465e-03
  1.12851262e-02 1.77353621e-03 2.24003196e-03 6.51448965e-04
  5.82313538e-03 2.02193856e-03 1.36656165e-02 1.33423805e-02
  2.93031335e-03 2.37888098e-03 1.16834044e-03 1.45864487e-03
  2.40692496e-03]
 [1.76604614e+01 5.09148788e+00 3.21387100e+01 1.04772749e+01
  2.27093697e-05 2.33969063e-01 5.61708212e-03 1.04411274e-01
  2.48956680e-03 3.61949205e-03 5.16298413e-03 3.13171744e-03
  1.33068562e-02 4.70572710e-03 7.36366212e-02 1.16786361e-03
  1.20503306e-02 5.90404868e-03 1.02835894e-02 9.59694386e-03
  1.31893158e-03 1.08939409e-03 1.69149041e-03 1.89021230e-03
  1.60312653e-03 7.20083714e-04 4.22447920e-04 8.49962234e-04
  1.00180507e-03 9.33247805e-03 3.54160368e-02 1.45792961e-02
  1.53104663e-02 4.59718704e-03 2.41011381e-03 3.08990479e-03
  1.27604604e-03 7.81571865e-03 5.90571761e-03 2.72104144e-03
  1.15668774e-03 3.21307778e-03 4.43127751e-03 3.46618891e-03
  1.17841065e-02 3.95533442e-03 1.35654211e-02 2.32464075e-03
  3.61999869e-03 2.52887607e-03 2.75796652e-03 2.89514661e-03
  1.74629688e-03 4.06622887e-04 2.52327323e-03 1.12643838e-03
  1.92564726e-03 6.55174255e-04 1.34199858e-03 1.54021382e-03
  1.13773346e-03 4.80687022e-02 1.48087740e-03 8.11588764e-03
  1.49470568e-03 1.02317333e-02 1.88371539e-03 4.33853269e-03
  1.91241503e-03 1.68550014e-03 4.42802906e-03 1.47724152e-03
  9.27144289e-03 1.14497542e-03 1.56822801e-03 5.32716513e-04
  4.33540344e-03 1.62771344e-03 1.28421187e-02 1.26112998e-02
  2.65741348e-03 1.83093548e-03 1.02338195e-03 1.08516216e-03
  2.55885720e-03]
 [2.72238884e+01 4.48930836e+00 2.94944496e+01 9.27263260e+00
  1.80304050e-05 2.83492923e-01 5.01766801e-03 7.84921646e-02
  2.48715281e-03 2.98362970e-03 4.10968065e-03 2.70104408e-03
  8.72173905e-03 3.63764167e-03 8.25126469e-02 1.07309222e-03
  8.88195634e-03 5.86298108e-03 8.03929567e-03 1.05574131e-02
  1.32068992e-03 1.01014972e-03 1.59677863e-03 1.87456608e-03
  1.52018666e-03 7.35491514e-04 4.14073467e-04 8.44627619e-04
  9.91374254e-04 1.03796721e-02 3.83321345e-02 1.69503689e-02
  2.26030648e-02 5.06106019e-03 2.09498405e-03 3.45471501e-03
  1.20970607e-03 1.08503699e-02 4.51272726e-03 3.49348783e-03
  1.27181411e-03 3.64288688e-03 4.11465764e-03 3.93858552e-03
  1.55347884e-02 4.52876091e-03 1.47328377e-02 3.02320719e-03
  4.89920378e-03 3.38208675e-03 2.28077173e-03 3.14998627e-03
  1.86228752e-03 3.93629074e-04 3.22023034e-03 1.23989582e-03
  2.05507874e-03 6.77198172e-04 1.43018365e-03 1.53753161e-03
  1.14315748e-03 3.79902720e-02 1.22106075e-03 7.96484947e-03
  1.25697255e-03 7.65931606e-03 1.54733658e-03 3.76150012e-03
  1.71059370e-03 1.74024701e-03 5.48851490e-03 1.45325065e-03
  1.15481019e-02 1.08850002e-03 1.46964192e-03 5.11646271e-04
  3.87257338e-03 1.47700310e-03 1.17338896e-02 1.51303709e-02
  2.99164653e-03 1.93822384e-03 1.04582310e-03 1.02144480e-03
  2.92631984e-03]
 [3.66491852e+01 4.00580788e+00 2.44058037e+01 8.47877884e+00
  1.65104866e-05 3.46155941e-01 5.56650758e-03 8.32470059e-02
  2.66841054e-03 1.98441744e-03 3.22920084e-03 1.42431259e-03
  7.66795874e-03 3.09702754e-03 8.70836079e-02 1.21712685e-03
  9.56043601e-03 8.86088610e-03 6.31219149e-03 1.29967630e-02
  1.04621053e-03 1.08695030e-03 1.52519345e-03 2.12588906e-03
  1.43560767e-03 8.20666552e-04 4.18543816e-04 8.93741846e-04
  9.94920731e-04 1.70823634e-02 3.86014879e-02 1.87908411e-02
  2.23011672e-02 4.29788232e-03 2.69007683e-03 2.86480784e-03
  1.33240223e-03 1.41561627e-02 5.33625484e-03 3.27405334e-03
  1.71196461e-03 2.65967846e-03 3.80074978e-03 3.60423326e-03
  1.40313804e-02 3.90371680e-03 1.18571222e-02 2.85723805e-03
  3.40411067e-03 2.96461582e-03 1.79082155e-03 3.34951282e-03
  1.70764327e-03 4.01854515e-04 3.54576111e-03 1.37251616e-03
  2.36696005e-03 7.91639090e-04 1.04457140e-03 1.56757236e-03
  1.03133917e-03 3.75977755e-02 7.74264336e-04 6.36377931e-03
  7.19457865e-04 3.18562984e-03 1.07103586e-03 2.23308802e-03
  9.39399004e-04 1.60571933e-03 5.06418943e-03 9.01013613e-04
  1.37810409e-02 5.78880310e-04 6.50137663e-04 3.72320414e-04
  1.55135989e-03 8.23557377e-04 8.80804658e-03 1.41242743e-02
  2.42707133e-03 1.48320198e-03 1.05234981e-03 8.93354416e-04
  2.14985013e-03]]
```

</details>

**推論できていそう！！！**
今回のゴール「ONNX形式のAIモデルをPythonで動かすための環境を作る」は達成できた！

---
次回(推論#04)は推論処理、出力の解釈、使い方の理解について書こうと思います！