0、寫在最前:
----2022.10.10 更新yolov5-seg實例分割模型:
2022.09.29更新 c++下面使用opencv部署yolov5和yolov7實例分割模型(六)_愛晚乏客游的博客-CSDN博客
?-----2022.07.25 更新了下yolov7的部署,有需要的自取
2022.07.25 C++下使用opencv部署yolov7模型(五)_愛晚乏客游的博客-CSDN博客
此篇文章針對yolov5的6.0版本,4.0和5.0版本請看前面三篇的修改。
2022.10.13 更新
有些人使用的是最新的torch1.12.x版本,在導(dǎo)出onnx的時候需要將do_constant_folding=True,這句換成false,否者dnn讀取不了onnx文件,而onnxrutime可以,具體原因未知。
torch.onnx.export(
model.cpu() if dynamic else model, # --dynamic only compatible with cpu
im.cpu() if dynamic else im,
f,
verbose=False,
opset_version=opset,
do_constant_folding=False,
input_names=['images'],
output_names=output_names,
dynamic_axes=dynamic or None)
2022.02.18更新:
最新版的代碼在windows下面導(dǎo)出onnx可能會失敗,windows10下面請保證pandas>=1.4.0,或者注釋掉export.py中的import pandas as pd(pandas的功能暫時未在export.py使用,win10下直接import版本低于1.4.0其他都不干,導(dǎo)出onnx就會失敗,原因未知)
2021.12.6更新,增加攝像頭和視頻檢測,需要將drawPred()中的inshow和waitkey注釋掉。
VideoCapture cap(0); //視頻檢測將0改成視頻地址
while (true) {
Mat fram;
cap >> fram;
vector<Output> result;
if (test.Detect(fram, net, result))
test.drawPred(fram, result, color);
imshow("detect output", fram);
if (waitKey(2)==27) break; //esc退出
}
cap.release();
destroyAllWindows();
2021.11.04更新,對于圖片長寬比過大導(dǎo)致目標(biāo)檢測失敗修改,本來想偷懶直接放個圖片的。
此篇除了第4點修改檢測的代碼修改,其他代碼和第三篇中的一樣!
目錄
0、寫在最前:
一、yolov5 6.0版本新增對opencv的支持
二、導(dǎo)出onnx模型
三、查看網(wǎng)絡(luò)結(jié)構(gòu)。
四、修改檢測代碼
一、yolov5 6.0版本新增對opencv的支持
最新的項目地址可以看下https://github.com/ultralytics/yolov5
二、導(dǎo)出onnx模型
導(dǎo)出onnx的時候需要修改參數(shù),將opset默認(rèn)值改成12,原來的默認(rèn)值為13,我測試了opencv4.5.0和4.5.2兩個版本,opencv都報錯了,將之改成12即可讀取。
在export.py中修改下參數(shù)(用命令行導(dǎo)出的請加上--opset 12,請注意不要帶上dynamic參數(shù),opencv對動態(tài)輸入支持做的不好,應(yīng)該是需要opencv4.5.3以上的版本,并且需要TBB支持才行來著):
三、查看網(wǎng)絡(luò)結(jié)構(gòu)。
使用netron(www.netron.app)查看下修改onnx版本之后的網(wǎng)絡(luò)模型,可以看到現(xiàn)在模型有4個輸出1,output是另外三個輸出的總輸出,而另外三個就是之前模型的三個輸出口(P3,P4,P5)。所以我們只需要遍歷output這個輸出口就可以(另外三個輸出口是可以單獨遍歷獲取數(shù)據(jù),如果你只需要小目標(biāo),就可以只遍歷P3輸出口,中目標(biāo)為P4輸出口,而P5位大目標(biāo),但是并不建議這么做就是了,因為大中小并沒有具體的區(qū)分,只是一個概念性的,實際上小目標(biāo)也有可能在P4口被檢測出來,而且概率比P3口還高也是有可能的。所以如果只需要檢測小目標(biāo),還不如直接修改網(wǎng)絡(luò)只要P3出口來的好一些)。
?而輸出口的形狀由之前的[25200,85]變成了[1,25200,85],因為是一個batch size,所以在c++下面使用指針遍歷的話可以不考慮這多出來的一個維度(c++下Mat.data指針會將三維和二維按行優(yōu)先展開成一維指針,所以影響不大)。
四、修改檢測代碼
按照我前面三篇修改過的方法來說,應(yīng)為新版本不需要再修改原來的common.py和yolo.py的代碼,所以需要看下原來在yolo.py中被修改的部分做了些什么,然后需要對c++源碼進行一些修改。
之前在models/yolo.py中的Detect類中的修改,會將紅色框的部分注釋掉,所以在c++的代碼中這部分需要我們自己去計算,而現(xiàn)在不需要修改了,就要將這部分自己的計算去掉。
由于python的模型已經(jīng)做了sigmoid的轉(zhuǎn)換了,所以c++下面這部分去掉就可以了。按下面的位置修改下,原來的代碼就可以使用了(注釋部分的代碼是原來的代碼)。另外的代碼請看
2021.09.02更新說明 c++下使用opencv部署yolov5模型 (三)_愛晚乏客游的博客-CSDN博客
?測試下程序結(jié)果:
完美運行!
總的來說,6.0版本完美的解決了opencv下讀取onnx模型的痛點,不需要繁瑣的去修改源碼,將無法讀取的網(wǎng)絡(luò)層替換掉,可以很輕松的部署了。
貼個github鏈接吧,聊勝于無,想偷懶的同學(xué)可以直接下載文件了,不需要從上一篇復(fù)制了
https://github.com/UNeedCryDear/yolov5-opencv-dnn-cpphttps://github.com/UNeedCryDear/yolov5-opencv-dnn-cpp
onnx測試模型:yolov5s.onnx-深度學(xué)習(xí)文檔類資源-CSDN下載文章來源:http://www.zghlxwxcb.cn/news/detail-441635.html
目前是免費的,有需要收費了說下我重新改下文章來源地址http://www.zghlxwxcb.cn/news/detail-441635.html
到了這里,關(guān)于2021.11.01 c++下 opencv部署yolov5-6.0版本 (四)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!