簡單說明
分別使用OpenCV、ONNXRuntime部署YOLOV7目標檢測,一共包含12個onnx模型,依然是包含C++和Python兩個版本的程序。 編寫這套YOLOV7的程序,跟此前編寫的YOLOV6的程序,大部分源碼是相同的,區別僅僅在于圖片預處理的過程不一樣。YOLOV7的圖片預處理是BGR2RGB+不保持高寬比的resize+除以255 由于onnx文件太多,無法直接上傳到倉庫里,需要從百度云盤下載,
下載完成后把models目錄放在主程序文件的目錄內,編譯運行 使用opencv部署的程序,有一個待優化的問題。onnxruntime讀取.onnx文件可以獲得輸入張量的形狀信息, 但是opencv的dnn模塊讀取.onnx文件無法獲得輸入張量的形狀信息,目前是根據.onnx文件的名稱來解析字符串獲得輸入張量的高度和寬度的。
YOLOV7的訓練源碼是:
跟YOLOR是同一個作者的。
OpenCV+YOLOv7
推理過程跟之前的YOLO系列部署代碼可以大部分重用!這里就不在贅述了,詳細看源碼如下:輸出部分直接解析最后一個輸出層就好啦!
詳細實現代碼如下:
#include#include #include #include #include #include usingnamespacecv; usingnamespacednn; usingnamespacestd; structNet_config { floatconfThreshold;//Confidencethreshold floatnmsThreshold;//Non-maximumsuppressionthreshold stringmodelpath; }; classYOLOV7 { public: YOLOV7(Net_configconfig); voiddetect(Mat&frame); private: intinpWidth; intinpHeight; vector class_names; intnum_class; floatconfThreshold; floatnmsThreshold; Netnet; voiddrawPred(floatconf,intleft,inttop,intright,intbottom,Mat&frame,intclassid); }; YOLOV7::YOLOV7(Net_configconfig) { this->confThreshold=config.confThreshold; this->nmsThreshold=config.nmsThreshold; this->net=readNet(config.modelpath); ifstreamifs("coco.names"); stringline; while(getline(ifs,line))this->class_names.push_back(line); this->num_class=class_names.size(); size_tpos=config.modelpath.find("_"); intlen=config.modelpath.length()-6-pos; stringhxw=config.modelpath.substr(pos+1,len); pos=hxw.find("x"); stringh=hxw.substr(0,pos); len=hxw.length()-pos; stringw=hxw.substr(pos+1,len); this->inpHeight=stoi(h); this->inpWidth=stoi(w); } voidYOLOV7::drawPred(floatconf,intleft,inttop,intright,intbottom,Mat&frame,intclassid)//Drawthepredictedboundingbox { //Drawarectangledisplayingtheboundingbox rectangle(frame,Point(left,top),Point(right,bottom),Scalar(0,0,255),2); //Getthelabelfortheclassnameanditsconfidence stringlabel=format("%.2f",conf); label=this->class_names[classid]+":"+label; //Displaythelabelatthetopoftheboundingbox intbaseLine; SizelabelSize=getTextSize(label,FONT_HERSHEY_SIMPLEX,0.5,1,&baseLine); top=max(top,labelSize.height); //rectangle(frame,Point(left,top-int(1.5*labelSize.height)),Point(left+int(1.5*labelSize.width),top+baseLine),Scalar(0,255,0),FILLED); putText(frame,label,Point(left,top),FONT_HERSHEY_SIMPLEX,0.75,Scalar(0,255,0),1); } voidYOLOV7::detect(Mat&frame) { Matblob=blobFromImage(frame,1/255.0,Size(this->inpWidth,this->inpHeight),Scalar(0,0,0),true,false); this->net.setInput(blob); vector outs; this->net.forward(outs,this->net.getUnconnectedOutLayersNames()); intnum_proposal=outs[0].size[0]; intnout=outs[0].size[1]; if(outs[0].dims>2) { num_proposal=outs[0].size[1]; nout=outs[0].size[2]; outs[0]=outs[0].reshape(0,num_proposal); } /////generateproposals vector confidences; vector boxes; vector classIds; floatratioh=(float)frame.rows/this->inpHeight,ratiow=(float)frame.cols/this->inpWidth; intn=0,row_ind=0;///cx,cy,w,h,box_score,class_score float*pdata=(float*)outs[0].data; for(n=0;nthis->confThreshold) { Matscores=outs[0].row(row_ind).colRange(5,nout); PointclassIdPoint; doublemax_class_socre; //Getthevalueandlocationofthemaximumscore minMaxLoc(scores,0,&max_class_socre,0,&classIdPoint); max_class_socre*=box_score; if(max_class_socre>this->confThreshold) { constintclass_idx=classIdPoint.x; floatcx=pdata[0]*ratiow;///cx floatcy=pdata[1]*ratioh;///cy floatw=pdata[2]*ratiow;///w floath=pdata[3]*ratioh;///h intleft=int(cx-0.5*w); inttop=int(cy-0.5*h); confidences.push_back((float)max_class_socre); boxes.push_back(Rect(left,top,(int)(w),(int)(h))); classIds.push_back(class_idx); } } row_ind++; pdata+=nout; } //Performnonmaximumsuppressiontoeliminateredundantoverlappingboxeswith //lowerconfidences vector indices; dnn::NMSBoxes(boxes,confidences,this->confThreshold,this->nmsThreshold,indices); for(size_ti=0;idrawPred(confidences[idx],box.x,box.y, box.x+box.width,box.y+box.height,frame,classIds[idx]); } } intmain() { Net_configYOLOV7_nets={0.3,0.5,"models/yolov7_736x1280.onnx"};////choices=["models/yolov7_736x1280.onnx","models/yolov7-tiny_384x640.onnx","models/yolov7_480x640.onnx","models/yolov7_384x640.onnx","models/yolov7-tiny_256x480.onnx","models/yolov7-tiny_256x320.onnx","models/yolov7_256x320.onnx","models/yolov7-tiny_256x640.onnx","models/yolov7_256x640.onnx","models/yolov7-tiny_480x640.onnx","models/yolov7-tiny_736x1280.onnx","models/yolov7_256x480.onnx"] YOLOV7net(YOLOV7_nets); stringimgpath="images/dog.jpg"; Matsrcimg=imread(imgpath); net.detect(srcimg); staticconststringkWinName="DeeplearningobjectdetectioninOpenCV"; namedWindow(kWinName,WINDOW_NORMAL); imshow(kWinName,srcimg); waitKey(0); destroyAllWindows(); }
運行測試如下:
審核編輯:劉清
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
OpenCV
+關注
關注
31文章
635瀏覽量
41457 -
python
+關注
關注
56文章
4807瀏覽量
84945
原文標題:源碼 | OpenCV DNN + YOLOv7目標檢測
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
在英特爾AI開發板上用OpenVINO NNCF優化YOLOv7
提高了性能和效率。YOLO算法作為one-stage目標檢測算法最典型的代表,其基于深度神經網絡進行對象的識別和定位,運行速度很快,可以用于實時系統。YOLOv7 是 YOLO 模型系列的下一個演進階段,在不增加推理成本的情況下
yolov7 onnx模型在NPU上太慢了怎么解決?
yolov7tiny.onnx。輸入大小為 224x224,但 npu 推理時間為 127 毫秒。好像太慢了。這個時間合理嗎?以下是我的onnx模型轉換步驟和我的onnxruntime執行代碼: 1. 從 https
發表于 04-04 06:13
無法使用MYRIAD在OpenVINO trade中運行YOLOv7自定義模型怎么解決?
無法確定如何將 YOLOv7 模型的重量(.pt 文件)轉換為OpenVINO?中間表示 (IR) 并推斷有 MYRIAD 的 IR。
分辨率
轉換使用此 GitHub* 存儲庫
發表于 08-15 08:29
深度解析YOLOv7的網絡結構
最近,Scaled-YOLOv4的作者(也是后來的YOLOR的作者)和YOLOv4的作者AB大佬再次聯手推出了YOLOv7,目前來看,這一版的YOLOv7是一個比較正統的YOLO續作,
YOLOv6在LabVIEW中的推理部署(含源碼)
YOLOv6 是美團視覺智能部研發的一款目標檢測框架,致力于工業應用。如何使用python進行該模型的部署,官網已經介紹的很清楚了,但是對于如何在LabVIEW中實現該模型的
YOLOv7訓練自己的數據集包括哪些
? YOLOv7訓練自己的數據集整個過程主要包括:環境安裝—制作數據集—模型訓練—模型測試—模型推理 一、準備深度學習環境 本人的筆記本電腦系統是:Windows10 首先下載YOLOv7的代碼
三種主流模型部署框架YOLOv8推理演示
部署。這里以YOLOv8為例,演示了YOLOv8對象檢測模型在OpenVINO、ONNXRUNTIME、TensorRT三個主流框架上C++
yolov5和YOLOX正負樣本分配策略
整體上在正負樣本分配中,yolov7的策略算是yolov5和YOLOX的結合。因此本文先從yolov5和YOLOX正負樣本分配策略分析入手,后引入到YOLOv7的解析中。
發表于 08-14 11:45
?2339次閱讀
使用OpenVINO優化并部署訓練好的YOLOv7模型
在《英特爾銳炫 顯卡+ oneAPI 和 OpenVINO 實現英特爾 視頻 AI 計算盒訓推一體-上篇》一文中,我們詳細介紹基于英特爾 獨立顯卡搭建 YOLOv7 模型的訓練環境,并完成了 YOLOv7 模型訓練,獲得了最佳精度的模型權重。
OpenCV4.8+YOLOv8對象檢測C++推理演示
自從YOLOv5更新成7.0版本,YOLOv8推出以后,OpenCV4.6以前的版本都無法再加載導出ONNX格式模型了,只有OpenCV4.7以上版本才可以支持最新版本
詳細解讀YOLOV7網絡架構設計
YOLOV7提出了輔助頭的一個訓練方法,主要目的是通過增加訓練成本,提升精度,同時不影響推理的時間,因為輔助頭只會出現在訓練過程中。
發表于 11-27 10:45
?802次閱讀
基于OpenCV DNN實現YOLOv8的模型部署與推理演示
基于OpenCV DNN實現YOLOv8推理的好處就是一套代碼就可以部署在Windows10系統、烏班圖系統、Jetson的Jetpack系統
在樹莓派上部署YOLOv5進行動物目標檢測的完整流程
卓越的性能。本文將詳細介紹如何在性能更強的計算機上訓練YOLOv5模型,并將訓練好的模型部署到樹莓派4B上,通過樹莓派的攝像頭進行實時動物目標檢測。
一、在電腦上訓練
采用華為云 Flexus 云服務器 X 實例部署 YOLOv3 算法完成目標檢測
一、前言 1.1 開發需求 這篇文章講解:?采用華為云最新推出的 Flexus 云服務器 X 實例部署 YOLOv3 算法,完成圖像分析、目標檢測。 隨著計算機視覺技術的飛速發展,深度
評論