0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

YOLOX模型ONNX格式說明

我快閉嘴 ? 來源:OpenCV學(xué)堂 ? 作者: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預(yù)測得分,后面80個是COCO類別。

02

什么是8400

模型在數(shù)據(jù)輸入端幾乎與YOLOv5的代碼一致,沒有什么特別之處,唯一不同的在于輸出層的解析,是把三個不同的輸出層合并在一個里面了,分別是80x80, 40x40, 20x20, 每個特征點預(yù)測,所以總數(shù)才會是80x80+40x40+20x20 =8400

03

輸出層解析解密

最后一層輸出,這點跟YOLOv5最新版本輸出層有點相似,但是YOLOv5的輸出層更近一步,已經(jīng)計算了相關(guān)的矩形框位置信息,直接輸出就是絕對位置信息,而YOLOX還是輸出原始的相對位置信息,需要解析一波才行(跟最新的YOLOv5相同),說明YOLOX的工程化方面還有待提升!不是開源就完事了!

OpenVINO推理解析

必須說明一點,參考了官方的部分代碼,然后在上面猛改一通(原因是官方代碼寫的不是很好),改完之后,封裝成一個類了,主要的方法跟我封裝的YOLOv5的推理類相似,導(dǎo)出了兩個函數(shù)方法

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

該方法表示初始化IE,然后加載模型,設(shè)置nms閾值與置信度閾值score,創(chuàng)建一個推理請求,同時初始化每一層上對應(yīng)每個特征點尺度比率。這部分的代碼如下:

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);
}

檢測函數(shù)

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

該方法完成檢測,并把檢測結(jié)果作為resulte返回,相關(guān)的代碼實現(xiàn)可以參考之前的文章,感覺并沒有什么不同,其中最大的不同的地方是對輸出結(jié)果的解析,這邊代碼作為單獨的方法函數(shù)實現(xiàn)如下(參考官方):

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_idxconstintgrid0=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_idxfloatbox_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);
}
}
}
}

最終調(diào)用該類實現(xiàn)推理就顯得特別簡單,對圖像跟視頻都是一樣,使用下面的代碼:

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

最后我發(fā)現(xiàn)在onnxruntime上面也一樣可以,基本上重用了大部分的代碼,然后把它們與我之前寫YOLOv5+QT的演示整合了一下,這樣就變成YOLOv5+YOLOx支持OpenVINO/ONNXRUNTIME全部可行的推理,可以自由的通過界面切換!

運行結(jié)果如下(請允許我show一下界面):

YOLOX模型ONNX格式說明

YOLOX模型ONNX格式說明

YOLOX模型ONNX格式說明

掃碼查看OpenCV+Pytorch系統(tǒng)化學(xué)習(xí)路線圖

原文標題:OpenVINO +YOLOX最新版本推理演示

文章出處:【微信公眾號:OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 格式
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    16893
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3248

    瀏覽量

    48864
  • 推理
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    7268
收藏 人收藏

    評論

    相關(guān)推薦

    cubemx ai導(dǎo)入onnx模型后壓縮失敗了怎么解決?

    cubemx ai導(dǎo)入onnx模型后壓縮失敗。請問我怎么解決
    發(fā)表于 03-19 07:58

    STM CUBE AI錯誤導(dǎo)入onnx模型報錯的原因?

    使用cube-AI分析模型時報錯,該模型是pytorch的cnn轉(zhuǎn)化成onnx ``` Neural Network Tools for STM32AI v1.7.0 (STM.ai v8.0.0-19389) INTER
    發(fā)表于 05-27 07:15

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

    yolox_bytetrack_osd_encode示例自帶的模型如下,我看示例里面yolox_group.json、yolox_infer.json、
    發(fā)表于 07-05 07:51

    深度探索ONNX模型部署 精選資料分享

    這篇文章從多個角度探索了ONNX,從ONNX的導(dǎo)出到ONNX和Caffe的對比,以及使用ONNX遭遇的困難以及一些解決辦法,另...
    發(fā)表于 07-20 07:41

    ONNX的相關(guān)資料分享

    ONNX文件并生成特定平臺和運行框架所支持的神經(jīng)網(wǎng)絡(luò)模型。ONNX本身不是AI神經(jīng)網(wǎng)絡(luò)運行框架,只是AI神經(jīng)網(wǎng)絡(luò)模型通用中間描述文件格式Gi
    發(fā)表于 11-05 06:45

    如何使用Paddle2ONNX模型轉(zhuǎn)換工具將飛槳模型轉(zhuǎn)換為ONNX模型?

    如何使用Paddle2ONNX模型轉(zhuǎn)換工具將飛槳模型轉(zhuǎn)換為ONNX模型?
    發(fā)表于 12-29 07:42

    yolov5-face的pt模型是怎樣轉(zhuǎn)為onnx模型

    yolov5-face的pt模型是怎樣轉(zhuǎn)為onnx模型的?有哪些轉(zhuǎn)換步驟?
    發(fā)表于 02-21 07:19

    EIQ onnx模型轉(zhuǎn)換為tf-lite失敗怎么解決?

    我們正在嘗試將 tflite 框架與 npu 一起使用來進行機器學(xué)習(xí)。這是我們的步驟:1)用pytorch訓(xùn)練一個模型2) 以onnx格式導(dǎo)出模型3) eiq工具的covnert
    發(fā)表于 03-31 08:03

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

    我將 yolov7tiny.pt(yolov7-tiny 模型)轉(zhuǎn)換為具有 uint8 權(quán)重的 yolov7tiny.onnx,然后在 i.MX 8M Plus NPU 上運行
    發(fā)表于 04-04 06:13

    ONNX模型轉(zhuǎn)換為中間表示(IR)后,精度下降了怎么解決?

    ONNX 模型轉(zhuǎn)換為 IR。 與使用 PyTorch 運行 ONNX 模型相比,Ran IR 采用 基準 C++ 工具,其性能準確率降低了 20%。 無法確定如何對圖像進行預(yù)處理
    發(fā)表于 08-15 08:28

    將YOLOv5 ONNX模型轉(zhuǎn)換為中間表示(IR)格式時,收到與節(jié)點相關(guān)的錯誤怎么解決

    將 YOLOv5 ONNX 模型轉(zhuǎn)換為 IR 格式:python /opt/intel/openvino_2021/deployment_tools/model_optimizer/mo.py
    發(fā)表于 08-15 08:14

    將TensorFlow Lite模型轉(zhuǎn)換為ONNX

    由 Facebook 和 Microsoft 創(chuàng)建的開放格式神經(jīng)網(wǎng)絡(luò)交換格式 ONNX,是一種用于表示機器學(xué)習(xí)模型。
    的頭像 發(fā)表于 12-08 23:19 ?1407次閱讀

    YOLOX目標檢測模型的推理部署

    曠視科技開源了內(nèi)部目標檢測模型-YOLOX,性能與速度全面超越Y(jié)OLOv5早期版本!
    的頭像 發(fā)表于 04-16 23:00 ?3011次閱讀

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

    ? ONNXRUNTIME介紹 ONNX格式模型部署兼容性最強的框架 ONNXRUNTIME,基本上不會有算子不支持跟不兼容的情況出現(xiàn),只要能導(dǎo)出ONNX
    的頭像 發(fā)表于 06-19 11:50 ?2542次閱讀
    <b class='flag-5'>ONNX</b><b class='flag-5'>格式</b><b class='flag-5'>模型</b>部署兼容性框架介紹

    通過新的ONNX導(dǎo)出器簡化模型導(dǎo)出流程

    大家好。我叫Manav Dalal,今天我將講解如何通過新的ONNX導(dǎo)出器簡化模型導(dǎo)出流程。如果你還沒有聽說過ONNX,它是一種用于表示機器學(xué)習(xí)模型的開放
    的頭像 發(fā)表于 01-10 09:45 ?962次閱讀
    通過新的<b class='flag-5'>ONNX</b>導(dǎo)出器簡化<b class='flag-5'>模型</b>導(dǎo)出流程