使用onnxruntime进行yolov5s模型推理实现

        首先,使用onnxruntime模型推理比使用pytorch快很多,所以模型训练完后,将模型导出为onnx格式并使用onnxruntime进行推理部署是一个不错的选择。接下来就逐步实现yolov5s在onnxruntime上的推理流程。

1、安装onnxruntime

pip install onnxruntime

2、导出yolov5s.pt为onnx,在YOLOv5源码中运行export.py即可将pt文件导出为onnx。

3、使用onnx进行推理,这一步只能获取模型推理产生的候选框,拿到推理结果后还需要进行下一步处理,通过非极大值抑制对候选框进行筛选。

使用onnx加载yolov5s.onnx模型,进行推理计算,打印推理结果:

height, width = 640, 640
img0 = cv2.imread('img.jpg') 
img = cv2.resize(img0, (height, width))  # 尺寸变换
img = img / 255.
img = img[:, :, ::-1].transpose((2, 0, 1))  # HWC转CHW
data = np.expand_dims(img, axis=0)  # 扩展维度至[1,3,640,640]
sess = rt.InferenceSession('yolov5s.onnx')
input_name = sess.get_inputs()[0].name
label_name = sess.get_outputs()[0].name
pred_onx = sess.run([label_name], {input_name: data.astype(np.float32)})[0] 
pred = np.squeeze(pred_onx) 
print(pred)
print(pred.shape)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQUnooYzkuJrlupTnlKg=,size_20,color_FFFFFF,t_70,g_se,x_16

 

此时打印的推理结果矩阵为[25200, 85],意味着有25200个检测框,每个检测框包含85个结果,85个结果中[0~3]为xywh,即检测框中心坐标和检测框宽高,[4]为每个检测框置信度,[5~85]为coco数据集80个分类对应预测结果。

   显然拿到直接的推理结果还无法在图像上进行准确的目标绘制,接下来还要进行非极大值抑制才能获取准确推理结果。

4、非极大值抑制:非极大值抑制可以采用OpenCV等接口实现,也可以手动实现。这里根据非极大值原理进行手动实现。

   非极大值抑制分为置信度和iou抑制。首先进行置信度抑制,此处置信度为检测框置信度而非分类结果的置信度,设置检测框置信度阈值0.25。

   置信度抑制非常简单,即根据置信度阈值,移除阈值以下的候选框,保留阈值以上的候选框进入下一步处理。使用一张图像进行测试,输出结果为(27,85),即剩下27个检测框。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQUnooYzkuJrlupTnlKg=,size_20,color_FFFFFF,t_70,g_se,x_16

在iou抑制之前,先对所有候选框列表进行置信度排序,然后从候选框列表中找出不同类别候选框形成子列表候选框。

   iou抑制整体思路:对每个类别候选框取出最大置信度候选框优先输出,再通过最大置信度候选框与其他候选框计算iou,通过iou阈值判断,大于iou阈值则删除,循环计算直至候选框列表为空。

   最后将保留的候选框输出,在图像上绘制检测结果。

非极大值抑制实现:

def nms(pred, conf_thres, iou_thres):
    # 置信度抑制,小于置信度阈值则删除
    conf = pred[..., 4] > conf_thres
    box = pred[conf == True]
    # 类别获取
    cls_conf = box[..., 5:]
    cls = []
    for i in range(len(cls_conf)):
        cls.append(int(np.argmax(cls_conf[i])))
    # 获取类别
    total_cls = list(set(cls))  #删除重复项,获取出现的类别标签列表,example=[0, 17]
    output_box = []   #最终输出的预测框
    # 不同分类候选框置信度
    for i in range(len(total_cls)):
        clss = total_cls[i]   #当前类别标签
        # 从所有候选框中取出当前类别对应的所有候选框
        cls_box = []
        for j in range(len(cls)):
            if cls[j] == clss:
                box[j][5] = clss
                cls_box.append(box[j][:6])
        cls_box = np.array(cls_box)
        box_conf = cls_box[..., 4]   #取出候选框置信度
        box_conf_sort = np.argsort(box_conf)   #获取排序后索引
        max_conf_box = cls_box[box_conf_sort[len(box_conf) - 1]]
        output_box.append(max_conf_box)   #将置信度最高的候选框输出为第一个预测框
        cls_box = np.delete(cls_box, 0, 0)  #删除置信度最高的候选框
        while len(cls_box) > 0:
            max_conf_box = output_box[len(output_box) - 1]     #将输出预测框列表最后一个作为当前最大置信度候选框
            del_index = []
            for j in range(len(cls_box)):
                current_box = cls_box[j]      #当前预测框
                interArea = getInter(max_conf_box, current_box)    #当前预测框与最大预测框交集
                iou = getIou(max_conf_box, current_box, interArea)  # 计算交并比
                if iou > iou_thres:
                    del_index.append(j)   #根据交并比确定需要移出的索引
            cls_box = np.delete(cls_box, del_index, 0)   #删除此轮需要移出的候选框
            if len(cls_box) > 0:
                output_box.append(cls_box[0])
                cls_box = np.delete(cls_box, 0, 0)
    return output_box

最终推理结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQUnooYzkuJrlupTnlKg=,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

  • 5
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
ONNX Runtime是一个高性能、跨平台的推理引擎,用于在各种硬件和操作系统上运行机器学习模型YOLOv5s是一种轻量级的目标检测模型,具有较快的推理速度和较高的准确率。 在使用ONNX Runtime运行YOLOv5s时,首先需要将YOLOv5s模型转换为ONNX格式。这可以通过使用YOLOv5官方提供的工具或用其他框架(如PyTorch或TensorFlow)实现的脚本来完成。转换后的ONNX模型将包含YOLOv5s网络架构的图像和权重。 然后,将转换后的ONNX模型加载到ONNX Runtime中,准备进行推理。可以使用ONNX Runtime提供的C++、Python或C# API来加载模型,并设置相应的推理会话。之后,可以将输入数据传递给模型,并使用ONNX Runtime进行推理。在YOLOv5s中,输入数据是图像,可以是单个图像或一批图像。 当推理过程开始时,ONNX Runtime会根据YOLOv5s模型的结构和权重,在输入图像上执行前向计算。这将产生包含检测到的目标及其位置的边界框。在YOLOv5s中,这些目标可以是各种物体,如人、车辆、动物等。 最后,ONNX Runtime会返回推理结果,即检测到的目标边界框。可以通过解析这些结果来获取检测到的目标的类别和位置信息。针对每个目标,可以提取其类别标签和在图像中的位置(边界框的左上角和右下角坐标)。 综上所述,ONNX Runtime可以用于加载、执行和推理YOLOv5s模型,以便检测图像中的目标。它提供了一个跨平台的解决方案,使得运行YOLOv5s模型推理过程变得高效、灵活且易于使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TheMatrixs

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值