实现MNN推理

在将torch模型转换为MNN模型之后,我们可以有C++,Python API两种方式进行验证转换模型的准确性以及推理时间的比较,本文档主要实现的是借助python API的方式。之前一直使用的是creatsession的方式,没想到各种坑,最后发现借助MNN.expr很容易就实现了MNN的推理实现,分享给大家

import MNN.expr as F
import cv2
import torch
import numpy as np
mnn_model_path = './yolo.mnn'
image_path = './input.jpeg'

# 图像预处理
def process(image, size):
    # image_data = cv2.imread(image_path)
    # image_data = cv2.cvtColor(image_data,cv2.COLOR_BGR2RGB)
    image_resize = cv2.resize(image, size).astype(float)
    image_resize /= 255
    input_data = np.array(image_resize)
    input_data = input_data.transpose((2, 0, 1))  # HWC --> CHW
    input_data = np.expand_dims(input_data, 0)
    return input_data

# 推理阶段
def m_yolo_inference(image, m_path):
# m_path 即mnn模型的路径
    vars = F.load_as_dict(m_path)
    inputVar = vars["input"]
    # 这里注意,由于直接MNN模型的数据输入,输入格式默认是caffe格式,数据类型是NC4HW,而我们使用的格式(pytorch)是NCHW,因此需要将格式转换一下。
    if inputVar.data_format == F.NC4HW4:
        inputVar.reorder(F.NCHW)
    inputVar.write(image.tolist())
    # 查看输出结果, 由于MNN很多op操作,会造成多个输出头,所以我们需要借助netron工具查看以下各个输出头的shape,然后return我们需要的输出头即可。
    outputVar0 = vars['output']
    if outputVar0.data_format == F.NC4HW4:
        outputVar0 = F.convert(outputVar0, F.NCHW)

    outputVar1 = vars['187']
    if outputVar1.data_format == F.NC4HW4:
        outputVar1 = F.convert(outputVar1, F.NCHW)

    return torch.from_numpy(outputVar0.read()), torch.from_numpy(outputVar1.read())

def main():
    image = process(image_path, (320, 320))
    out1, out2 = m_yolo_inference(image, mnn_model_path)
    print(type(out1))

if __name__ == "__main__":
    main()
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Begin,again

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

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

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

打赏作者

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

抵扣说明:

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

余额充值