0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在OpenCV4.5.4版本上完成YOLOv5 7.0推理演示与测试

OpenCV学堂 来源:OpenCV学堂 作者:gloomyfish 2022-11-30 17:54 次阅读

昨天发了YOLOv5 7.0支持实例分割的推文,收到不少留言问推理速度怎么样,所以我今天测试了一下,选择的是YOLOv5s的SEG模型,导出ONNX格式之后,在OpenCV4.5.4版本上完成了推理演示与测试。

ONNX格式输入与输出

首先需要把yolov5s-seg.pt文件导出为ONNX格式,这个很简单,一条命令行搞定:

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

运行结果如下:

pYYBAGOHKGqATwbgAAFf5zY667U959.jpg

导出之后查看输入与输出格式显示如下:

pYYBAGOHKHOASHR-AAHWrhqHhPI677.jpg

其中输入部分跟YOLOv5对象检测没有什么分别,都是NCHW格式图像输入,甚至预处理都完全一致。

输出部分内容分为两个部分,output0主要是box框架信息,跟mask预测的1x32个向量,前面85个解析跟YOLOv5对象检测完成一致,后面32向量是解析mask的时候会使用的。

output1格式是1x32x160x160, 针对每个box通过boxes部分的1x32 跟它点乘机得到1x160x160 就得到这个box对应的预测mask信息,然后根据box大小从mask中截取roi之后,叠加到输出结果上就可以了。

OpenCV DNN推理

整个代码实现部分绝大部分跟OpenCV DNN部署YOLOv5对象检测一致,需要修改的只有两个地方,一个是推理时候的预测结果,YOLOv5返回一个,这边是返回两个,所以需要修改一下代码把代码从:

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
这样就好啦 第二个改动的地方在后处理部分,如何解析出mask部分,这部分我通过翻看YOLOv5 7.0官方推理演示的源码,它是基于torch实现的,我一通猛改之后改成了基于numpy实现。生成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对象检测的NMS之后的解析代码即可。最终Python版本OpenCV DNN推理的运行效果如下:

poYBAGOHKJiAOsIjAADpSmbBVZM275.jpg
poYBAGOHKJ-AHaC1AAD-n0A6DmU529.jpg

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

poYBAGOHKLmAGIKbAAEWknaLsd0485.jpg
poYBAGOHKMCAGuC5AAF7MglYA4s282.jpg

基本上可以跑到40FPS左右,感觉很不错了!






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • OpenCV
    +关注

    关注

    29

    文章

    624

    浏览量

    41210
  • NMS
    NMS
    +关注

    关注

    0

    文章

    9

    浏览量

    6018
  • dnn
    dnn
    +关注

    关注

    0

    文章

    59

    浏览量

    9030

原文标题:OpenCV4.5.4+YOLOv5 7.0分割推理演示

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Jetson Nano使用TensorRT C++实现YOLOv5模型推理

    前面有一篇文章详细说明了如何在Jetson Nano安装YOLOv5,然后运行,这里只需导出的时候导出engine模型文件支持。
    发表于 11-17 09:38 4335次阅读

    Yolov5算法解读

    yolov5于2020年由glenn-jocher首次提出,直至今日yolov5仍然不断进行升级迭代。 Yolov5YOLOv5s、
    的头像 发表于 05-17 16:38 8368次阅读
    <b class='flag-5'>Yolov5</b>算法解读

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

    YOLOv5兼具速度和精度,工程化做的特别好,Git clone到本地即可在自己的数据集实现目标检测任务的训练和推理产业界中应用广泛。开源社区对
    的头像 发表于 12-21 10:17 2004次阅读
    <b class='flag-5'>在</b>C++中使用OpenVINO工具包部署<b class='flag-5'>YOLOv5</b>-Seg模型

    怎样使用PyTorch Hub去加载YOLOv5模型

    Python>=3.7.0环境中安装requirements.txt,包括PyTorch>=1.7。模型和数据集从最新的 YOLOv5版本自动下载。简单示例此示例从
    发表于 07-22 16:02

    OpenCV C++程序编译与演示

    1、JetsonNano编译OpenCV源码与OpenCV C++ YOLOv5程序演示  
    发表于 11-10 16:42

    使用Yolov5 - i.MX8MP进行NPU错误检测是什么原因?

    的时机(yolov5s 模型,输入为 448x448 ~ 70ms)。 现在我正在尝试使用 Yolov5(uint8 量化),但我尝试使用不同的预训练模型获得相同的行为, CPU 上进行良好检测,
    发表于 03-31 07:38

    如何YOLOv5测试代码?

    使用文档“使用 YOLOv5 进行对象检测”我试图从文档第 10 页访问以下链接( i.MX8MP 上部署 yolov5s 的步骤 - NXP 社区) ...但是这样做时会被拒绝访问。该文档没有说明需要特殊许可才能下载 tes
    发表于 05-18 06:08

    YOLOv5OpenCV推理程序

    YOLOv5官方给出的YOLOv5OpenCV推理的程序相对来说是比较通俗易懂的,条理清晰,
    的头像 发表于 11-02 10:16 1810次阅读

    JetsonNano编译OpenCV源码与OpenCV C++ YOLOv5程序演示

    Jetson Nano自带的OpenCV版本比较低,Jetpack4.6对应的OpenCV版本为4.1的,有图为证。
    的头像 发表于 11-10 11:28 3164次阅读

    YOLOv5 7.0版本下载与运行测试

    支持实例分割了,从此YOLOv5实现了图像分类、对象检测、实例分割三个支持,从训练到部署。
    的头像 发表于 11-30 15:55 3640次阅读

    使用旭日X3派的BPU部署Yolov5

    本次主要介绍旭日x3的BPU中部署yolov5。首先在ubuntu20.04安装yolov5,并运行yolov5并使用pytoch的pt模型文件转ONNX。
    的头像 发表于 04-26 14:20 821次阅读
    使用旭日X3派的BPU部署<b class='flag-5'>Yolov5</b>

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

    深度学习模型部署有OpenVINO、ONNXRUNTIME、TensorRT三个主流框架,均支持Python与C++的SDK使用。对YOLOv5~YOLOv8的系列模型,均可以通过C++推理实现模型
    的头像 发表于 08-06 11:39 2579次阅读

    yolov5和YOLOX正负样本分配策略

    整体正负样本分配中,yolov7的策略算是yolov5和YOLOX的结合。因此本文先从yolov5和YOLOX正负样本分配策略分析入手,
    发表于 08-14 11:45 2154次阅读
    <b class='flag-5'>yolov5</b>和YOLOX正负样本分配策略

    OpenCV4.8+YOLOv8对象检测C++推理演示

    自从YOLOv5更新成7.0版本YOLOv8推出以后,OpenCV4.6以前的版本都无法再加载
    的头像 发表于 09-27 11:07 1418次阅读
    <b class='flag-5'>OpenCV4.8+YOLOv</b>8对象检测C++<b class='flag-5'>推理</b><b class='flag-5'>演示</b>

    基于OpenCV DNN实现YOLOv8的模型部署与推理演示

    基于OpenCV DNN实现YOLOv8推理的好处就是一套代码就可以部署Windows10系统、乌班图系统、Jetson的Jetpack系统
    的头像 发表于 03-01 15:52 1322次阅读
    基于<b class='flag-5'>OpenCV</b> DNN实现<b class='flag-5'>YOLOv</b>8的模型部署与<b class='flag-5'>推理</b><b class='flag-5'>演示</b>