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

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

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

基于Tengine實(shí)現(xiàn)yolov4的cpu推理講解

電子設(shè)計(jì) ? 來源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2020-12-15 00:19 ? 次閱讀

本期講解便是基于 Tengine 實(shí)現(xiàn) yolov4的 cpu推理。

完成動(dòng)機(jī):

主要是為了熟悉tengine的推理部署流程

一、模型轉(zhuǎn)換

采用下面鏈接中yolov4的模型權(quán)重和配置文件

https://github.com/ultralytics/yolov3github.com

源模型使用的是darknet格式,因?yàn)閥olov4新增了mish算子,所以需要增加對(duì)應(yīng)算子的序列化代碼才能正常轉(zhuǎn)換,下面是我的代碼改動(dòng),基本按照tanh算子進(jìn)行相應(yīng)增加。

https://github.com/zjd1988/Tengine-Convert-Toolsgithub.com

convert tools增加算子的詳細(xì)流程,參考官方增加自定義算子步驟:

(1)在operator/include/operator目錄下增加mish.hpp 和mish/_param.hpp/_文件,/_由于mish算子不需要額外的參數(shù)配置,因此mish/_para.hpp并沒有添加。mish.hpp內(nèi)容可以參考其他類似沒有參數(shù)配置的算子(比如tanh),在operator/operator 目錄下增加mish.cpp,增加算子實(shí)現(xiàn)代碼;

(2)在operator/operator目錄下增加mish算子內(nèi)存分配的代碼,因?yàn)閙ish算子不涉及這部分修改,并未做任何修改

(3)在operator/operator/plugin/init.cpp文件中的operator/_plugin/_init函數(shù)中增加算子的注冊(cè)函數(shù)調(diào)用

(4)增加mish算子序列化和解析代碼

(4-1)在serializer/include/tengine/v2/tm2/_format.h中增加mish的類型宏定義和字符串宏定義 ;
(4-2)在serializer/tengine/v2/tm2/_op/_load.cpp文件中增加LoadTmMishOp函數(shù)實(shí)現(xiàn),同時(shí)在LoadTmOpFunc函數(shù)中增加調(diào)用LoadTmMishOp的邏輯代碼;
(4-3)在serializer/tengine/v2/tm2/_op/_save.cpp文件中增加SaveTmMishOp函數(shù)實(shí)現(xiàn),同時(shí)在SaveTmReorgOp函數(shù)中增加調(diào)用SaveTmMishOp的邏輯代碼;
(4-4)在serializer/tengine/v2/tm2/_op/_serializer.hpp,增加LoadTmMishOp和 SaveTmMishOp的函數(shù)聲明

(4-5)本次轉(zhuǎn)換模型針對(duì)darknet,所以需要對(duì)tools/darknet/darknet/_serializer.cpp文件中增加mish算子解析的相應(yīng)邏輯。 因?yàn)閙ish沒有單獨(dú)使用,而是作為conv的激活函數(shù)調(diào)用,所以是在LoadConv2D函數(shù)參照l(shuí)eaky增加相應(yīng)的代碼。其他單獨(dú)算子的實(shí)現(xiàn)也可以參考其他類似算子的實(shí)現(xiàn)方式

完成代碼改動(dòng)后,按照如下操作進(jìn)行編譯,即可生成轉(zhuǎn)換工具

mkdir build && cd build
cmake ..
make -j4 && make install

最后執(zhí)行轉(zhuǎn)換動(dòng)作(提前準(zhǔn)備好模型文件)

./install/bin/tm_convert_tool -f darknet -p yolov4.cfg -m yolov4.weights -o yolov4.tmfile

二、推理

官方代碼鏈接下的readme并沒有找到介紹如何新增算子,但是可以參考類似算子進(jìn)行修改添加,下面是我參考tanh算子的實(shí)現(xiàn),進(jìn)行的修改

(1-1)在inlcude/tengine/_op.h中增加mish的枚舉定義,include/tengine/_op/_name.h中增加mish的字符串宏定義
(1-2)在src/op/mish.c中增加mish算子的注冊(cè)函數(shù)
(1-3)在src/serializer/tm/tm2/_format.h 和src/serializer/tm/op/tm2/_mish.c 中增加序列化相關(guān)代碼,

note:src/serializer/tm/tm2/_format.h中定義算子的類型數(shù)值需要跟convert/_tools下的serializer/include/tengine/v2/tm2/_format.h代碼保持一致

(1-4)在src/dev/cpu/op/目錄下增加mish算子實(shí)現(xiàn)代碼目錄,包括mish/_ref.c(x86)、mish/_hcl/_arm.c(arm),其中contex-a目錄下的文件為具體的kernel實(shí)現(xiàn)代碼

也可以參考下面的鏈接,查看有哪些代碼改動(dòng)和文件增加:

https://github.com/zjd1988/Tenginegithub.com

測(cè)試

測(cè)試圖片使用的是標(biāo)題中的圖片(512x384)test.jpg
測(cè)試代碼使用的官方代碼

examples/tm_yolov3_tiny.cpp

做了簡(jiǎn)單修改。

三、后續(xù)

(1)合并conv和mish算子
(2)后續(xù)抽空新增一個(gè)需要配置參數(shù)的算子

四、使用感受

(1)模型轉(zhuǎn)換和推理分離,新增算子需要增加兩次,官方回復(fù)會(huì)后續(xù)考慮合并,希望會(huì)越來越方便
(2)推理引擎編譯速度快(本文目的不在于測(cè)試性能,只是驗(yàn)證tengine在推理yolov4的正確性)
(3)代碼結(jié)構(gòu)清晰,便于閱讀和調(diào)試

以上便是解答過程以及使用感受。

更多Tengine相關(guān)內(nèi)容請(qǐng)關(guān)注Tengine-邊緣AI推理框架專欄。

審核編輯 黃昊宇

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

    關(guān)注

    68

    文章

    10768

    瀏覽量

    210418
  • Tengine
    +關(guān)注

    關(guān)注

    1

    文章

    47

    瀏覽量

    2825
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RK3588 技術(shù)分享 | 在Android系統(tǒng)中使用NPU實(shí)現(xiàn)Yolov5分類檢測(cè)-迅為電子

    RK3588 技術(shù)分享 | 在Android系統(tǒng)中使用NPU實(shí)現(xiàn)Yolov5分類檢測(cè)-迅為電子
    的頭像 發(fā)表于 08-23 14:58 ?460次閱讀
    RK3588 技術(shù)分享 | 在Android系統(tǒng)中使用NPU<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>Yolov</b>5分類檢測(cè)-迅為電子

    RK3588 技術(shù)分享 | 在Android系統(tǒng)中使用NPU實(shí)現(xiàn)Yolov5分類檢測(cè)

    隨著人工智能和大數(shù)據(jù)時(shí)代的到來,傳統(tǒng)嵌入式處理器中的CPU和GPU逐漸無法滿足日益增長(zhǎng)的深度學(xué)習(xí)需求。為了應(yīng)對(duì)這一挑戰(zhàn),在一些高端處理器中,NPU(神經(jīng)網(wǎng)絡(luò)處理單元)也被集成到了處理器里。NPU
    發(fā)表于 08-20 11:13

    基于迅為RK3588【RKNPU2項(xiàng)目實(shí)戰(zhàn)1】:YOLOV5實(shí)時(shí)目標(biāo)分類

    [/url] 【RKNPU2 人工智能開發(fā)】 【AI深度學(xué)習(xí)推理加速器】——RKNPU2 從入門到實(shí)踐(基于RK3588和RK3568) 【RKNPU2項(xiàng)目實(shí)戰(zhàn)1】:YOLOV5實(shí)時(shí)目標(biāo)分類 【RKNPU2項(xiàng)目實(shí)戰(zhàn)2】:SORT目標(biāo)追蹤 【RKNPU2項(xiàng)目實(shí)戰(zhàn)3】車牌識(shí)別
    發(fā)表于 08-15 10:51

    手冊(cè)上新 |迅為RK3568開發(fā)板NPU例程測(cè)試

    rknn-toolkit-lite2環(huán)境搭建和使用 3.1 rknn-toolkit-lite2環(huán)境搭建 3.1.1 直接安裝 3.1.2 conda虛擬環(huán)境安裝 3.2 rknn-toolkit-lite2推理測(cè)試 第4
    發(fā)表于 08-12 11:03

    英特爾助力京東云用CPU加速AI推理,以大模型構(gòu)建數(shù)智化供應(yīng)鏈

    英特爾助力京東云用CPU加速AI推理,以大模型構(gòu)建數(shù)智化供應(yīng)鏈
    的頭像 發(fā)表于 05-27 11:50 ?434次閱讀
    英特爾助力京東云用<b class='flag-5'>CPU</b>加速AI<b class='flag-5'>推理</b>,以大模型構(gòu)建數(shù)智化供應(yīng)鏈

    基于OpenCV DNN實(shí)現(xiàn)YOLOv8的模型部署與推理演示

    基于OpenCV DNN實(shí)現(xiàn)YOLOv8推理的好處就是一套代碼就可以部署在Windows10系統(tǒng)、烏班圖系統(tǒng)、Jetson的Jetpack系統(tǒng)
    的頭像 發(fā)表于 03-01 15:52 ?1197次閱讀
    基于OpenCV DNN<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>YOLOv</b>8的模型部署與<b class='flag-5'>推理</b>演示

    YOLOv8+PyQT5打造細(xì)胞計(jì)數(shù)與識(shí)別應(yīng)用說明

    YOLOv8對(duì)象檢測(cè)模型基于自定義數(shù)據(jù)集訓(xùn)練紅白細(xì)胞檢測(cè)模型,然后通過工具導(dǎo)出模型為ONNX,基于OpenVINO實(shí)現(xiàn)模型推理,完成細(xì)胞檢測(cè)識(shí)別,根據(jù)檢測(cè)到的細(xì)胞類別與數(shù)目,統(tǒng)計(jì),在PyQT5打造的界面上顯示輸出檢測(cè)結(jié)果。
    的頭像 發(fā)表于 01-15 17:22 ?967次閱讀
    <b class='flag-5'>YOLOv</b>8+PyQT5打造細(xì)胞計(jì)數(shù)與識(shí)別應(yīng)用說明

    深入淺出Yolov3和Yolov4

    Yolov3是目標(biāo)檢測(cè)Yolo系列非常非常經(jīng)典的算法,不過很多同學(xué)拿到Yolov3或者Yolov4的cfg文件時(shí),并不知道如何直觀的可視化查看網(wǎng)絡(luò)結(jié)構(gòu)。
    的頭像 發(fā)表于 01-11 10:42 ?674次閱讀
    深入淺出<b class='flag-5'>Yolov</b>3和<b class='flag-5'>Yolov4</b>

    基于YOLOv8實(shí)現(xiàn)自定義姿態(tài)評(píng)估模型訓(xùn)練

    Hello大家好,今天給大家分享一下如何基于YOLOv8姿態(tài)評(píng)估模型,實(shí)現(xiàn)在自定義數(shù)據(jù)集上,完成自定義姿態(tài)評(píng)估模型的訓(xùn)練與推理
    的頭像 發(fā)表于 12-25 11:29 ?2616次閱讀
    基于<b class='flag-5'>YOLOv</b>8<b class='flag-5'>實(shí)現(xiàn)</b>自定義姿態(tài)評(píng)估模型訓(xùn)練

    在C++中使用OpenVINO工具包部署YOLOv5-Seg模型

    YOLOv5兼具速度和精度,工程化做的特別好,Git clone到本地即可在自己的數(shù)據(jù)集上實(shí)現(xiàn)目標(biāo)檢測(cè)任務(wù)的訓(xùn)練和推理,在產(chǎn)業(yè)界中應(yīng)用廣泛。開源社區(qū)對(duì)YOLOv5支持實(shí)例分割的呼聲高漲
    的頭像 發(fā)表于 12-21 10:17 ?1951次閱讀
    在C++中使用OpenVINO工具包部署<b class='flag-5'>YOLOv</b>5-Seg模型

    【愛芯派 Pro 開發(fā)板試用體驗(yàn)】ax650使用ax-pipeline進(jìn)行推理

    /runVoHook.sh即可恢復(fù)原樣 本例子使用讀取視頻MP4,調(diào)用npu推理到hdmi顯示 ./sample_demux_ivps_npu_hdmi_vo -p config/yolov5s.json -f test.mp
    發(fā)表于 12-19 17:36

    HarmonyOS:使用MindSpore Lite引擎進(jìn)行模型推理

    ); OH_AI_ContextSetThreadAffinityMode(context, 1); //設(shè)置運(yùn)行設(shè)備為CPU,不使用Float16推理 OH_AI_DeviceInfoHandle cpu
    發(fā)表于 12-14 11:41

    YOLOV7網(wǎng)絡(luò)架構(gòu)解讀

    繼美團(tuán)發(fā)布YOLOV6之后,YOLO系列原作者也發(fā)布了YOLOV7。
    的頭像 發(fā)表于 11-29 10:00 ?1685次閱讀
    <b class='flag-5'>YOLOV</b>7網(wǎng)絡(luò)架構(gòu)解讀

    詳細(xì)解讀YOLOV7網(wǎng)絡(luò)架構(gòu)設(shè)計(jì)

    YOLOV7提出了輔助頭的一個(gè)訓(xùn)練方法,主要目的是通過增加訓(xùn)練成本,提升精度,同時(shí)不影響推理的時(shí)間,因?yàn)檩o助頭只會(huì)出現(xiàn)在訓(xùn)練過程中。
    發(fā)表于 11-27 10:45 ?700次閱讀
    詳細(xì)解讀<b class='flag-5'>YOLOV</b>7網(wǎng)絡(luò)架構(gòu)設(shè)計(jì)

    【LuckFox Pico Plus開發(fā)板免費(fèi)試用】RKNN模型推理測(cè)試

    為開發(fā)者提供一個(gè)簡(jiǎn)單且高效的開發(fā)平臺(tái)。雖然LuckFox Pico作為入門級(jí)開發(fā)板只有幾十塊錢,但是它具有人工智能協(xié)處理器NPU,也可以實(shí)現(xiàn)人工智能的推理工作。瑞芯微 RV1103芯片采用了和RK3568
    發(fā)表于 11-11 16:51