---
# System prepended metadata

title: Kneron Toolchain 轉檔操作
tags: [kneron]

---

# Kneron Toolchain 轉檔操作

###### tags: `kneron`

## 簡介

在 Windows 10 上，將 yolov3-tiny.onnx 轉換為 Kneron AI dongle (耐能AI加速棒)可用的格式。

使用的耐能AI加速棒版本為 KL520。

使用的 Kneron Toolchain Docker Image 版本為 v0.14.1
![](https://i.imgur.com/mClbD3d.png)


onnx 檔案來源：[onnx-yolov3](https://github.com/htshinichi/onnx-yolov3)

## 操作流程條列

1. 安裝 docker
2. 取得最新的 toolchain 映像檔
3. 啟動 toolchain 容器 Container
4. 做 ONNX to ONNX (ONNX optimization) 轉換(優化 onnx 檔案)
5. 執行 FpAnalyser and Batch-Compile 取得轉換後的模型檔案

## 操作步驟

可參考：[Kneron Linux Toolchain Manual](http://doc.kneron.com/docs/#toolchain/manual/)
已備份到：[archive.today](https://archive.is/doc.kneron.com)

### 安裝 docker

可參考：[Install Docker Desktop on Windows](https://docs.docker.com/docker-for-windows/install/)

### 取得最新的 toolchain 映像檔

執行指令：
```
docker pull kneron/toolchain:latest
```
取得最新的 toolchain 映像檔。

### 啟動 toolchain 容器 Container

參考指令：
```
docker run --rm -it -v /mnt/docker:/docker_mount kneron/toolchain:latest
```

記得把 /mnt/docker 換成 yolov3-tiny.onnx 模型檔案所在的資料夾，以方便轉檔時直接取用，建議額外創建一個資料夾，放置 yolov3-tiny.onnx 模型檔案。

在 win 10 ，掛載資料夾時，路徑要做一些修改。
例如：yolov3-tiny.onnx 模型檔案所在的資料夾為`C:\Users\p2330\Desktop\yolov3_onnx` 要改成 `/c/Users/p2330/Desktop/yolov3_onnx`。
`C:` 改成 `/c` ， `\` 改成 `/` 。

修改指令如下：
```
docker run --rm -it -v /c/Users/p2330/Desktop/yolov3_onnx:/docker_mount kneron/toolchain:latest
```
執行結果如下：
![](https://i.imgur.com/UmhjSZa.png)
如下圖，切換到 /docker_mount 目錄，可以看到掛載的資料夾內有 yolov3-tiny.onnx 模型檔案：
![](https://i.imgur.com/6ulPm9J.png)


### 做 ONNX to ONNX (ONNX optimization) 轉換

可參考：[6 ONNX to ONNX (ONNX optimization)](http://doc.kneron.com/docs/#toolchain/converters/#6-onnx-to-onnx-onnx-optimization)

複製 yolov3-tiny.onnx 到 data1 資料夾。
![](https://i.imgur.com/UwCTjdn.png)

執行指令：
```
python /workspace/libs/ONNX_Convertor/optimizer_scripts/onnx2onnx.py yolov3-tiny.onnx -o yolov3-tiny_opt.onnx --add-bn -t
```

會報錯：RuntimeError: Only support opset 11, but got 9
![](https://i.imgur.com/HojtEHc.png)

解決方式：因為目前支援的 onnx Opset version 為 11，但 yolov3-tiny.onnx 的 Opset version 為 9，所以需要更新 ONNX version。

可參考：[8 ONNX Updater](http://doc.kneron.com/docs/#toolchain/converters/#8-onnx-updater)

![](https://i.imgur.com/W2sz8IS.png)

執行指令：
```
python /workspace/libs/ONNX_Convertor/optimizer_scripts/onnx1_4to1_6.py yolov3-tiny.onnx yolov3-tiny_up.onnx
```

得到 yolov3-tiny_up.onnx 更新過的 onnx 檔案。
![](https://i.imgur.com/MJDHz0r.png)

執行指令：
```
python /workspace/libs/ONNX_Convertor/optimizer_scripts/onnx2onnx.py yolov3-tiny_up.onnx -o yolov3-tiny_opt.onnx --add-bn -t
```
可以得到 yolov3-tiny_opt.onnx 優化過的 onnx 檔案。
![](https://i.imgur.com/lNfVFL1.png)

### 執行 FpAnalyser and Batch-Compile

可參考：[3. Toolchain Scripts Usage](http://doc.kneron.com/docs/#toolchain/manual/#3-toolchain-scripts-usage) 的 3.2 跟 3.6 小節

#### 配置 input_params.json 檔案

input_params.json 設定如下：

```json=
{
    "model_info": {
        "input_onnx_file": "/data1/yolov3-tiny_opt.onnx",
        "model_inputs": [
            {
                "model_input_name": "input",
                "input_image_folder": "/data1/imgs"
            }
        ]
    },
    "preprocess": {
        "img_preprocess_method": "yolo",
        "img_channel": "RGB",
        "radix": 7,
        "keep_aspect_ratio": true,
        "pad_mode": 1,
        "p_crop": {
            "crop_x": 0,
            "crop_y": 0,
            "crop_w": 0,
            "crop_h": 0
        }
    }
}
```

imgs 的圖片可以到 [darknet/data/](https://github.com/pjreddie/darknet/tree/master/data) 下載 .jpg 圖檔，作為轉檔時的圖片輸入。
![](https://i.imgur.com/Wjs5hGX.png)

記得把 imgs 放在 /data1 底下。

#### 配置 batch_input_params.json 檔案

batch_input_params.json 設定如下：

```json=
{
    "encryption": {
        "whether_encryption": false,
        "encryption mode": 1,
        "encryption_key": "0x12345678",
        "key_file": "",
        "encryption_efuse_key": "0x12345678"
    },
    "models": [
        {
            "id": 123,
            "version": "1",
            "path": "/data1/yolov3-tiny_opt.onnx",
            "input_params": "/data1/input_params.json"
        }
    ]
}
```

models 裡面的 id 跟 version 可以依照使用情況自由調整。

做完以上操作後，目錄結構如下圖：
![](https://i.imgur.com/NkaK9Ur.png)


#### 取得轉換後的模型檔案

在 /data1 執行指令：
```
python /workspace/scripts/fpAnalyserBatchCompile_520.py -t 8
```
![](https://i.imgur.com/jGmt56V.png)

會產生 batch_compile 跟 fpAnalyser 資料夾。

![](https://i.imgur.com/NM1loGN.png)

轉換後的模型檔案為 batch_compile 資料夾內的 models_520.nef 。
![](https://i.imgur.com/naVs0Cu.png)

可以將 models_520.nef 複製出來在 [Kneron Host Lib](https://github.com/kneron/host_lib) 官方範例上使用。

![](https://i.imgur.com/Rm6dFCE.png)
