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

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

3天内不再提示

YOLOX模型ONNX格式说明

我快闭嘴 来源:OpenCV学堂 作者:gloomyfish 2022-04-13 08:35 次阅读

yolox 推理openvino与c++支持

YOLOX模型ONNX格式说明

我记得大概是在去年七月份的时候我写过一篇文章是介绍YOLOX+OpenVINO推理的,下载YOLOX的ONNX格式模型(github上可以下载)

https://github.com/Megvii-BaseDetection/YOLOX/tree/main/demo/ONNXRuntimehttps://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.onnx

下载ONNX格式模型,打开之后如图:

YOLOX模型ONNX格式说明

输入格式:1x3x640x640,默认BGR,无需归一化。输出格式:1x8400x85

01

什么是85

其中85的前四个是cx、cy、w、h大小,第五个是object预测得分,后面80个是COCO类别。

02

什么是8400

模型在数据输入端几乎与YOLOv5的代码一致,没有什么特别之处,唯一不同的在于输出层的解析,是把三个不同的输出层合并在一个里面了,分别是80x80, 40x40, 20x20, 每个特征点预测,所以总数才会是80x80+40x40+20x20 =8400

03

输出层解析解密

最后一层输出,这点跟YOLOv5最新版本输出层有点相似,但是YOLOv5的输出层更近一步,已经计算了相关的矩形框位置信息,直接输出就是绝对位置信息,而YOLOX还是输出原始的相对位置信息,需要解析一波才行(跟最新的YOLOv5相同),说明YOLOX的工程化方面还有待提升!不是开源就完事了!

OpenVINO推理解析

必须说明一点,参考了官方的部分代码,然后在上面猛改一通(原因是官方代码写的不是很好),改完之后,封装成一个类了,主要的方法跟我封装的YOLOv5的推理类相似,导出了两个函数方法

void YOLOXDetector::string onnxpath, float nms, float score)

该方法表示初始化IE,然后加载模型,设置nms阈值与置信度阈值score,创建一个推理请求,同时初始化每一层上对应每个特征点尺度比率。这部分的代码如下:

voidYOLOXDetector::initConfig(std::stringonnxpath,floatnms,floatscore){
this->nms_threshold=nms;
this->score_threshold=score;
Coreie;
CNNNetworknetwork=ie.ReadNetwork(onnxpath);
InputInfo::Ptrinput_info=network.getInputsInfo().begin()->second;
this->input_name=network.getInputsInfo().begin()->first;

DataPtroutput_info=network.getOutputsInfo().begin()->second;
this->out_name=network.getOutputsInfo().begin()->first;
output_info->setPrecision(Precision::FP32);

ExecutableNetworkexecutable_network=ie.LoadNetwork(network,"CPU");
this->infer_request=executable_network.CreateInferRequest();

std::vector<int>strides={8,16,32};
generate_grids_and_stride(INPUT_W,INPUT_H,strides,grid_strides);
}

检测函数

void detect(cv::Mat & frame, std::vector&results);

该方法完成检测,并把检测结果作为resulte返回,相关的代码实现可以参考之前的文章,感觉并没有什么不同,其中最大的不同的地方是对输出结果的解析,这边代码作为单独的方法函数实现如下(参考官方):

voidYOLOXDetector::generate_yolox_proposals(std::vectorgrid_strides,constfloat*feat_ptr,floatprob_threshold,std::vector&objects)
{
constintnum_anchors=grid_strides.size();
for(intanchor_idx=0;anchor_idx< num_anchors; anchor_idx++)
    {
        constintgrid0=grid_strides[anchor_idx].grid0;
constintgrid1=grid_strides[anchor_idx].grid1;
constintstride=grid_strides[anchor_idx].stride;

constintbasic_pos=anchor_idx*(NUM_CLASSES+5);

//yolox/models/yolo_head.pydecodelogic
floatx_center=(feat_ptr[basic_pos+0]+grid0)*stride;
floaty_center=(feat_ptr[basic_pos+1]+grid1)*stride;
floatw=exp(feat_ptr[basic_pos+2])*stride;
floath=exp(feat_ptr[basic_pos+3])*stride;
floatx0=x_center-w*0.5f;
floaty0=y_center-h*0.5f;

floatbox_objectness=feat_ptr[basic_pos+4];
for(intclass_idx=0;class_idx< NUM_CLASSES; class_idx++)
        {
            floatbox_cls_score=feat_ptr[basic_pos+5+class_idx];
floatbox_prob=box_objectness*box_cls_score;
if(box_prob>prob_threshold)
{
DetectResultobj;
obj.box.x=x0;
obj.box.y=y0;
obj.box.width=w;
obj.box.height=h;
obj.classId=class_idx;
obj.score=box_prob;
objects.push_back(obj);
}
}
}
}

最终调用该类实现推理就显得特别简单,对图像跟视频都是一样,使用下面的代码:

detector->initConfig(this->settings->getOnnxModelPath(),score,conf);
std::vectorresults;
detector->detect(frame,results);

最后我发现在onnxruntime上面也一样可以,基本上重用了大部分的代码,然后把它们与我之前写YOLOv5+QT的演示整合了一下,这样就变成YOLOv5+YOLOx支持OpenVINO/ONNXRUNTIME全部可行的推理,可以自由的通过界面切换!

运行结果如下(请允许我show一下界面):

YOLOX模型ONNX格式说明

YOLOX模型ONNX格式说明

YOLOX模型ONNX格式说明

扫码查看OpenCV+Pytorch系统化学习路线图

原文标题:OpenVINO +YOLOX最新版本推理演示

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

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

    关注

    0

    文章

    23

    浏览量

    16865
  • 模型
    +关注

    关注

    1

    文章

    3171

    浏览量

    48711
  • 推理
    +关注

    关注

    0

    文章

    8

    浏览量

    7264
收藏 人收藏

    评论

    相关推荐

    cubemx ai导入onnx模型后压缩失败了怎么解决?

    cubemx ai导入onnx模型后压缩失败。请问我怎么解决
    发表于 03-19 07:58

    STM CUBE AI错误导入onnx模型报错的原因?

    使用cube-AI分析模型时报错,该模型是pytorch的cnn转化成onnx ``` Neural Network Tools for STM32AI v1.7.0 (STM.ai v8.0.0-19389) INTER
    发表于 05-27 07:15

    yolox_bytetrack_osd_encode示例自带的yolox模型效果不好是怎么回事?

    yolox_bytetrack_osd_encode示例自带的模型如下,我看示例里面yolox_group.json、yolox_infer.json、
    发表于 07-05 07:51

    深度探索ONNX模型部署 精选资料分享

    这篇文章从多个角度探索了ONNX,从ONNX的导出到ONNX和Caffe的对比,以及使用ONNX遭遇的困难以及一些解决办法,另...
    发表于 07-20 07:41

    ONNX的相关资料分享

    ONNX文件并生成特定平台和运行框架所支持的神经网络模型ONNX本身不是AI神经网络运行框架,只是AI神经网络模型通用中间描述文件格式Gi
    发表于 11-05 06:45

    如何使用Paddle2ONNX模型转换工具将飞桨模型转换为ONNX模型

    如何使用Paddle2ONNX模型转换工具将飞桨模型转换为ONNX模型
    发表于 12-29 07:42

    yolov5-face的pt模型是怎样转为onnx模型

    yolov5-face的pt模型是怎样转为onnx模型的?有哪些转换步骤?
    发表于 02-21 07:19

    EIQ onnx模型转换为tf-lite失败怎么解决?

    我们正在尝试将 tflite 框架与 npu 一起使用来进行机器学习。这是我们的步骤:1)用pytorch训练一个模型2) 以onnx格式导出模型3) eiq工具的covnert
    发表于 03-31 08:03

    yolov7 onnx模型在NPU上太慢了怎么解决?

    我将 yolov7tiny.pt(yolov7-tiny 模型)转换为具有 uint8 权重的 yolov7tiny.onnx,然后在 i.MX 8M Plus NPU 上运行
    发表于 04-04 06:13

    ONNX模型转换为中间表示(IR)后,精度下降了怎么解决?

    ONNX 模型转换为 IR。 与使用 PyTorch 运行 ONNX 模型相比,Ran IR 采用 基准 C++ 工具,其性能准确率降低了 20%。 无法确定如何对图像进行预处理
    发表于 08-15 08:28

    将YOLOv5 ONNX模型转换为中间表示(IR)格式时,收到与节点相关的错误怎么解决

    将 YOLOv5 ONNX 模型转换为 IR 格式:python /opt/intel/openvino_2021/deployment_tools/model_optimizer/mo.py
    发表于 08-15 08:14

    将TensorFlow Lite模型转换为ONNX

    由 Facebook 和 Microsoft 创建的开放格式神经网络交换格式 ONNX,是一种用于表示机器学习模型
    的头像 发表于 12-08 23:19 1349次阅读

    YOLOX目标检测模型的推理部署

    旷视科技开源了内部目标检测模型-YOLOX,性能与速度全面超越YOLOv5早期版本!
    的头像 发表于 04-16 23:00 2959次阅读

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

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

    通过新的ONNX导出器简化模型导出流程

    大家好。我叫Manav Dalal,今天我将讲解如何通过新的ONNX导出器简化模型导出流程。如果你还没有听说过ONNX,它是一种用于表示机器学习模型的开放
    的头像 发表于 01-10 09:45 866次阅读
    通过新的<b class='flag-5'>ONNX</b>导出器简化<b class='flag-5'>模型</b>导出流程