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

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

3天内不再提示

介绍RT-DETR两种风格的onnx格式和推理方式

jf_pmFSk4VX 来源:GiantPandaCV 2023-05-17 17:46 次阅读

【前言】 RT-DETR是由百度近期推出的DETR-liked目标检测器,该检测器由HGNetv2、混合编码器和带有辅助预测头的Transformer编码器组成,整体结构如下所示。

cfe08870-ec2f-11ed-90ce-dac502259ad0.png

本文将采用RT-DETR两种不同风格的onnx格式,使用onnxruntime20行代码,无需nms操作即可实现简易部署推理.

一、原生onnx+ort推理方式

使用以下命令抽取出模型配置文件和模型参数文件:

pythontools/export_model.py-cconfigs/rtdetr/rtdetr_hgnetv2_l_6x_coco.yml-oweights=https://bj.bcebos.com/v1/paddledet/models/rtdetr_hgnetv2_l_6x_coco.pdparamstrt=True--output_dir=output_inference

转化模型为onnx形式:

paddle2onnx--model_dir=./output_inference/rtdetr_hgnetv2_l_6x_coco/--model_filenamemodel.pdmodel--params_filenamemodel.pdiparams--opset_version16--save_filertdetr_hgnetv2_l_6x_coco.onnx

抽取后的onnx可视化如下:

d00e3748-ec2f-11ed-90ce-dac502259ad0.png

可以看到,除了图像的输入,还有另外两个输入头,其中,im_shape指原输入图像的尺寸,scale_factor指静态图尺度/原输入图像尺度,其实就是缩放的系数。

我们将batch_size固定为1,裁减掉不需要使用到的算子:

python-mpaddle2onnx.optimize--input_modelrtdetr_hgnetv2_l_6x_coco.onnx--output_modelrtdetr_hgnetv2_l_6x_coco_sim.onnx--input_shape_dict"{'image':[1,3,640,640]}

使用简化后的onnx模型进行推理:

importonnxruntimeasrt
importcv2
importnumpyasnp

sess=rt.InferenceSession("/home/aistudio/PaddleDetection/rtdetr_hgnetv2_l_6x_coco_sim.onnx")
img=cv2.imread("../000283.jpg")
org_img=img
im_shape=np.array([[float(img.shape[0]),float(img.shape[1])]]).astype('float32')
img=cv2.resize(img,(640,640))
scale_factor=np.array([[float(640/img.shape[0]),float(640/img.shape[1])]]).astype('float32')
img=img.astype(np.float32)/255.0
input_img=np.transpose(img,[2,0,1])
image=input_img[np.newaxis,:,:,:]
result=sess.run(["reshape2_83.tmp_0","tile_3.tmp_0"],{'im_shape':im_shape,'image':image,'scale_factor':scale_factor})
forvalueinresult[0]:
ifvalue[1]>0.5:
cv2.rectangle(org_img,(int(value[2]),int(value[3])),(int(value[4]),int(value[5])),(255,0,0),2)
cv2.putText(org_img,str(int(value[0]))+":"+str(value[1]),(int(value[2]),int(value[3])),cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,255,255),1)
cv2.imwrite("../result.png",org_img)

推理结果:

d02341c4-ec2f-11ed-90ce-dac502259ad0.png

二、野生onnx+ort推理方式

其实通过官方onnx模型的格式可以看出,官方已经将所有后处理步骤写入到模型中,此时不需要额外添加后处理代码,是一种比较省心的方式。

但对于有强迫症的笔者而言,对于三个输入头的模型实在是看着别扭,因此我更偏向于下面的这种推理方式。

同样是抽取官方模型,但此时我们将后处理的所有操作全部摘除,只保留原模型参数:将模型的exclude_post_process设置为True,然后使用同样的代码进行转化:

pythontools/export_model.py-cconfigs/rtdetr/rtdetr_hgnetv2_l_6x_coco.yml-oweights=https://bj.bcebos.com/v1/paddledet/models/rtdetr_hgnetv2_l_6x_coco.pdparamstrt=True--output_dir=output_inference_sim

将转化后的pdmodel进行可视化:

d045bc68-ec2f-11ed-90ce-dac502259ad0.png

左边为未摘除后处理的pdmodel,右边为摘除后的pdmodel,以分类支路为例,我们可以看到,分类支路从Sigmoid开始,已经Sigmoid和后面的Children Node摘除干净,那么可以转化为onnx文件,步骤与上面一致。

d060e4a2-ec2f-11ed-90ce-dac502259ad0.png

使用转化后的onnx文件进行推理:

importonnxruntimeasrt
importcv2
importnumpyasnp

sess=rt.InferenceSession("rtdetr_hgnetv2_l_6x_coco_sim2.onnx")
img=cv2.imread("../000283.jpg")
img=cv2.resize(img,(640,640))
image=img.astype(np.float32)/255.0
input_img=np.transpose(image,[2,0,1])
image=input_img[np.newaxis,:,:,:]
results=sess.run(['scores','boxes'],{'image':image})
scores,boxes=[o[0]foroinresults]
index=scores.max(-1)
boxes,scores=boxes[index>0.5]*640,scores[index>0.5]
labels=scores.argmax(-1)
scores=scores.max(-1)
forbox,score,labelinzip(boxes,scores,labels):
cx,cy,w,h=int(box[0]),int(box[1]),int(box[2]),int(box[3])
cv2.rectangle(img,(cx-int(w/2),cy-int(h/2)),(cx+int(w/2),cy+int(h/2)),(0,255,255),2)
cv2.putText(img,f'{label}:{score:.2f}',(cx-int(w/2),cy-int(h/2)-5),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,255),1)
cv2.imwrite('../result.jpg',img)

推理结果:

d0753204-ec2f-11ed-90ce-dac502259ad0.jpg

【结尾】

本文介绍了RT-DETR两种风格的onnx格式和推理方式,不管哪种风格,精度无任何差别,至于是使用哪款,纯凭个人爱好。





审核编辑:刘清

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

    关注

    45

    文章

    3641

    浏览量

    134491
  • 检测器
    +关注

    关注

    1

    文章

    864

    浏览量

    47685

原文标题:无需nms,onnxruntime20行代码玩转RT-DETR

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

收藏 人收藏

    评论

    相关推荐

    两种采样方式

    两种采样方式.....................................
    发表于 08-08 15:04

    vnc和xrdp两种远程连接的方式

    [zju嵌入式]树莓派之远程桌面 之前介绍了通过串口和ssh登陆到树莓派的方法,这两种方式的有点在于连接方面,响应速度快,但是也有不够直观的缺点,没办法看到图形界面.在这篇博文中,
    发表于 12-24 07:54

    Wincc如何与PLC进行通讯两种常用的方式介绍

    西门子WINCC与SiemensPLC通讯连接有多种方式,下面介绍两种常用的通讯方式
    的头像 发表于 02-17 09:27 3w次阅读
    Wincc如何与PLC进行通讯<b class='flag-5'>两种</b>常用的<b class='flag-5'>方式</b><b class='flag-5'>介绍</b>

    YOLOX模型ONNX格式说明

    我记得大概是在去年七月份的时候我写过一篇文章是介绍YOLOX+OpenVINO推理的,下载YOLOX的ONNX格式模型(github上可以下载)
    的头像 发表于 04-13 08:35 5575次阅读

    在MATLAB/simulink中建模时的两种不同实现方式

    导读:本期文章主要介绍在MATLAB/simulink中建模时的两种不同实现方式,一是直接用现成的文件库中的模块进行搭建,一是用Sfun
    的头像 发表于 09-15 10:07 1881次阅读

    MATLAB/simulink中两种实现建模方式的优势

    导读:本期文章主要介绍在MATLAB/simulink中建模时的两种不同实现方式,一是直接用现成的文件库中的模块进行搭建,一是用Sfun
    的头像 发表于 09-15 10:10 5039次阅读

    简单聊聊目标检测新范式RT-DETR的骨干:HGNetv2

    当然,人们对RT-DETR之所以产生浓厚的兴趣,我觉得大概率还是对YOLO系列审美疲劳了,就算是出到了YOLO10086,我还是只想用YOLOv5和YOLOv7的框架来魔改做业务。。
    的头像 发表于 04-27 09:42 2018次阅读
    简单聊聊目标检测新范式<b class='flag-5'>RT-DETR</b>的骨干:HGNetv2

    ONNX格式模型部署兼容性框架介绍

      ONNXRUNTIME介绍 ONNX格式模型部署兼容性最强的框架 ONNXRUNTIME,基本上不会有算子不支持跟不兼容的情况出现,只要能导出ONNX
    的头像 发表于 06-19 11:50 2501次阅读
    <b class='flag-5'>ONNX</b><b class='flag-5'>格式</b>模型部署兼容性框架<b class='flag-5'>介绍</b>

    DETR架构的内部工作方式分析

    这是一个Facebook的目标检测Transformer (DETR)的完整指南。   介绍 DEtection TRansformer (DETR)是Facebook研究团队巧妙地利
    的头像 发表于 08-30 10:53 983次阅读
    <b class='flag-5'>DETR</b>架构的内部工作<b class='flag-5'>方式</b>分析

    基于OpenVINO Python API部署RT-DETR模型

    RT-DETR 是在 DETR 模型基础上进行改进的,一基于 DETR 架构的实时端到端检测器,它通过使用一系列新的技术和算法,实现了更高效的训练和
    的头像 发表于 10-20 11:15 971次阅读
    基于OpenVINO Python API部署<b class='flag-5'>RT-DETR</b>模型

    基于OpenVINO C++ API部署RT-DETR模型

    RT-DETR 是在 DETR 模型基础上进行改进的,一基于 DETR 架构的实时端到端检测器,它通过使用一系列新的技术和算法,实现了更高效的训练和
    的头像 发表于 11-03 14:30 847次阅读
    基于OpenVINO C++ API部署<b class='flag-5'>RT-DETR</b>模型

    基于OpenVINO C# API部署RT-DETR模型

    RT-DETR 是在 DETR 模型基础上进行改进的,一基于 DETR 架构的实时端到端检测器,它通过使用一系列新的技术和算法,实现了更高效的训练和
    的头像 发表于 11-10 16:59 755次阅读
    基于OpenVINO C# API部署<b class='flag-5'>RT-DETR</b>模型

    百度开源DETRs在实时目标检测中胜过YOLOs

    这篇论文介绍了一名为RT-DETR的实时检测Transformer,是第一个实时端到端目标检测器。
    的头像 发表于 03-06 09:24 1567次阅读
    百度开源DETRs在实时目标检测中胜过YOLOs

    AI推理框架软件ONNX Runtime正式支持龙架构

    近日,知名AI推理框架开源社区ONNX Runtime正式发布支持龙架构的版本1.17.0。
    的头像 发表于 03-12 12:23 571次阅读
    AI<b class='flag-5'>推理</b>框架软件<b class='flag-5'>ONNX</b> Runtime正式支持龙架构

    OpenVINO™ Java API应用RT-DETR做目标检测器实战

    本文将从零开始详细介绍环境搭建的完整步骤,我们基于英特尔开发套件AIxBoard为硬件基础实现了Java在Ubuntu 22.04系统上成功使用OpenVINO™ Java API,并且成功运行了RT-DETR实现实时端到端目标检测器AI任务。
    的头像 发表于 03-18 15:04 803次阅读
    OpenVINO™ Java API应用<b class='flag-5'>RT-DETR</b>做目标检测器实战