YOLOv5 on KL720 toolchain

edited November 2021 in AI Model migration

嗨,大家好

Dongle PLUS的耐能範例nef物件偵測模型可以使用,不過因為我要訓練自己的類別,因此重新訓練yolov5s模型,也訓練成功,可以用GPU推論正常。

 

然後使用toolchain要量化成nef,可是發現卡在section 3 驗證模型層的部份!!!!!

 


現在KL720有支援YOLOv5嗎? 那有什麼層要替換嗎?! 我看toolchain kl720文件有支援concat,可是只有支援concate axis=-1,我用官方yolov5s訓出來的最後一個concat是axis=1,是這個原因嗎?


那我應該去怎麼修改呢?模型在附件。

=================================================

對了,我用的是YOLOv5s的6.0,因為最近改版,是這個原因嗎?

==================================================

Comments

  • Hello,

    有關KL720支援的op可以參考章節2.3的列表 http://doc.kneron.com/docs/#toolchain/manual/#2-toolchain-docker-overview

    看了你的onnx後發現了幾個問題可能要先修正

    1. 模型中含有許多不支援的ops,如resize, shape, unsqueeze等
    2. 該模型沒有做過onnx轉換,若為pytorch輸出的onnx,請先執行3.1.2 Pytorch to ONNX後再執行3.1.5 ONNX Optimization http://doc.kneron.com/docs/#toolchain/manual/#3-onnx-workflow
  • 是的,我就是參考章節2.3才發這篇文的,因為看到有支援,可是跳出錯誤。


    不好意思,我照片中的output2.onnx在這裡,我是使用toolchain裡面的指令

    python /workspace/scripts/convert_model.py onnx /data1/yolov5s.onnx /data1/output2.onnx

    這個跟你指的3.1.5是一樣的吧?!


    因此我的問題是onnx轉換後,還是會產生這個錯誤,再麻煩協助解決了,謝謝。

  • edited November 2021

    Hello,

    看了你的output2.onnx發現裡面還是有許多不支援的op,如resize, shape, reshape等,最後方一些不支援的部分因為沒有其他的神經網路op,所以可以整個砍掉,待推論結束後在cpu上補做即可,但模型中人有一些resize的部分可能先處理後才能夠執行toolchain後續的步驟

  • edited November 2021

    嗨,請問一下因為我是使用官方的yolov5s,不過我是看你們耐能文件上好像有支援yolov5s,所以看這狀況是不支援直接訓完的模型,還需要做修改嗎?!


    好奇你們之前遇到這狀況是怎解決?

    如resize, shape, reshape等都移除,然後推論結束後再到cpu上補做<========這流程是yolov5跑在耐能上固定都這樣做嗎?


    有可能因為我訓官方yolov5s是用--img 256 的方式去訓,這個關係影響的嗎?

    所以我需要用預設--img 640的方式重訓嗎?

  • Hi,

    耐能的範例yolov5s是有針對模型的的layer作調整的,有關yolov5s的模型,過去有相關的討論串可以提供給你參考,可以用用看裡面提到的模型版本,不過當時toolchain僅支援opset = 9,現在的話請一律輸出opset =11,否則toolchain執行時會有錯誤


  • edited November 2021

    我訓練的是YOLOv5s的6.0版本,你貼的這串討論串上面寫說只支援2.0的版本~~~~~?


    因此我要不重新訓練舊版2.0的YOLOv5s,要不就研究6.0怎麼應用在KL720?


    可是剛剛我發現2.0的預訓練模型已經移除了......


    那這樣我先訓練YOLOv5s的5.0看看,看看是否能在KL720上推論,不然6.0可能太新,還是有些東西要修。


  • 對了,上面提供過的6.0版本yolov5s的output2.onnx 模型,我有嘗試調整最後一層的concat axis=1 變成 concat axis =-1,

    然後現在錯誤變成這樣,好像還是像你說的reshape的關係,可是我要怎麼移除reshape層?

    是reshape後面這些直接移除嗎....?還是說reshape我要用什麼去替代它?


  • 是的,截圖中那些都要移除,相關工作在你收到三個輸出推論結果後再補做即可。

    也提醒,yolov5s中的v4.0~v6.0用的activation是silu,耐能的NPU都不支援,若要使用v4.0~v6.0的話需要先將所有activation改成leakyRelu才行。

  • edited November 2021


  • 請問按照tutorial.ipynb

    訓練出來 yolov5 on kl720 的模型出現明顯的類別判斷錯誤

    例如應該是汽車判斷成下一個類別摩托車

    可能是那個步驟的問題 ?

  • edited November 2021

    訓練結果如附檔

    謝謝!

  • edited November 2021

    跑原來的520流程

    除了出現 https://github.com/ultralytics/yolov5/issues/1552 這個issue

    https://github.com/ultralytics/yolov5/issues/1552#issuecomment-747832017

    解決問題之外

    訓練出來的yolov5模型

    也一樣出現類別偵測錯誤 (shift by 1)

  • Hello,

    偵測結果的類別會 shift by 1推測可能是類別index有偏移,建議可以再次確認類別表。

    或是試著將訓練的類別降至一種,確認相關設定無誤後再回到原本預期的類別數量


    另外也確認一下,所提供的結果照片是透過onnx直接推論,還是已經在KL720上實際執行的結果呢?

  • edited November 2021

    嗨 Ethon

    我是上傳在ubuntu 版本 toolchain docker 裡的ai_training 目錄 到 google drive 用 colab 模擬

    執行 /ai_training/detection/yolov5/yolov5/tutorial/tutorial.ipynb

    訓練完模型, 測試集圖片推論正常,類別正確

    透過onnx直接推論的(shift by 1)

    Thanks

  • edited November 2021

    @Ethon Lin 請問一下 我已經找到之前你們模型的yolov5版本,我從官網的教學裡面的yolov5下去訓的,資料夾內inference.py 測試模型推論正常。

    確實也可以經過docker toolchain量化完成,形成nef


    可是現在遇到一個狀況,經過toolchain量化出來的nef,使用dongle的KL720DemoCamAppYoloInference.py腳本推論會跑出這個錯誤。


  • 這是我toolchain量化的腳本


  • @Ethon Lin 這邊提供用toolchain轉換後的onnx跟nef

  • edited November 2021

    Hello,

    目前examples內的yolo範例主要是針對耐能所提供的yolo NEF做處理,包含model id, post process function 都有相當的限制

    若使用的是我們所提供的training script,建議改使用範例/kneron_plus/python/example_model_zoo/KL720KnModelZooGenericInferenceYolov5.py,也提醒,模型相關的參數如 model_id, image resolution, model input dimension, class list等相關參數需要自行針對修改


    另外,此篇文章主要是要討論模型轉換的部分,若有KL720推論相關的問題,歡迎到KL720專區開新的討論串。


  • edited November 2021

    已經可以在Dongle上跑了,可是遇到一個狀況,我確定只是單純用這範例訓出來的模型會這樣,用預設PLUS的模型不會這樣。

    問題就是,我用tutorial.ipynb的訓出來的模型執行到其中的這段之後

    !python ../exporting/yolov5_export.py --data ../yolov5/data/pretrained_paths_720.yaml

    然後會產生一個yolov5s.pt檔,之後再下

    !python inference.py --data data/pretrained_paths_720.yaml --conf_thres 0.6 --img-path tutorial/demo/yolo_demo.jpg --save-path tutorial/demo/out.jpg


    產生出來的圖片框框都會像是沒經過NMS耶....................同一個物件有兩三個框框................

    我以下圖片是跑在Dongle上,也是這樣,可是我用Dongle預設的nef,不會有這種情況,請問為啥這版訓出來的模型會有這種狀況


    另外我的類別只想要三種。

    !python yolov5_generate_npy.py --input-h 256 --input-w 256

    所以也有可能是這行的原因嗎? 那我應該要怎麼改 yolov5_generate_npy.py 檔案呢?

    麻煩你們協助了,真的謝謝。

  • 建議可以先確認訓練過程中的log數據皆正常合理,

    如果出現不合理的log數據, 可以根據log數據中的發現, 對相應的訓練參數做嘗試與修改(加大訓練數據, 修正數據, 加大epoch ... etc).

  • edited November 2021

    Hi

    我去官網下載教育版的yolov5 按照裡面的tutorial步驟來training 720

    產出yolov5s-coco128.pt

    測試集 類別正常

    轉換yolov5s-coco128.onnx

    簡化yolov5s-coco128_simply.onnx

    onnx模型推論 類別正常

    Thanks~

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