專門 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:

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中的:

    km = ktc.ModelConfig(20008, "0001", "720", onnx_model=m)
    

    請問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的精度

  • edited February 16

    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中的

    1. km = ktc.ModelConfig(20008, "0001", "720", onnx_model=m)

    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

    在此行下加入以下這行:

    onnx.utils.extract_model(f, f, ["images"], ["/model.24/m.0/Conv_output_0", "/model.24/m.1/Conv_output_0", "/model.24/m.2/Conv_output_0"])
    


    如下:

        # Simplify
        if simplify:
            try:
                cuda = torch.cuda.is_available()
                check_requirements(("onnxruntime-gpu" if cuda else "onnxruntime", "onnx-simplifier>=0.4.1"))
                import onnxsim
    
    
                LOGGER.info(f"{prefix} simplifying with onnx-simplifier {onnxsim.__version__}...")
                model_onnx, check = onnxsim.simplify(model_onnx)
                assert check, "assert check failed"
                onnx.save(model_onnx, f)
                onnx.utils.extract_model(f, f, ["images"], ["/model.24/m.0/Conv_output_0", "/model.24/m.1/Conv_output_0", "/model.24/m.2/Conv_output_0"])
            except Exception as e:
                LOGGER.info(f"{prefix} simplifier failure: {e}")
        return f, model_onnx
    
    


    # 在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:

    import ktc
    import numpy as np
    import os
    from os import walk
    import onnx
    from PIL import Image
    
    # optimize
    onnx_path = 'yolov5n-coco128_640x640_lkr_best_240220.onnx'
    m = onnx.load(onnx_path)
    m = ktc.onnx_optimizer.onnx2onnx_flow(m)
    onnx.save(m,'yolov5n-coco128_640x640_lkr_best_240220_kneron.onnx')
    
    
    # npu (only) performance simulation
    km = ktc.ModelConfig(20008, "0001", "720", onnx_model=m)
    eval_result = km.evaluate()
    print("\nNpu performance evaluation result:\n" + str(eval_result))
    
    
    img_list = []
    for (dirpath, dirnames, filenames) in walk("coco128_train2017"):
        for f in filenames:
            fullpath = os.path.join(dirpath, f)
            
            image = Image.open(fullpath)
            image = image.convert("RGB")
            image = Image.fromarray(np.array(image)[...,::-1])
            img_data = np.array(image.resize((640, 640), Image.BILINEAR)) / 255
            img_data = img_data.transpose(2, 0 ,1)[None]
            print(fullpath)
            img_list.append(img_data)
    
    
    # fixed-point analysis
    bie_model_path = km.analysis({"images": img_list})
    print("\nFixed-point analysis done. Saved bie model to '" + str(bie_model_path) + "'")
    
    
    # compile
    nef_model_path = ktc.compile([km])
    print("\nCompile done. Saved Nef file to '" + str(nef_model_path) + "'")
    


    coco128_train2017為yolov5訓練時所使用的dataset,作為量化用

    123

  • edited February 20

    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,

    太好了,恭喜您轉換與推論成功!

The discussion has been closed due to inactivity. To continue with the topic, please feel free to post a new discussion.