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

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

3天内不再提示

YOLOv5在OpenCV上的推理程序

OpenCV学堂 来源:OpenCV学堂 作者:OpenCV学堂 2022-11-02 10:16 次阅读

测试与发现

YOLOv5官方给出的YOLOv5在OpenCV上推理的程序相对来说是比较通俗易懂的,条理清晰,有基本的封装,直接可用!但是我也发现,模型的推理时间跟前后处理的时间相差无几,特别是当视频流有多个检测到的对象时候,整个帧率会有明显下降!官方推荐的参考示例代码链接为:

https://github.com/doleron/yolov5-opencv-cpp-python/blob/main/python/yolo-tiny.py
最后发现推理时间没有明显变化,主要是前后处理,有两个函数耗时比较高!从输入图像转换到模型输入数据的函数:
cv2.dnn.blobFromImage(input_image , 1/255.0, (640, 640), swapRB=True)
推理之后的重叠目标框非最大抑制函数:
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.25, 0.45)
特别是非最大抑制函数,随着图像中目标数目增多,导致帧率成明显下降趋势!

修改输入转换

cv2.dnn.blobFromImage(input_image , 1/255.0, (640, 640), swapRB=True)

可以通过下面的代码等价替换:

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)

修改之后测试发现该替代降低了执行时间,说明替代有效!

修改非最大抑制

indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.25, 0.45)

输入的box格式x, y,w,h,我参考了网上的代码,修改实现一个基于并交比最简单的NMS抑制算法,基于矩阵计算,保证不会因为对象变得多了,增加计算耗时,然后把它们封装成一个单独的方法,导入该方法直接替换之前的代码行为:

class_ids, boxes = non_max_suppression_fast(np.asarray(class_ids), np.asarray(boxes), 0.75)

该函数完整的实现代码如下:

importnumpyasnp


defnon_max_suppression_fast(class_ids,boxes,nms_threshold):
#iftherearenoboxes,return
iflen(boxes)==0:
return[],[]

ifboxes.dtype.kind=="i":
boxes=boxes.astype("float")

#initializethelistofpickedindexes
pick=[]

#grabthecoordinatesoftheboundingboxes
x1=boxes[:,0]
y1=boxes[:,1]
x2=boxes[:,2]
y2=boxes[:,3]

#computetheareaoftheboundingboxesandsortthebounding
#boxesbythebottom-righty-coordinateoftheboundingbox
area=(x2-x1+1)*(y2-y1+1)
idxs=np.argsort(y2)

#keeploopingwhilesomeindexesstillremainintheindexes
#list
whilelen(idxs)>0:
#grabthelastindexintheindexeslistandaddthe
#indexvaluetothelistofpickedindexes
last=len(idxs)-1
i=idxs[last]
pick.append(i)

#findthelargest(x,y)coordinatesforthestartof
#theboundingboxandthesmallest(x,y)coordinates
#fortheendoftheboundingbox
xx1=np.maximum(x1[i],x1[idxs[:last]])
yy1=np.maximum(y1[i],y1[idxs[:last]])
xx2=np.minimum(x2[i],x2[idxs[:last]])
yy2=np.minimum(y2[i],y2[idxs[:last]])

#computethewidthandheightoftheboundingbox
w=np.maximum(0,xx2-xx1+1)
h=np.maximum(0,yy2-yy1+1)

#computetheratioofoverlap
overlap=(w*h)/area[idxs[:last]]

#deleteallindexesfromtheindexlistthathave
idxs=np.delete(idxs,np.concatenate(([last],
np.where(overlap>nms_threshold)[0])))

#returnonlytheboundingboxesthatwerepickedusingthe
#integerdatatype
returnclass_ids[pick],boxes[pick].astype("int")


if__name__=="__main__":
boxes=[]
boxes.append((163,0,27+163,41))
boxes.append((164,0,28+164,43))
boxes.append((165,0,29+165,42))
res=non_max_suppression_fast(None,np.asarray(boxes),0.25)
print(res)

对比测试

两处都修改完成之后,其它输入条件与代码不变,硬件相同条件下对比测试效果如下:修改之前 Python版本OpenCV与OpenVINO上推理速度:

146b72b4-59fc-11ed-a3b6-dac502259ad0.jpg

1478b618-59fc-11ed-a3b6-dac502259ad0.jpg

修改之后Python版本OpenCV与OpenVINO上推理速度:

1482a4de-59fc-11ed-a3b6-dac502259ad0.jpg

148f95e0-59fc-11ed-a3b6-dac502259ad0.jpg

可以看到FPS较之前有明显的提升!

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

    关注

    8

    文章

    6511

    浏览量

    87599
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79541
  • 模型
    +关注

    关注

    1

    文章

    2704

    浏览量

    47685
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40774

原文标题:替换前后处理的两个函数,Python版YOLOv5+OpenCV推理帧率提升1.5倍

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

收藏 人收藏

    评论

    相关推荐

    Yolov5算法解读

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

    龙哥手把手教你学视觉-深度学习YOLOV5

    可以实现理想的检测效果。本套视频,有别于常见的深度学习教程以理论为主进行全面讲解,以没有任何深度学习理论基础的学员学习角度,以实际应用为目标,讲解如何设计一个完整的yolov5工业外观检测,手把手教学
    发表于 09-03 09:39

    YOLOv5s算法RK3399ProD的部署推理流程是怎样的

    YOLOv5s算法RK3399ProD的部署推理流程是怎样的?基于RK33RK3399Pro怎样使用NPU进行加速推理呢?
    发表于 02-11 08:15

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

    显示了PIL和OpenCV图像源的批量推理。可以打印到控制台,保存到,支持的环境中显示到屏幕,并以张量或pandas数据帧的形式返回。对于所有
    发表于 07-22 16:02

    YOLOv5网络结构解析

    1、YOLOv5 网络结构解析  YOLOv5针对不同大小(n, s, m, l, x)的网络整体架构都是一样的,只不过会在每个子模块中采用不同的深度和宽度,  分别应对yaml文件中
    发表于 10-31 16:30

    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

    【EASY EAI Nano人工智能开发套件试用体验】RKNN YOLOV5 例程测试及横向对比

    RKNN1 YOLOV5 DEMO及与RKNN2硬件对比 introduct Rockchip 的 RKNN(Rockchip Neural Network) 是一款 AI 推理框架,能够
    发表于 05-31 21:49

    yolov5模型onnx转bmodel无法识别出结果如何解决?

    推理硬件:质算盒SE5,芯片BM1684。 2. SDK: v2.7.0 代码: 1. 模型来源yolov5官方:https://github.com/ultralytics/yolov5
    发表于 09-15 07:30

    基于YOLOv5的目标检测文档进行的时候出错如何解决?

    你好: 按Milk-V Duo开发板实战——基于YOLOv5的目标检测 安装好yolov5环境,执行main.py的时候会出错,能否帮忙看下 main.py: import torch
    发表于 09-18 07:47

    使用旭日X3派的BPU部署Yolov5

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

    Pytorch Hub两行代码搞定YOLOv5推理

    模型。支持模型远程加载与本地推理、当前Pytorch Hub已经对接到Torchvision、YOLOv5YOLOv8、pytorchvideo等视觉框架。
    的头像 发表于 06-09 11:36 706次阅读
    Pytorch Hub两行代码搞定<b class='flag-5'>YOLOv5</b><b class='flag-5'>推理</b>

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

    自从YOLOv5更新成7.0版本,YOLOv8推出以后,OpenCV4.6以前的版本都无法再加载导出ONNX格式模型了,只有OpenCV4.7以上版本才可以支持最新版本
    的头像 发表于 09-27 11:07 699次阅读
    <b class='flag-5'>OpenCV4.8+YOLOv</b>8对象检测C++<b class='flag-5'>推理</b>演示

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

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