0、寫在最前:
此篇文章針對yolov5的6.0版本,4.0和5.0版本請看前面三篇的修改,
此篇除了第4點修改檢測的代碼修改,其他代碼和第三篇中的一樣!
目錄
0、寫在最前:
一、yolov5 6.0版本新增對opencv的支持
二、匯出onnx模型
三、查看網路結構,
四、修改檢測代碼
一、yolov5 6.0版本新增對opencv的支持
最新的專案地址可以看下https://github.com/ultralytics/yolov5
二、匯出onnx模型
匯出onnx的時候需要修改引數,將opset默認值改成12,原來的默認值為13,我測驗了opencv4.5.0和4.5.2兩個版本,opencv都報錯了,將之改成12即可讀取,
在export.py中修改下引數(用命令列匯出的請加上--opset 12,請注意不要帶上dynamic引數,opencv對動態輸入支持做的不好,應該是需要opencv4.5.3以上的版本,并且需要TBB支持才行來著):

三、查看網路結構,
使用netron(www.netron.app)查看下修改onnx版本之后的網路模型,可以看到現在模型有4個輸出1,output是另外三個輸出的總輸出,而另外三個就是之前模型的三個輸出口(P3,P4,P5),所以我們只需要遍歷output這個輸出口就可以(另外三個輸出口是可以單獨遍歷獲取資料,但是效果并不好,所以不推薦),

而輸出口的形狀由之前的[25200,85]變成了[1,25200,85],因為是一個batch size,所以在c++下面使用指標遍歷的話可以不考慮這多出來的一個維度(c++下Mat.data指標會將三維和二維按行優先展開成一維指標,所以影響不大),
四、修改檢測代碼
按照我前面三篇修改過的方法來說,應為新版本不需要再修改原來的common.py和yolo.py的代碼,所以需要看下原來在yolo.py中被修改的部分做了些什么,然后需要對c++原始碼進行一些修改,
之前在models/yolo.py中的Detect類中的修改,會將紅色框的部分注釋掉,所以在c++的代碼中這部分需要我們自己去計算,而現在不需要修改了,就要將這部分自己的計算去掉,

由于python的模型已經做了sigmoid的轉換了,所以c++下面這部分去掉就可以了,按下面的位置修改下,原來的代碼就可以使用了(注釋部分的代碼是原來的代碼),另外的代碼請看
2021.09.02更新說明 c++下使用opencv部署yolov5模型 (三)_愛晚乏客游的博客-CSDN博客

測驗下程式結果:

完美運行!
總的來說,6.0版本完美的解決了opencv下讀取onnx模型的痛點,不需要繁瑣的去修改原始碼,將無法讀取的網路層替換掉,可以很輕松的部署了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/345589.html
標籤:其他
上一篇:使用paddle-lite在Arm開發板上部署paddleOCR
下一篇:OpenCV-Sobel邊緣檢測
