# 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)