0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在OpenCV4.5.4版本上完成YOLOv5 7.0推理演示與測(cè)試

OpenCV學(xué)堂 ? 來(lái)源:OpenCV學(xué)堂 ? 作者:gloomyfish ? 2022-11-30 17:54 ? 次閱讀

昨天發(fā)了YOLOv5 7.0支持實(shí)例分割的推文,收到不少留言問推理速度怎么樣,所以我今天測(cè)試了一下,選擇的是YOLOv5s的SEG模型,導(dǎo)出ONNX格式之后,在OpenCV4.5.4版本上完成了推理演示與測(cè)試。

ONNX格式輸入與輸出

首先需要把yolov5s-seg.pt文件導(dǎo)出為ONNX格式,這個(gè)很簡(jiǎn)單,一條命令行搞定:

python export.py --weights yolov5s-seg.pt --include onnx

運(yùn)行結(jié)果如下:

pYYBAGOHKGqATwbgAAFf5zY667U959.jpg

導(dǎo)出之后查看輸入與輸出格式顯示如下:

pYYBAGOHKHOASHR-AAHWrhqHhPI677.jpg

其中輸入部分跟YOLOv5對(duì)象檢測(cè)沒有什么分別,都是NCHW格式圖像輸入,甚至預(yù)處理都完全一致。

輸出部分內(nèi)容分為兩個(gè)部分,output0主要是box框架信息,跟mask預(yù)測(cè)的1x32個(gè)向量,前面85個(gè)解析跟YOLOv5對(duì)象檢測(cè)完成一致,后面32向量是解析mask的時(shí)候會(huì)使用的。

output1格式是1x32x160x160, 針對(duì)每個(gè)box通過(guò)boxes部分的1x32 跟它點(diǎn)乘機(jī)得到1x160x160 就得到這個(gè)box對(duì)應(yīng)的預(yù)測(cè)mask信息,然后根據(jù)box大小從mask中截取roi之后,疊加到輸出結(jié)果上就可以了。

OpenCV DNN推理

整個(gè)代碼實(shí)現(xiàn)部分絕大部分跟OpenCV DNN部署YOLOv5對(duì)象檢測(cè)一致,需要修改的只有兩個(gè)地方,一個(gè)是推理時(shí)候的預(yù)測(cè)結(jié)果,YOLOv5返回一個(gè),這邊是返回兩個(gè),所以需要修改一下代碼把代碼從:

defdetect(image,net):
#1x3x640x640
blob=cv2.dnn.blobFromImage(image,1/255.0,(INPUT_WIDTH,INPUT_HEIGHT),swapRB=True,crop=False)
net.setInput(blob)
preds=net.forward()
returnpreds

修改為:

defdetect(image,net):
rgb=cv.cvtColor(image,cv.COLOR_BGR2RGB)
input_image=cv.resize(src=rgb,dsize=(INPUT_WIDTH,INPUT_HEIGHT))
blob_img=np.float32(input_image)/255.0
input_x=blob_img.transpose((2,0,1))
input_blob=np.expand_dims(input_x,0)
net.setInput(input_blob)
layer=net.getUnconnectedOutLayersNames()
masks,preds=net.forward(layer)
returnpreds,masks
這樣就好啦 第二個(gè)改動(dòng)的地方在后處理部分,如何解析出mask部分,這部分我通過(guò)翻看YOLOv5 7.0官方推理演示的源碼,它是基于torch實(shí)現(xiàn)的,我一通猛改之后改成了基于numpy實(shí)現(xiàn)。生成mask的代碼如下:
color_mask=np.zeros((fh,fw,3),dtype=np.uint8)
black_mask=np.zeros((fh,fw),dtype=np.float32)
mv=cv.split(color_mask)
foriinrange(len(boxes)):
x1,y1,x2,y2=boxes[i]
x1=max(0,x1)
y1=max(0,y1)
classid=class_ids[i]
m1=masks[i]
mask=np.reshape(sigmoid(np.matmul(m1,mask2)),(160,160))

mx1=max(0,np.int((x1*sx)/x_factor))
mx2=max(0,np.int((x2*sx)/x_factor))
my1=max(0,np.int((y1*sy)/y_factor))
my2=max(0,np.int((y2*sy)/y_factor))
mask_roi=mask[my1:my2,mx1:mx2]

result_mask=cv.resize(mask_roi,(x2-x1,y2-y1))
result_mask[result_mask>0.5]=1.0
result_mask[result_mask<=?0.5]?=?0.0
????rh,?rw?=?result_mask.shape
????if?(y1+rh)?>=fh:
rh=fh-y1
if(x1+rw)>=fw:
rw=fw-x1
black_mask[y1:y1+rh,x1:x1+rw]=result_mask[0:rh,0:rw]
mv[2][black_mask==1],mv[1][black_mask==1],mv[0][black_mask==1]=
[np.random.randint(0,256),np.random.randint(0,256),np.random.randint(0,256)]
color=colors[int(classid)%len(colors)]
cv.rectangle(frame,(x1,y1),(x2,y2),color,2)
cv.rectangle(frame,(x1,y1-20),(x2,y1),color,-1)
cv.putText(frame,class_list[classid],(x1,y1-10),cv.FONT_HERSHEY_SIMPLEX,.5,(0,0,0))

把這段代碼放在NMS之后,替換YOLOv5對(duì)象檢測(cè)的NMS之后的解析代碼即可。最終Python版本OpenCV DNN推理的運(yùn)行效果如下:

poYBAGOHKJiAOsIjAADpSmbBVZM275.jpg
poYBAGOHKJ-AHaC1AAD-n0A6DmU529.jpg

速度這么慢,怒而改成OpenCV DNN C++推理,N卡加持:

poYBAGOHKLmAGIKbAAEWknaLsd0485.jpg
poYBAGOHKMCAGuC5AAF7MglYA4s282.jpg

基本上可以跑到40FPS左右,感覺很不錯(cuò)了!






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • OpenCV
    +關(guān)注

    關(guān)注

    32

    文章

    642

    瀏覽量

    42480
  • NMS
    NMS
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    6121
  • dnn
    dnn
    +關(guān)注

    關(guān)注

    0

    文章

    61

    瀏覽量

    9230

原文標(biāo)題:OpenCV4.5.4+YOLOv5 7.0分割推理演示

文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Jetson Nano使用TensorRT C++實(shí)現(xiàn)YOLOv5模型推理

    前面有一篇文章詳細(xì)說(shuō)明了如何在Jetson Nano安裝YOLOv5,然后運(yùn)行,這里只需導(dǎo)出的時(shí)候?qū)С鰁ngine模型文件支持。
    發(fā)表于 11-17 09:38 ?5085次閱讀

    Yolov5算法解讀

    yolov5于2020年由glenn-jocher首次提出,直至今日yolov5仍然不斷進(jìn)行升級(jí)迭代。 Yolov5YOLOv5s、
    的頭像 發(fā)表于 05-17 16:38 ?1.2w次閱讀
    <b class='flag-5'>Yolov5</b>算法解讀

    C++中使用OpenVINO工具包部署YOLOv5-Seg模型

    YOLOv5兼具速度和精度,工程化做的特別好,Git clone到本地即可在自己的數(shù)據(jù)集實(shí)現(xiàn)目標(biāo)檢測(cè)任務(wù)的訓(xùn)練和推理,產(chǎn)業(yè)界中應(yīng)用廣泛。開源社區(qū)對(duì)
    的頭像 發(fā)表于 12-21 10:17 ?2807次閱讀
    <b class='flag-5'>在</b>C++中使用OpenVINO工具包部署<b class='flag-5'>YOLOv5</b>-Seg模型

    RK3568教學(xué)實(shí)驗(yàn)箱實(shí)現(xiàn)基于YOLOV5的算法物體識(shí)別案例詳解

    安裝了所有必要的依賴。這通常包括 torch、torchvision 和 opencv-python。 (2)下載預(yù)訓(xùn)練模型 YOLOv5 提供了多個(gè)預(yù)訓(xùn)練模型,可以從官方倉(cāng)庫(kù)或相關(guān)資源中下載。 (3
    發(fā)表于 12-03 14:56

    怎樣使用PyTorch Hub去加載YOLOv5模型

    Python>=3.7.0環(huán)境中安裝requirements.txt,包括PyTorch>=1.7。模型和數(shù)據(jù)集從最新的 YOLOv5版本自動(dòng)下載。簡(jiǎn)單示例此示例從
    發(fā)表于 07-22 16:02

    OpenCV C++程序編譯與演示

    1、JetsonNano編譯OpenCV源碼與OpenCV C++ YOLOv5程序演示  
    發(fā)表于 11-10 16:42

    使用Yolov5 - i.MX8MP進(jìn)行NPU錯(cuò)誤檢測(cè)是什么原因?

    的時(shí)機(jī)(yolov5s 模型,輸入為 448x448 ~ 70ms)。 現(xiàn)在我正在嘗試使用 Yolov5(uint8 量化),但我嘗試使用不同的預(yù)訓(xùn)練模型獲得相同的行為, CPU 上進(jìn)行良好檢測(cè),
    發(fā)表于 03-31 07:38

    如何YOLOv5測(cè)試代碼?

    使用文檔“使用 YOLOv5 進(jìn)行對(duì)象檢測(cè)”我試圖從文檔第 10 頁(yè)訪問以下鏈接( i.MX8MP 上部署 yolov5s 的步驟 - NXP 社區(qū)) ...但是這樣做時(shí)會(huì)被拒絕訪問。該文檔沒有說(shuō)明需要特殊許可才能下載 tes
    發(fā)表于 05-18 06:08

    YOLOv5OpenCV推理程序

    YOLOv5官方給出的YOLOv5OpenCV推理的程序相對(duì)來(lái)說(shuō)是比較通俗易懂的,條理清晰,
    的頭像 發(fā)表于 11-02 10:16 ?2350次閱讀

    YOLOv5 7.0版本下載與運(yùn)行測(cè)試

    支持實(shí)例分割了,從此YOLOv5實(shí)現(xiàn)了圖像分類、對(duì)象檢測(cè)、實(shí)例分割三個(gè)支持,從訓(xùn)練到部署。
    的頭像 發(fā)表于 11-30 15:55 ?4442次閱讀

    使用旭日X3派的BPU部署Yolov5

    本次主要介紹旭日x3的BPU中部署yolov5。首先在ubuntu20.04安裝yolov5,并運(yùn)行yolov5并使用pytoch的pt模型文件轉(zhuǎn)ONNX。
    的頭像 發(fā)表于 04-26 14:20 ?1252次閱讀
    使用旭日X3派的BPU部署<b class='flag-5'>Yolov5</b>

    三種主流模型部署框架YOLOv8推理演示

    深度學(xué)習(xí)模型部署有OpenVINO、ONNXRUNTIME、TensorRT三個(gè)主流框架,均支持Python與C++的SDK使用。對(duì)YOLOv5~YOLOv8的系列模型,均可以通過(guò)C++推理實(shí)現(xiàn)模型
    的頭像 發(fā)表于 08-06 11:39 ?3107次閱讀

    yolov5和YOLOX正負(fù)樣本分配策略

    整體正負(fù)樣本分配中,yolov7的策略算是yolov5和YOLOX的結(jié)合。因此本文先從yolov5和YOLOX正負(fù)樣本分配策略分析入手,
    發(fā)表于 08-14 11:45 ?2607次閱讀
    <b class='flag-5'>yolov5</b>和YOLOX正負(fù)樣本分配策略

    OpenCV4.8+YOLOv8對(duì)象檢測(cè)C++推理演示

    自從YOLOv5更新成7.0版本,YOLOv8推出以后,OpenCV4.6以前的版本都無(wú)法再加載
    的頭像 發(fā)表于 09-27 11:07 ?1911次閱讀
    <b class='flag-5'>OpenCV4.8+YOLOv</b>8對(duì)象檢測(cè)C++<b class='flag-5'>推理</b><b class='flag-5'>演示</b>

    基于OpenCV DNN實(shí)現(xiàn)YOLOv8的模型部署與推理演示

    基于OpenCV DNN實(shí)現(xiàn)YOLOv8推理的好處就是一套代碼就可以部署Windows10系統(tǒng)、烏班圖系統(tǒng)、Jetson的Jetpack系統(tǒng)
    的頭像 發(fā)表于 03-01 15:52 ?2624次閱讀
    基于<b class='flag-5'>OpenCV</b> DNN實(shí)現(xiàn)<b class='flag-5'>YOLOv</b>8的模型部署與<b class='flag-5'>推理</b><b class='flag-5'>演示</b>

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品