Opencv YOLO3目標檢測 C

2021-09-09 08:04:18 字數 3601 閱讀 7829

wget 

wget -o ./yolov3.cfg

wget -o ./coco.names

yolov3演算法的**結果就是邊界框。每乙個邊界框都旁隨著乙個置信值。第一階段中,全部低於置信度閥值的都會排除掉。 對剩餘的邊界框執行非最大抑制演算法,以去除重疊的邊界框。非最大抑制由乙個引數nmsthrehold控制。讀者可以嘗試改變這個數值,觀察輸出的邊界框的改變。 接下來,設定輸入的寬度(inpwidth)和高度(inpheight)。我們設定他們為416,以便對比yolov3作者提供的darknets的c**。如果想要更快的速度,讀者可以把寬度和高度設定為320。如果想要更準確的結果,改變他們到608。

float confthreshold = 0.5;//置信度閾值

float nmsthreshold = 0.4;//非最大抑制閾值

int inpwidth = 416;//網路輸入寬度

int inpheight = 416;//網路輸入高度

接下來我們讀入coco資料庫並將類名存入vector classes容器。並載入模型與權重檔案yolov3.cfg和yolov3.weights。 最後把dnn的後端設定為opencv,目標設定cpu。也可以通過cv::dnn::dnn_target_opencl設定目標為gpu。

//將類名存進容器

string classesfile = "d:\\code\\c++\\yolo3-detecction\\coco.names";包含80種不同的類名

ifstream ifs(classesfile.c_str());

string line;

while(getline(ifs,line))classes.push_back(line);

//取得模型的配置和權重檔案

cv::string modelconfiguration = "d:\\code\\c++\\yolo3-detecction\\yolov3.cfg";

cv::string modelweights = "d:\\code\\c++\\yolo3-detecction\\yolov3.weights";

//載入網路

cv::dnn::net net = cv::dnn::readnetfromdarknet(modelconfiguration,modelweights);

net.setpreferablebackend(cv::dnn::dnn_backend_opencv);

net.setpreferablebackend(cv::dnn::dnn_target_opencl);

string str, outputfile;

cv::videocapture cap("d:\\code\\c++\\yolo3-detecction\\run.mp4");

cv::videowriter video;

cv::mat frame,blob;

//開啟攝像頭

// cv::videocapture cap(1);

//建立視窗

static const string kwinname = "deep learning object detection in opencv";

cv::namedwindow(kwinname,cv::window_autosize);

while(cv::waitkey(1)<0)

//在dnn中從磁碟載入

cv::dnn::blobfromimage(frame,blob,1/255.0,cv::size(inpwidth,inpheight));

//設定輸入

net.setinput(blob);

//設定輸出層

vectorouts;//儲存識別結果

net.forward(outs,getoutputnames(net));

//移除低置信度邊界框

postprocess(frame,outs);

//顯示s延時資訊並繪製

vectorlayerstimes;

double freq = cv::gettickfrequency()/1000;

double t=net.getperfprofile(layerstimes)/freq;

string label = cv::format("infercence time for a frame:%.2f ms",t);

cv::puttext(frame,label,cv::point(0,15),cv::font_hershey_******x,0.5,cv::scalar(0,255,255));

//繪製識別框

cv::imshow(kwinname,frame);

}

opencv的網路類中的前向功能需要結束層,直到它在網路中執行。因為我們需要執行整個網路,所以我們需要識別網路中的最後一層。我們通過使用getunconnectedoutlayers()獲得未連線的輸出層的名字,該層基本就是網路的最後層。然後我們執行前向網路,得到輸出,如前面的**片段(net.forward(getoutputsnames(net)))。

//從輸出層得到名字

vectorgetoutputnames(const cv::dnn::net& net)}}

//低置信度

vectorindices;//儲存沒有重疊邊框的索引

//該函式用於抑制重疊邊框

cv::dnn::nmsboxes(boxes,confidences,confthreshold,nmsthreshold,indices);

for(size_t i=0;i非最大抑制由引數nmsthreshold控制。如果nmsthreshold設定太少,比如0.1,我們可能檢測不到相同或不同種類的重疊目標。如果設定得太高,比如1,可能出現乙個目標有多個邊界框包圍。所以我們在上面的**使用了0.4這個中間的值。

最後,經過非最大抑制後,得到了邊界框。我們把邊界框在輸入幀上畫出,並標出種類名和置信值。

//繪製**邊界框

void drawpred(int classid,float conf,int left,int top,int right,int bottom,cv::mat& frame)

//繪製邊界框上的標籤

int baseline;

cv::size labelsize = cv::gettextsize(label,cv::font_hershey_******x,0.5,1,&baseline);

top = max(top,labelsize.height);

cv::rectangle(frame,cv::point(left,top-round(1.5*labelsize.height)),cv::point(left+round(1.5*labelsize.width),top+baseline),cv::scalar(255,255,255),cv::filled);

cv::puttext(frame, label,cv::point(left, top), cv::font_hershey_******x, 0.75,cv::scalar(0, 0, 0), 1);

}

yolo3 目標檢測 實測

yolo是繼faster r cnn後,原作者在目標檢測領域進行的新研究。到了v3版本以後,雖然已經換人支援,但是更注重工程實踐,在實際使用過程中突出感受就是 非常快 gpu加速以後能夠達到實時多目標,並且已經完成了工程實踐。下一步需要做的,應該就是 1 小型化 2 fpga化 3 垂直領域特定目標...

Anaconda yolov3 目標檢測 頭盔實戰

1 執行cmd,輸入conda 了解相關命令操作。常用conda命令彙總 windows版本 activate base 啟用conda基礎環境 conda create n tf y python 3.7 建立乙個名為tf的環境,python版本為3.7 activate tf 啟用環境 disa...

目標檢測 目標檢測通用框架總結

目標檢測框架個人總結 以下是筆記中包含的內容 目標檢測網路框架總結 yolov4中有圖 從最開始的神經網路到現在深度更深,模組更多的目標檢測深度學習神經網路,如今大致可以分為two stage detector 典型的為rcnn系列 和 one stage detector 典型為yolo系列 每個...