模型訓練轉檔

你好,我們使用Colab的tutorial來進行訓練YOLOv5的模型,架構的yaml檔案使用yolov5s-noupsample.yaml以及在kneron github->model zoo上找到相對應的best.pt來進行訓練,訓練出的pt檔辨識結果還不錯,但轉換到耐能的模型上時,辨識度明顯下降,可以幫忙測試看看是否是轉檔的問題抑或是訓練的問題嗎?

以下連結式pt與kneron_onnx檔的辨識結果

第二個連結為model_paths_520_coco128.yaml

還望指教

Comments

  • 順便附上我們的pt和simplify_convert_onnx,或許能幫我們轉檔看看,謝謝

  • @sugar

    Hi sugar,

    如果只有照片與 model 不太好辨認出是轉檔的問題還是訓練的問題,是否可以提供您的辨識 Scripts。

    .pt 檔您可能需要提供的是 model_paths_520_coco128.yaml 內的 yolov5s-noupsample-coco128.pt。

    轉檔問題您可以參考:http://doc.kneron.com/docs/#toolchain/manual/

  • edited July 2022

    我們後來根據kneron document中轉檔的順序進行轉檔,跑到IPevaluate時都沒有遇到warning,模型中的reshape也由editor.py修剪完成,也重新由onnx2onnx跑過,但在E2E的部分卻出現以下錯誤,不太了解到底要怎麼做preprocess圖片才能順利讀入,煩請指教。

    在E2E Simulator Check (Floating Point)的部分我們遇到了input_image channel 的問題

    e2e.py的內容是參照document提供的,如下圖,resize改成(640,480)和我們模型、照片的路徑

    以下是我們的onnx(best_cut_opt.onnx)和要simulator的圖片(rs00093.jpg),想請你幫我們看看

    還有在下一步的Quantization遇到了以下問題,我們要量化的圖片為100張,想請教如何解決

    電腦硬體為

    gpu: titan rtx

    ram: 32GB

    system: ubuntu20.04

    開啟docker時也並沒有特別限制記憶體以及CPU

  • 補充:換了一個作業系統也不行


  • @sugar

    Hi sugar,

    您使用的 Command Line Script Tools FpAnalyser 跑量化,因為這個方法較舊不太推薦,建議您使用 Python API 去做整個 Kneron Tool Chain 的流程,

    您可以參考 : 

    (1) http://doc.kneron.com/docs/#toolchain/manual/

    (2) http://doc.kneron.com/docs/#toolchain/python_api/


    在 E2E Simulator Check (Floating Point) 的部分遇到了 Input dimensions do not match ,可能原因是您的 input data shape 不符合您的 model input shape,您可以參考連結(1) 的 3.3 E2E Simulator Check (Floating Point)。

    在 Quantization 遇到 not enough memory 您可以嘗試使用 python api analysis(input_mapping, output_bie = None, threads = 4, skip_verify=True) 去做量化,您可以參考連結 (1) 的 4.1 Quantization 與連結 (2) 的 2.2 Model Analysis,把 skip_verify 設成 True 將可以節省很多記憶體,您可以調低 threads 看看。

  • Andy

    謝謝你的回覆

    補充:我們是以yolo官方的程式碼(train.py)+kneron的yolov5s-noupsample.yaml+requirement.txt+best.pt(from kneron model zoo)所訓練出的模型,其中,原本將你們所提供的yolo colab轉檔跑完後雖可以成功轉為nef並放置720上運作,但precision卻不甚理想(差很多),上一個discussion中,你有回覆說使用yolo官方github的export工具後再使用toolchain進行轉檔,因此轉檔後目前我們進行了切除不需要的node,onnx2onnx的處理,以及ip evaluate,目前到這裡都沒有warning 以及錯誤發生。

    我們有閱讀過3.3以及F&Q的部分,但是就如上面所附的圖案,經過你們提供的normalization並沒有將input data shape與model input shape一致化,我們的model input shape為1,3,480,640所以我們將resize改為480,640而圖片本身即為RGB,你們所提供的程式中也有再次確定將圖片轉為channel3而最後batch的部分我並不瞭解要如何修正才能讓input data shape與model input shape 一致,請教一下若要將此圖片轉為1 3 480 640 需要什麼額外步驟!

    p.s.我們所使用的fpanalyser就算將thread設為1也無法跑完100張,不知到底是否與docker還是與程式相關..

    sugar

  • edited July 2022

    更新:

    成功將模型轉換為nef了,上次的問題出在圖片resize上,重新把docker開啟之後就可以轉了,應該是之前錯誤的Resize影響到後續的轉換。但現在的問題是就算用你們所提供的toolchain轉換的nef(之前是用tool script中的fpanalyser720轉),兩者轉換出的nef模型在最後的辨識效果都與最初訓練的pt模型相差甚遠


    1.最初的pt

    2.你們所提供的yolo colab轉出的onnx+使用fpAnalyser轉出的nef

    3.使用yolo官方提供的export.py轉出的onnx+經由kneron toolchain的editor.py砍過的onnx以及最後轉出的nef

    請問模型中是否被edit過多的node或是模型中哪個部份的問題使我們轉出的模型precision相差如此大

  • @sugar

    Hi sugar,

    影響模型推論 precision 的地方非常廣泛,如果模型尾端有被 edit,如果夠瞭解 model input output,基本上只要做 postprocess 就不影響 inference 的結果。

    通常 模型(.onnx) 與 模型(.nef) 有推論效果差異很大的話,我認為比較有可能是受到量化影響

    量化的部分

    1. 用來做量化分析的圖片是否皆與訓練模型或是推論場景有關。

    2. 圖庫中應盡可能的涵蓋各種使用場景的圖片。

    3. 增加量化用的圖片。

    但是您是 模型(.pt) 與 模型(.nef) 推論效果差異很大,是不同的 case,如果可以的話,您是否可以提供您的 inference scrtips 讓我復現出問題看看。

    這裡也不建議使用官網上 Repo 的 model 直接串接 Kneron inference,不然可能就會有推論結果不符合預期的問題,您可能要自行修改,Kneron inference scrtips。

  • @Andy Hsieh

    Andy,

    Thank you for the reply,

    我們還未對editor.py處理過的onnx檔進行inference的測試,測試後再進行回復,另外在量化的部分,經過對於系統的監控,發現CPU似乎扛不住analysis 100張(cpu為xeon w2123,dram 32gb),RAM沒有溢出的情況,docker並沒有限制CPU以及memory的使用,但是卻連100張都跑不完,論壇上也沒有找到類似的問題? 有測試過降為v0.16.0並沒有緩解這個情況,請問是CPU過於舊的問題嗎 ?

    inference script是直接使用kneron Inference (720)來inference轉出的NEF檔

    至於pt的inference則是直接使用yolo github中detect.py來測試


    p.s. 官網repo 的 model皆有使用toolchain轉換過才丟進kneron inference中。

    andrew

  • @Andy Hsieh

    經過inference的測試,模型誤差大的原因應在editor.py修剪node時砍到過多的node,但是在經過一次修改後反而連ipevalute都跑不過(segmentation fault)

    以下附件best.onnx是經過inference後確定辨識度高的onnx(經過onnxconverter處理過)

    best_cut_opt.onnx是修剪過node的onnx,但無法跑過ipEvaluate,想請你幫我看一下是不是有node沒有刪乾淨導致segmentation fault 謝謝!


    andrew

  • @andrew

    Hi andrew,

    您好,出現 not enough memory 的 error message 與您的 CPU 新舊程度應該是沒有關係的,比較有可能的是您的 RAM 需要加大,依照我個人的經驗,您也能看看您的硬碟儲存空間是否是快滿了,這也可能出現此 Error message。

    至於您描述的 kneron Inference (720) 指的是哪個 Scripts 呢?然後您用的 Kneron plus 是哪個版本的呢?

    就我目前的理解,因為 Kneron inference demo 是針對 Kneron Repo 下去寫的,所以您拿官網上 Repo 的 model 直接使用 Kneron inference demo 去呈現推論結果就很可能有不符合預期的問題出現,所以會建議您根據 model 的 ouput 自行修改 Kneron inference scrtips。


    向您說明一下,您的 model 有兩個問題點,看了您的 model 之後,您應該是針對這個 model 的 Reshape operators 都去除了,可是這會影響到 model。

    (1) 讓 model node 與 node 之間的值消失了 (如圖),Kneron Tool Chain 會需要用到這個值。

    (2) 假設 Kneron Tool Chain 不需要用到這個值,可以順利使用 Kneron Tool Chain 順利轉出 nef,但是最後這個 model 的 behavior 也會因為您去除了 Reshape operators 而變的不一樣,所以這樣 edit 您的 model 是不可行的 。

  • edited July 2022

    hi Andy,

    謝謝你的回覆,

    那正如上面所附的best.onnx,是否要將concat以下的reshape都修掉,因為在跑best.onnx時,他只有出現"CSim only support CPU node in the end of model and write data to output buffer." 的error。我的理解是他只接受720支援的node,可是檢查後應該所有的node都有支援才對.可以麻煩你幫我們看一下best.onnx哪裡要cut才能順利繼續嗎?是否是從最後一個conv 的 node 開始cut?

  • 補充:今天在測試的時候發現在跑完onnx2onnx_flow之後eliminate tail就算設成true輸出出來的模型reshape 以及transpose 並沒有被eliminate掉耶 這是正常的嗎

  • edited July 2022

    @andrew

    Hi andrew,

    您提供的 best.onnx 建議您可以考慮切除紅線以下的地方,這樣應該就能順利繼續,但是您須注意一下,紅線以下被切除的地方需考慮放到 post process 上並在 Host 端幫您執行,不然 inference 結果也是會不如預期的。

    您跑 onnx2onnx_flow 將 eliminate_tail 設成 true 輸出出來的模型 reshape 以及 transpose 並沒有被 eliminate 掉這是正常的,因為 eliminate_tail 這個 Flag 的主要功能,就是在講從最後面的 output 往上開始 check 是否有不支援的 operators,如果有不支援的繼續往上 cut 並繼續 check,但如果遇到支援的話,就會停止。

    也就是說,我們可以看到您的 ouput 上一個 operator 為 Concat 這是在 KL520 跟 KL720 都支援的,那 eliminate 就停止了。

  • edited July 2022

    Hi Andy,

    非常感謝你的回答

    檔案有轉換成功! 謝謝你!

    但是對於post process的部分我不是很了解,我瞭解將reshape transpose bn slice等node刪除會造成結果不如預期,但是我在toolchain manual上找不太到範例可以作為我的修改基礎,也不太清楚post process到底該怎麼做,如果可以的話能不能提供一些關於post processing 該怎麼下手的資料呢?

    andrew

  • edited July 2022

    @andrew

    Hi andrew,

    關於 post process 的部分您可以參考: http://doc.kneron.com/docs/#plus_python/api_migration/chapter/api_migration/#3-option-replace-built-in-yolo-post-process-function

    理論上來說您去除了紅線以下的地方,您這個 model 的 inference output 應該會有三個 (如果您是 KL520,您可以參考 kneron_plus_v1.3.0 內的 python/example/KL520DemoGenericInference.py 與 python/example/KL520DemoGenericInferencePostYolo.py),所以您必須將那三個 output 的 feature map 做 post-process。

    如果您是使用 Kneron 提供的 yolo example 下去準備 datasets 、 training 還有 export 出 model 的話, Kneron 有提供 Yolov5 的 post process (python api: post_process_tiny_yolo_v3、post_process_yolo_v5),不過因為您是使用 ultralytics/yolov5 public 所以無法直接使用但可供參考。

    至於如何 post process 的部分您可能需自行上網查找了,真不好意思,但這裡能提供給您網址:https://community.ultralytics.com/c/yolov5/5,您或許可以在詢問或在這裡找到您要的答案。

  • 好的! 謝謝你的幫助,我會嘗試看看

  • @andrew

    您好 !! 不好意思打擾了 我在做yolov5時和你一樣因需求將下半部刪除掉

    但 post process 的地方不是很懂且還無法成功

    想請問您後來有嘗試成功嗎 若成功是用什麼方法?

  • @Su

    Hi, 我們最後是使用奈能之前所提供的yolov5模型來訓練,可以看到yolov5s.yaml以及yolov5s-noupsample.yaml,這個是奈能有進行刪減的yolo版本,若是用yolov5官網上的架構的話有很多節點會不支援,導致後面麻煩一堆。建議可以使用附件中的模型,pretrained model可以從這裡選擇:https://github.com/kneron/Model_Zoo/tree/main/detection/yolov5 ,沒記錯的話520只支援noupsample,720兩個都有。最後轉檔時可以使用:https://doc.kneron.com/docs/#toolchain/toolchain_webgui/ 比較好操作,以上都是之前成功過的印象過程,若是有其他技術上的問題可能還是問一下 Ethon 跟 Andy比較好,希望有幫助到你:)

  • @andrew

    好的 感謝您的解答 !! 我之後再來嘗試看看😊

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