最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

opencv調(diào)用yolov3模型深度學(xué)習(xí)目標(biāo)檢測(cè)實(shí)例詳解

 更新時(shí)間:2022年11月25日 16:44:10   作者:月照銀海似蛟龍  
這篇文章主要為大家介紹了opencv調(diào)用yolov3模型深度學(xué)習(xí)目標(biāo)檢測(cè)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

opencv調(diào)用yolov3模型進(jìn)行深度學(xué)習(xí)目標(biāo)檢測(cè),以實(shí)例進(jìn)行代碼詳解

對(duì)于yolo v3已經(jīng)訓(xùn)練好的模型,opencv提供了加載相關(guān)文件,進(jìn)行圖片檢測(cè)的類dnn。 下面對(duì)怎么通過opencv調(diào)用yolov3模型進(jìn)行目標(biāo)檢測(cè)方法進(jìn)行詳解,付源代碼

建立相關(guān)目錄

在訓(xùn)練結(jié)果backup文件夾下,找到模型權(quán)重文件,拷到win的工程文件夾下 在cfg文件夾下,找到模型配置文件,yolov3-voc.cfg拷到win的工程文件夾下 在data文件夾下,找到voc.names,類別標(biāo)簽文件,拷到win的工程文件夾下

代碼詳解

weightsPath='E:\deep_learn\yolov3_modeFile\yolov3-voc_25000.weights'# 模型權(quán)重文件
configPath="E:\deep_learn\yolov3_modeFile\yolov3-voc.cfg"# 模型配置文件
labelsPath = "E:\\deep_learn\\yolov3_modeFile\\voc.names"# 模型類別標(biāo)簽文件

引入模型的相關(guān)文件,這里需要使用yolo v3訓(xùn)練模型的三個(gè)文件

(1)模型權(quán)重文件 name.weights

(2)訓(xùn)練模型時(shí)的配置文件 yolov3-voc.cfg(一定和訓(xùn)練時(shí)一致,后面會(huì)提原因)

(3)模型類別的標(biāo)簽文件 voc.names

LABELS = open(labelsPath).read().strip().split("\n")

從voc.names中得到標(biāo)簽的數(shù)組LABELS 我的模型識(shí)別的是車和人 voc,names文件內(nèi)容

LABELS數(shù)組內(nèi)容

COLORS = np.random.randint(0, 255, size=(len(LABELS), 3),dtype="uint8")#顏色  隨機(jī)生成顏色框

根據(jù)類別個(gè)數(shù)隨機(jī)生成幾個(gè)顏色 ,用來后期畫矩形框 [[ 33 124 191] [211 63 59]]

boxes = []
confidences = []
classIDs = []

聲明三個(gè)數(shù)組 (1)boxes 存放矩形框信息 (2)confidences 存放框的置信度 (3)classIDs 存放框的類別標(biāo)簽 三個(gè)數(shù)組元素一一對(duì)應(yīng),即boxes[0]、confidences[0]、classIDs[0]對(duì)應(yīng)一個(gè)識(shí)別目標(biāo)的信息,后期根據(jù)該信息在圖片中畫出識(shí)別目標(biāo)的矩形框

net = cv2.dnn.readNetFromDarknet(configPath,weightsPath)

加載 網(wǎng)絡(luò)配置與訓(xùn)練的權(quán)重文件 構(gòu)建網(wǎng)絡(luò) 注意此處opencv2.7不行 ,沒有dnn這個(gè)類,最好opencv版本在4.0以上,對(duì)應(yīng)python用3.0以上版本

image = cv2.imread('E:\deep_learn\yolov3_detection_image\R1_WH_ZW_40_80_288.jpg')
(H,W) = image.shape[0:2]

讀入待檢測(cè)的圖片,得到圖像的高和寬

ln = net.getLayerNames()

得到 YOLO各層的名稱,之后從各層名稱中找到輸出層

可以看到y(tǒng)olo的各層非常多,紅框圈的'yolo_94'、'yolo_106'即為輸出層,下面就需要通過代碼找到這三個(gè)輸出層,為什么是三個(gè)?跟yolo的框架結(jié)構(gòu)有關(guān),yolo有三個(gè)輸出。對(duì)應(yīng)的我們?cè)谟?xùn)練模型時(shí)修改 yolov3-voc.cfg文件,修改的filters、classes也是三處,詳細(xì)參考darknet YOLOv3數(shù)據(jù)集訓(xùn)練預(yù)測(cè)8. 修改./darknet/cfg/yolov3-voc.cfg文件

下面就是在yolo的所有層名稱ln中找出三個(gè)輸出層,代碼如下

out = net.getUnconnectedOutLayers()#得到未連接層得序號(hào)
x = []
for i in out:   # i=[200]
    x.append(ln[i[0]-1])    # i[0]-1    取out中的數(shù)字  [200][0]=200  ln(199)= 'yolo_82'
ln=x

yolo的輸出層是未連接層的前一個(gè)元素,通過net.getUnconnectedOutLayers()找到未連接層的序號(hào)out= [[200] /n [267] /n [400] ],循環(huán)找到所有的輸出層,賦值給ln 最終ln = ['yolo_82', 'yolo_94', 'yolo_106'] 接下來就是將圖像轉(zhuǎn)化為輸入的標(biāo)準(zhǔn)格式

blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (416, 416),swapRB=True, crop=False)

用需要檢測(cè)的原始圖像image構(gòu)造一個(gè)blob圖像,對(duì)原圖像進(jìn)行像素歸一化1 / 255.0,縮放尺寸 (416, 416),,對(duì)應(yīng)訓(xùn)練模型時(shí)cfg的文件 交換了R與G通道

交換R與G通道通道是opencv在打開圖片時(shí)交換了一次,此處交換即又換回來了 此時(shí)blob.shape=(1, 3, 416, 416),四維。 可以用numpy里的squeeze()函數(shù)把秩為1的維度去掉,然后顯示圖片出來看看

image_blob = np.squeeze(blob)
cv2.namedWindow('image_blob', cv2.WINDOW_NORMAL)
cv2.imshow('image_blob',np.transpose(image_blob,[1,2,0]))
cv2.waitKey(0)

net.setInput(blob) #將blob設(shè)為輸入
layerOutputs = net.forward(ln)  #ln此時(shí)為輸出層名稱  ,向前傳播  得到檢測(cè)結(jié)果

將blob設(shè)為輸入 ln此時(shí)為輸出層名稱 ,向前傳播 得到檢測(cè)結(jié)果。 此時(shí)layerOutputs即三個(gè)輸出的檢測(cè)結(jié)果,

layerOutputs是一個(gè)含有三個(gè)矩陣的列表變量,三個(gè)矩陣對(duì)應(yīng)三個(gè)層的檢測(cè)結(jié)果,其中一層的檢測(cè)結(jié)果矩陣如下圖

是個(gè)507*7的矩陣,這個(gè)矩陣代表著檢測(cè)結(jié)果,其中507就是這層檢測(cè)到了507個(gè)結(jié)果(即507個(gè)矩形框),其中7就是矩形框的信息,為什么是7呢,這里解釋下,7=5+2,5是矩形框(x,y,w,h,c)2是2個(gè)類別分別的置信度(class0、class1). 所以每一行代表一個(gè)檢測(cè)結(jié)果。

接下來就是對(duì)檢測(cè)結(jié)果進(jìn)行處理與顯示 在檢測(cè)結(jié)果中會(huì)有很多每個(gè)類的置信度為0的矩形框,要把這些與置信度較低的框去掉

#接下來就是對(duì)檢測(cè)結(jié)果進(jìn)行處理
for output in layerOutputs:  #對(duì)三個(gè)輸出層 循環(huán)
    for detection in output:  #對(duì)每個(gè)輸出層中的每個(gè)檢測(cè)框循環(huán)
        scores=detection[5:]  #detection=[x,y,h,w,c,class1,class2]
        classID = np.argmax(scores)#np.argmax反饋?zhàn)畲笾档乃饕?
        confidence = scores[classID]
        if confidence >0.5:#過濾掉那些置信度較小的檢測(cè)結(jié)果
            box = detection[0:4] * np.array([W, H, W, H])
            (centerX, centerY, width, height)= box.astype("int")
            # 邊框的左上角
            x = int(centerX - (width / 2))
            y = int(centerY - (height / 2))
            # 更新檢測(cè)出來的框
            boxes.append([x, y, int(width), int(height)])
            confidences.append(float(confidence))
            classIDs.append(classID)

現(xiàn)在就將網(wǎng)絡(luò)的檢測(cè)結(jié)果提取了出來,框、置信度、類別。 可以先畫一下看下效果

a=0
for box in  boxes:#將每個(gè)框畫出來
    a=a+1
    (x,y)=(box[0],box[1])#框左上角
    (w,h)=(box[2],box[3])#框?qū)捀?
    if classIDs[a-1]==0: #根據(jù)類別設(shè)定框的顏色
        color = [0,0,255]
    else:
        color = [0, 255, 0]
    cv2.rectangle(image, (x, y), (x + w, y + h), color, 2) #畫框
    text = "{}: {:.4f}".format(LABELS[classIDs[a-1]], confidences[a-1])
    cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.3, color, 1)#寫字
cv2.namedWindow('Image', cv2.WINDOW_NORMAL)
cv2.imshow("Image", image)
cv2.waitKey(0)

結(jié)果:

可以看到對(duì)于同一目標(biāo)有幾個(gè)矩形框,這需要對(duì)框進(jìn)行非極大值抑制處理。 進(jìn)行非極大值抑制的操作,opencv的dnn有個(gè)直接的函數(shù) NMSBoxes(bboxes, scores, score_threshold, nms_threshold, eta=None, top_k=None) bboxes需要操作的各矩形框?qū)?yīng)咱程序的boxes scores矩形框?qū)?yīng)的置信度對(duì)應(yīng)咱程序的confidences score_threshold置信度的閾值,低于這個(gè)閾值的框直接刪除 nms_threshold nms的閾值 非極大值的原理沒有理解的話,里面的參數(shù)不好設(shè)置。 下面簡單說下非極大值抑制的原理

1)先對(duì)輸入檢測(cè)框按置信度由高到低排序

2)挑選第一個(gè)檢測(cè)框(即最高置信度,記為A)和其它檢測(cè)框(記為B)進(jìn)行iou計(jì)算

3)如果iou大于nmsThreshold, 那就將B清除掉

4)跳轉(zhuǎn)到2)從剩余得框集里面找置信度最大得框和其它框分別計(jì)算iou

5)直到所有框都過濾完 NMSBoxes()函數(shù)返回值為最終剩下的按置信度由高到低的矩形框的序列號(hào) 進(jìn)行非極大值抑制后,顯示部分代碼改一部分即可。

直接給出代碼

idxs=cv2.dnn.NMSBoxes(boxes, confidences, 0.2,0.3)
box_seq = idxs.flatten()#[ 2  9  7 10  6  5  4]
if len(idxs)>0:
    for seq in box_seq:
        (x, y) = (boxes[seq][0], boxes[seq][1])  # 框左上角
        (w, h) = (boxes[seq][2], boxes[seq][3])  # 框?qū)捀?
        if classIDs[seq]==0: #根據(jù)類別設(shè)定框的顏色
            color = [0,0,255]
        else:
            color = [0,255,0]
        cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)  # 畫框
        text = "{}: {:.4f}".format(LABELS[classIDs[seq]], confidences[seq])
        cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.3, color, 1)  # 寫字
cv2.namedWindow('Image', cv2.WINDOW_NORMAL)
cv2.imshow("Image", image)
cv2.waitKey(0)

最終的檢測(cè)結(jié)果

至此及用opencv加載yolo v3的模型,進(jìn)行了一次圖片的檢測(cè)。

附源代碼

#coding:utf-8
import numpy as np
import cv2
import os
weightsPath='E:\deep_learn\yolov3_modeFile\yolov3-voc_25000.weights'# 模型權(quán)重文件
configPath="E:\deep_learn\yolov3_modeFile\yolov3-voc.cfg"# 模型配置文件
labelsPath = "E:\\deep_learn\\yolov3_modeFile\\voc.names"# 模型類別標(biāo)簽文件
#初始化一些參數(shù)
LABELS = open(labelsPath).read().strip().split("\n")
boxes = []
confidences = []
classIDs = []
#加載 網(wǎng)絡(luò)配置與訓(xùn)練的權(quán)重文件 構(gòu)建網(wǎng)絡(luò)
net = cv2.dnn.readNetFromDarknet(configPath,weightsPath)  
#讀入待檢測(cè)的圖像
image = cv2.imread('E:\deep_learn\yolov3_detection_image\R1_WH_ZW_40_80_288.jpg')
#得到圖像的高和寬
(H,W) = image.shape[0:2]
# 得到 YOLO需要的輸出層
ln = net.getLayerNames()
out = net.getUnconnectedOutLayers()#得到未連接層得序號(hào)  [[200] /n [267]  /n [400] ]
x = []
for i in out:   # 1=[200]
    x.append(ln[i[0]-1])    # i[0]-1    取out中的數(shù)字  [200][0]=200  ln(199)= 'yolo_82'
ln=x
# ln  =  ['yolo_82', 'yolo_94', 'yolo_106']  得到 YOLO需要的輸出層
#從輸入圖像構(gòu)造一個(gè)blob,然后通過加載的模型,給我們提供邊界框和相關(guān)概率
#blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None)
blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (416, 416),swapRB=True, crop=False)#構(gòu)造了一個(gè)blob圖像,對(duì)原圖像進(jìn)行了圖像的歸一化,縮放了尺寸 ,對(duì)應(yīng)訓(xùn)練模型
net.setInput(blob) #將blob設(shè)為輸入??? 具體作用還不是很清楚
layerOutputs = net.forward(ln)  #ln此時(shí)為輸出層名稱  ,向前傳播  得到檢測(cè)結(jié)果
for output in layerOutputs:  #對(duì)三個(gè)輸出層 循環(huán)
    for detection in output:  #對(duì)每個(gè)輸出層中的每個(gè)檢測(cè)框循環(huán)
        scores=detection[5:]  #detection=[x,y,h,w,c,class1,class2] scores取第6位至最后
        classID = np.argmax(scores)#np.argmax反饋?zhàn)畲笾档乃饕?
        confidence = scores[classID]
        if confidence >0.5:#過濾掉那些置信度較小的檢測(cè)結(jié)果
            box = detection[0:4] * np.array([W, H, W, H])
            #print(box)
            (centerX, centerY, width, height)= box.astype("int")
            # 邊框的左上角
            x = int(centerX - (width / 2))
            y = int(centerY - (height / 2))
            # 更新檢測(cè)出來的框
            boxes.append([x, y, int(width), int(height)])
            confidences.append(float(confidence))
            classIDs.append(classID)
idxs=cv2.dnn.NMSBoxes(boxes, confidences, 0.2,0.3)
box_seq = idxs.flatten()#[ 2  9  7 10  6  5  4]
if len(idxs)>0:
    for seq in box_seq:
        (x, y) = (boxes[seq][0], boxes[seq][1])  # 框左上角
        (w, h) = (boxes[seq][2], boxes[seq][3])  # 框?qū)捀?
        if classIDs[seq]==0: #根據(jù)類別設(shè)定框的顏色
            color = [0,0,255]
        else:
            color = [0,255,0]
        cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)  # 畫框
        text = "{}: {:.4f}".format(LABELS[classIDs[seq]], confidences[seq])
        cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.3, color, 1)  # 寫字
cv2.namedWindow('Image', cv2.WINDOW_NORMAL)
cv2.imshow("Image", image)
cv2.waitKey(0)

以上就是opencv調(diào)用yolov3模型深度學(xué)習(xí)目標(biāo)檢測(cè)實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于opencv調(diào)用yolov3目標(biāo)檢測(cè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python制作可視化GUI界面自動(dòng)分類管理文件

    python制作可視化GUI界面自動(dòng)分類管理文件

    這篇文章主要為大家介紹了python制作可視化GUI界面實(shí)現(xiàn)自動(dòng)分類管理文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python調(diào)用Ollama庫本地大語言模型使用詳解

    Python調(diào)用Ollama庫本地大語言模型使用詳解

    ollama是一個(gè)用于調(diào)用本地大語言模型的Python庫,提供了簡單、高效的API接口,下面文章詳細(xì)介紹了如何安裝、使用、設(shè)置自定義參數(shù)、集成流式生成、錯(cuò)誤處理以及與其他工具集成,需要的朋友可以參考下
    2025-02-02
  • python中單例常用的幾種實(shí)現(xiàn)方法總結(jié)

    python中單例常用的幾種實(shí)現(xiàn)方法總結(jié)

    Python 的模塊就是天然的單例模式,下面這篇文章主要給大家介紹了關(guān)于python中單例常用的幾種實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python單例具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們一起來看看吧
    2018-10-10
  • Python實(shí)現(xiàn)圖片滑動(dòng)式驗(yàn)證識(shí)別方法

    Python實(shí)現(xiàn)圖片滑動(dòng)式驗(yàn)證識(shí)別方法

    驗(yàn)證碼作為一種自然人的機(jī)器人的判別工具,被廣泛的用于各種防止程序做自動(dòng)化的場(chǎng)景中。這篇文章主要介紹了Python實(shí)現(xiàn)圖片滑動(dòng)式驗(yàn)證識(shí)別方法,需要的朋友可以參考下
    2017-11-11
  • Python實(shí)現(xiàn)對(duì)字符串中字符提取校驗(yàn)

    Python實(shí)現(xiàn)對(duì)字符串中字符提取校驗(yàn)

    眾所周知,python之所以很方便在一定程度上是因?yàn)殡S時(shí)都可能有人又創(chuàng)作了一個(gè)好用又方便的python非標(biāo)準(zhǔn)庫。本文就來用Python實(shí)現(xiàn)對(duì)字符串中字符進(jìn)行提取校驗(yàn),需要的可以參考一下
    2022-10-10
  • opencv 獲取rtsp流媒體視頻的實(shí)現(xiàn)方法

    opencv 獲取rtsp流媒體視頻的實(shí)現(xiàn)方法

    這篇文章主要介紹了opencv 獲取rtsp流媒體視頻的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • python實(shí)現(xiàn)的登錄和操作開心網(wǎng)腳本分享

    python實(shí)現(xiàn)的登錄和操作開心網(wǎng)腳本分享

    這篇文章主要介紹了python實(shí)現(xiàn)的登錄和操作開心網(wǎng)腳本分享,可以登錄開心網(wǎng),登錄后發(fā)送信息等功能,需要的朋友可以參考下
    2014-07-07
  • python的concat等多種用法詳解

    python的concat等多種用法詳解

    這篇文章主要為大家詳細(xì)介紹了python的concat等多種用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Python學(xué)習(xí)之字典的創(chuàng)建和使用

    Python學(xué)習(xí)之字典的創(chuàng)建和使用

    這篇文章主要為大家介紹了Python中的字典的創(chuàng)建與使用,包括使用字典(添加、刪除、修改等操作),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-06-06
  • 淺談python for循環(huán)的巧妙運(yùn)用(迭代、列表生成式)

    淺談python for循環(huán)的巧妙運(yùn)用(迭代、列表生成式)

    下面小編就為大家?guī)硪黄獪\談python for循環(huán)的巧妙運(yùn)用(迭代、列表生成式)。
    2017-09-09

最新評(píng)論

镇坪县| 龙口市| 荥经县| 读书| 金湖县| 隆林| 八宿县| 手机| 枞阳县| 林甸县| 元阳县| 基隆市| 昆明市| 九江市| 松桃| 台前县| 丰台区| 兰溪市| 金阳县| 临泉县| 米易县| 大田县| 松溪县| 岐山县| 安图县| 南阳市| 大悟县| 望谟县| 炉霍县| 岗巴县| 卓尼县| 乌兰浩特市| 凌海市| 婺源县| 利津县| 丹阳市| 铁岭县| 灵武市| 霞浦县| 房山区| 庆元县|