Yolo v5 pytorch模型转onnx用c++进行推理

您所在的位置:网站首页 pytorch模型转tflite Yolo v5 pytorch模型转onnx用c++进行推理

Yolo v5 pytorch模型转onnx用c++进行推理

2023-09-05 03:21| 来源: 网络整理| 查看: 265

先说声抱歉因为搬家和工作问题 所以这部分文章耽搁了很久,趁着放假有空把部分文章补上

目录

要点:

环境配置 :

pytorch模型转成onnx模型:

onnxruntime python推理模型

onnxruntime c++推理模型

onnxruntime java推理模型

小结

要点:

        本文介绍如何使用u版的yolov5 模型转成 onnx模型,使用python代码推理onnx模型,然后再使用c++代码推理onnx模型,本文使用yolov5 s版本,在m,l,x都试过可行

环境配置 :

        1 u版的yolov5 4.0 版本,其他版本没有试过   https://github.com/ultralytics/yolov5

        2 opencv 4.3  3.4.8 都可以,pytorch版本1.7

        3 onnx 版本采用1.8.0,onnxruntime 采用 1.6.0

        4 系统版本: windows 10  64位

pytorch模型转成onnx模型:

        1 训练好pytorch模型后,进行pytorch模型到onnx模型的转换,进入yolov5主目录的models目录,修改export.py文件,修改54行左右的内容,将model.model[-1].export = True  改为      model.model[-1].export = False 即可

        修改完毕后即可导出onnx模型,返回上级yolov5主目录 执行 python models/export.py  --weights    ./640x640.pt  --img 640   640 --batch 1

        参数解释 weights:训练好的pytorch模型  img :转换的高宽 (注意,这里必须是32的倍数,顺序是高宽)  batch:转换后一次推理的图片数目(注意这里使用多少,推理时就用多少,目前没研究动态batch推理)

onnxruntime python推理模型

        1导出onnx文件后,进到yolov5 主目录执行 python demo_onnx_carPerson.py  -i testImags/tesImg.jpg  -m ./mine_models/best.onnx 验证下

参数解释: -i :要推理的图片  -m:所用到的onnx模型

这里主要有两点,一个是理解模型输出张量的格式,一个是前预处理的方法

模型的输出张量格式是有一个个目标数据组成的,目标数据的格式是x_center,y_center,w,h,obj_conf,class_1_conf,class_2_conf,...,class_n_conf,就是中心点的x坐标,y坐标,宽,高,目标置信度,每个类别的置信度,那么一个目标数据的长度就是 4 + 1 + class_num,那么输出张量的格式就是obj_num*(4+1+class_num),obj_num是目标个数

前处理的方法,第一步就是先根据模型输入修改图片的尺寸,可以直接采用opencv resize 图片,这样也可以进行推理,不过为了跟官方保持一致,可以进行按图片最长边的比例进行缩放,然后进行padding的方法进行resize的,方法在demo_onnx_carPerson.py的letterbox_image_v2的函数里面。推理函数则是detect_onnx函数。

onnxruntime c++推理模型

        1 c++推理onnx模型所需要的库则是windows版本的onnxruntime库,推理的过程其实就是把python推理onnx模型的过程用c++实现一遍,,这里说明是nms用的是opencv自带的,没有进行加权,而且是用的cpu推理 的。

        2.1 步骤主要分为 三步 ,1是初始化模型  2是填充数据进入onnx的输入tensor  3是推理后进行后处理获取输出

        2.2 初始化模型,主要是设置好onnx运行时的属性配置,然后载入路径初始化模型,另外还可以进行对模型warm up

/** 初始化模型 * @brief Detector::initModel * @param model_path //模型路径 * @param class_num //类别数目 * @param conf_thres //分数阈值 * @param iou_thres //iou阈值 * @param input_size // 模型输入的尺寸 */ void Detector::initModel(std::string &model_path, int class_num,float conf_thres,float iou_thres, std::tuple &input_size) { m_classNum = class_num; m_confThres = conf_thres; m_iouThres = iou_thres; m_inputSize = input_size; #ifdef _WIN32 std::cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3