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

    文章

    6926

    浏览量

    88867
  • 程序
    +关注

    关注

    116

    文章

    3779

    浏览量

    80896
  • 模型
    +关注

    关注

    1

    文章

    3184

    浏览量

    48763
  • OpenCV
    +关注

    关注

    30

    文章

    629

    浏览量

    41295

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    YOLOv5】LabVIEW+YOLOv5快速实现实时物体识别(Object Detection)含源码

    前面我们给大家介绍了基于LabVIEW+YOLOv3/YOLOv4的物体识别(对象检测),今天接着上次的内容再来看看YOLOv5。本次主要是和大家分享使用LabVIEW快速实现yolov5
    的头像 发表于 03-13 16:01 2104次阅读

    Yolov5算法解读

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

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

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

    RK3568教学实验箱实现基于YOLOV5的算法物体识别案例详解

    安装了所有必要的依赖。这通常包括 torch、torchvision 和 opencv-python。 (2)下载预训练模型 YOLOv5 提供了多个预训练模型,可以从官方仓库或相关资源中下载。 (3
    发表于 12-03 14:56

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

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

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

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

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

    下载并转换YOLOv5预训练模型的详细步骤,请参考:《基于OpenVINO™2022.2和蝰蛇峡谷优化并部署YOLOv5模型》,本文所使用的OpenVINO是2022.3 LTS版。
    的头像 发表于 02-15 16:53 4595次阅读

    使用旭日X3派的BPU部署Yolov5

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

    yolov5和YOLOX正负样本分配策略

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

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

    自从YOLOv5更新成7.0版本,YOLOv8推出以后,OpenCV4.6以前的版本都无法再加载导出ONNX格式模型了,只有OpenCV4.7以上版本才可以支持最新版本
    的头像 发表于 09-27 11:07 1471次阅读
    <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 1445次阅读
    基于<b class='flag-5'>OpenCV</b> DNN实现<b class='flag-5'>YOLOv</b>8的模型部署与<b class='flag-5'>推理</b>演示