專門 for yolov5轉換成.nef的指南
Hi,
我有向您們購買KL720,目前正打算轉換yolov5成.nef檔,並在KL720做推論,
我有開始在看您們官網的一些文件說明:
https://github.com/kneron/kneron-mmdetection/blob/main/docs_kneron/yolox_step_by_step.md
請問yolov5作為一個物件檢測最廣的模型之一,您們官網有沒有提供詳細的轉換教學 (專門 for yolov5)?
我查詢到的是yolox或是一些issues yolov5的發問,版本都比較舊,
yolov5目前更新到v7.0,請問您們有支援到v7.0嗎?
我有查詢到您們說不支持yolov5新版所使用的SiLU,必須改成LeakyReLU,請問目前有直接支援SiLU了嗎?
我需要一個專門 for yolov5轉換成.nef的指南,在最新的版本,謝謝您們
Tagged:
The discussion has been closed due to inactivity. To continue with the topic, please feel free to post a new discussion.
Comments
您們有些留言的網址都已經是404錯誤
Hi Jacky,
我們沒有yolo v5最新版本的轉換教學,不過舊的版本有這個範例: Object detection yolov5 - Document Center (kneron.com) ,可能會需要與這個新的toolchain manual一起做參考: 1. Toolchain Manual Overview - Document Center (kneron.com)
無論是任何版本的yolo,只要符合Kneron格式(用onnx2onnx與optimize之後, 3. Floating-Point Model Preparation - Document Center (kneron.com))的onnx模型中的operators是KL520,KL720,etc. 支援的,照理來說都會支援: Hardware Supported Operators - Document Center (kneron.com)
因onnx官方目前也不支援SiLU,所以會需要請您把它改成LeakyReLU喔。
也謝謝您指出,document center的內容會隨著更新而改變,這些是目前可以參考的連結:
(1) 1. Toolchain Manual Overview - Document Center (kneron.com)
(2) 關於Python API,document center現在把它分散成這幾個部分:
Model Conversion and Optimization and Config: 3. Floating-Point Model Preparation - Document Center (kneron.com)
Quantization to BIE: 4. Fixed-Point Model Generation - Document Center (kneron.com)
Batch compile to NEF: 5. Compilation - Document Center (kneron.com)
E2E: End to End Simulator - Document Center (kneron.com)
Hi Maria,
感謝您在過年前的回覆,非常詳細,我好好專研一下。
另外請教一下,關於.nef模型檔案有辦法使用程式或是軟體查看其架構嗎?
例如,.onnx模型可以使用Netron查看其架構。
Regards,
Jacky
Hi Jacky,
Toolchain的workspace/libs/compiler裡面有kneron_nef_utils,可以查看.nef模型的資訊: NEF Utils Guide - Document Center (kneron.com)
不過沒有辦法看到詳細的架構。
Hi Maria,
新年快樂,
請問,關於yolov5 to kneron.nef的流程,我可以理解為以下嗎? (4)與(5)可以分別對應到您的回覆嗎?
yolov5 training --> yolov5.pt to .onnx --> .onnx to simplify.onnx --> simplify.onnx to simplify_optimized.onnx --> simplify_optimized.onnx to .bie (4) --> .bie to .nef (5)
我目前做到simplify.onnx to simplify_optimized.onnx這一步,接下來.onnx往kneron有一點看不懂(4)與(5),請問這兩步需要去Toolchain Docker中下指令才能轉換成.bie並編譯為.nef嗎?
我有看到以下Repo:
https://github.com/kneron/kneron-mmdetection/blob/main/docs_kneron/yolox_step_by_step.md
Step 5: Convert onnx to NEF model for Kneron platform開始有類似yolov5的轉換教學,這邊開始我需要自己寫一個Python Script來做轉換.bie並編譯.nef嗎? 或是Toolchain Docker中有寫好的Python能直接使用? 或是我可以直接下什麼指令來做到呢? 謝謝
Step 5-5: Configure and load data necessary for ktc, and check if onnx is ok for toolchain中的:
請問20008, "0001", "720"是什麼參數? 如果我的目標是轉換yolov5,這邊我需要如何做修改?
我接著問,Object detection yolov5 - Document Center (kneron.com) 中提到的:
"python -m onnxsim input_onnx_model output_onnx_model"這個指令無法下(我是在我自己電腦上的yolov5),請問這裡是需要在您們的Toolchain Docker中的/workspace/ai_training/detection/yolov5/yolov5才能下嗎?
以及文中提到的Github Repo:
https://github.com/kneron/ONNX_Convertor/tree/master/optimizer_scripts,提到的pytorch2onnx.py找不到這支程式了
不好意思,我的問題有點多,因為目前在您們官網看到的Doc有點複雜,隨著程式更新,許多說明沒有跟著改到,麻煩您們再協助我轉換Custom yolov5n.pt to yolov5n.nef,謝謝
這是我目前做到的"simplify_optimized.onnx"
Hi Maria,
我參考這篇:
https://github.com/kneron/kneron-mmdetection/blob/main/docs_kneron/yolox_step_by_step.md
Step 5: Convert onnx to NEF model for Kneron platform
寫了一個Python Script (onnx_to_nef.py):
在Kneron Docker下轉成功(yolov5n自己訓練的模型):
我修改的部份(onnx_to_nef.py):
# yolov5只需要除以255
img_data = np.array(image.resize((640, 192), Image.BILINEAR)) / 255
img_data = img_data.transpose(2, 0 ,1)[None]
以及:
# fixed-point analysis
bie_model_path = km.analysis({"images": img_list})
目前轉換完成的.nef:
接著,要來研究如何驗證.nef的精度
Hi Jacky,
新年快樂,
關於yolov5 to kneron.nef的流程,(4)是Kneron格式的.onnx to .bie,(5)是.bie to .nef沒錯
是的,(3)的onnx to onnx, (4), 和(5)都需要在Toolchain Docker上去執行。您可以參照這裡的步驟,將python code的部分放在一個python script裡面(像是toolchain裡面的/workspace/examples/mobilenetv2/python_api_workflow.py)後全部一次執行: 1. Toolchain Manual Overview - Document Center (kneron.com)
Step 5-5中的
20008是model的ID,可以隨意輸入一個int,但請盡量用32769以上,因為32768以內的models是Kneron內部ID
0001是version,也可隨意輸入
720是platform,是您要使用model的裝置(KL720)
詳細說明在這裡:
如果目標是轉換成yolov5而您用的裝置是KL720,那就不用特別改
之前有提過Object detection yolov5是舊的文檔,現在的ONNX_Convertor裡面沒有pytorch2onnx,所以您可以用:
ktc.onnx_optimizer.torch_exported_onnx_flow
要轉換pt檔,需要經過這個步驟:
若已經有pytorch轉換成onnx檔的話,可以經過這個步驟,將pytorch形式的onnx檔轉換成Kneron用的onnx檔案:
詳細資料: 3. Floating-Point Model Preparation - Document Center (kneron.com)
onnxsim的話,請您依照這個網址安裝onnxsim: onnxsim · PyPI
Hi Maria,
非常感謝您的超詳細回覆,
模型轉換與參數設定上我已經讀完Document並了解了,
目前,已轉換與編譯.nef成功,
我正在嘗試,做單張圖的推論,
我已經安裝環境: sudo bash ./install_libusb.sh
~/kneron_plus_v2.2.0/kneron_plus/python/example_model_zoo/KL720KnModelZooGenericImageInferenceYolov5.py
目前,沒有出框,正在研究原因中!!!
Hi Maria,
我目前正在測試轉好的.nef能否在
kneron_plus_v2.2.0/kneron_plus/python/example_model_zoo/KL720KnModelZooGenericImageInferenceYolov5.py
上做推論並正確出框,
我原本使用自定義的車牌檢測模型(因為剛好是leaky relu),但發現推論結果畫上的框座標不正確,
我目前無法確認,轉換是否完全正確與模型是否完全符合Kneron,
因此我嘗試轉換yolov5n.pt (官方repo, v7.0)官方提供的模型,
我有通過Toolchain成功轉換成yolov5n.nef,如下檔:
但使用KL720KnModelZooGenericImageInferenceYolov5.py做推論時,
出現下述錯誤:
❯ python KL720KnModelZooGenericImageInferenceYolov5n_lpd.py
[Connect Device]
[warnning] The version of firmware (2.0.0.706) on the port ID 6 is not the corresponding version for this Kneron PLUS (2.2.0.1226).
- Success
[Set Device Timeout]
- Success
[Upload Model]
[_kp_allocate_ddr_memory] Error: The auto calculated result buffer count 0 is less than minimum result buffer count 1
Error: upload model failed, error = 'Error raised in function: load_model_from_file. Error code: 43. Description: ApiReturnCode.KP_ERROR_FIFOQ_SETTING_FAILED_43'
另外,我有下載您們githuib提供的best.pt(3年前),在下方連結網頁的最下方(720版),
https://doc.kneron.com/docs/#model_training/object_detection_yolov5/
經過轉換成.nef後,做推論時一樣會出現類似[_kp_allocate_ddr_memory]的問題。
Hi Maria,
我成功了😎
以下是我的煉丹過程🍓
(1) YOLOv5 Training
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt
# torch==2.1.2+cu121
# onnx==1.15.0
修改:
https://github.com/ultralytics/yolov5/blob/95ebf68f92196975e53ebc7e971d0130432ad107/models/common.py#L71
# default_act = nn.SiLU() # default activation
default_act = nn.LeakyReLU() # default activation
使訓練時以LeakyReLU做為激活函數來建立權重
python train.py --img 640 --epochs 100 --data coco128.yaml --weights yolov5n.pt
(2) Export to ONNX
修改export.py:
https://github.com/ultralytics/yolov5/blob/95ebf68f92196975e53ebc7e971d0130432ad107/export.py#L215
在此行下加入以下這行:
如下:
# 在yolov5做export時也順便做了simplify
python export.py --weights yolov5n-coco128_640_lkr_best_240220.pt --imgsz 640 --include onnx --opset 11 --simplify
(3) Convert to NEF Model
主要流程:
Optimize the onnx model --> Quantize the onnx model --> Compile to nef model
安裝Docker:
docker pull kneron/toolchain
Run Docker 並掛載需轉換的資料夾路徑:
docker run --rm -it -v ~/Kneron/ONNX_Convertor/optimizer_scripts:/data1 kneron/toolchain:latest
在Docker下執行onnx_to_nef.py:
coco128_train2017為yolov5訓練時所使用的dataset,作為量化用
123
Hi Maria,
經歷一番波折,我成功了,
使用自己訓練的yolov5n (LeakyReLU版),
經過轉換上修改一些關鍵程式,
最終通過Toolchain成功轉換成.nef。
接著修改推論程式的一些關鍵程式,
修改~/kneron_plus_v2.2.0/kneron_plus/python/example_model_zoo/KL720KnModelZooGenericImageInferenceYolov5.py,
以及修改~/kneron_plus_v2.2.0/kneron_plus/python/example/utils/ExamplePostProcess.py,
在720上,成功推論。
感謝Kneron的指教。
Hi Jacky,
不好意思,回覆變晚了!
關於kneron_flow (0216)的model,我們model team的同事在onnx檔發現post process的部分留在onnx裡面了。Post process高機率會包含KL720裡面的NPU不支援的operator,所以會有異常。我們建議您將onnx裡面的post process的部分(下圖,紅線以下)剪掉後再試試看
剪掉nodes的資訊: 3. Floating-Point Model Preparation - Document Center (kneron.com)
關於kneron_flow_0217的model,kp_allocate_ddr_memory error通常代表這個模型很大,導致不夠配置result buffer,就算是小的模型也會有可能發生。我們目前還在調查原因
Hi Maria,
感謝回覆,
昨天在您回我的時候我剛好也回了您,
我試成功了,超級感謝支援
Hi Jacky,
太好了,恭喜您轉換與推論成功!