本期講解便是基于 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并沒(méi)有添加。mish.hpp內(nèi)容可以參考其他類(lèi)似沒(mé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的類(lèi)型宏定義和字符串宏定義 ;
(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沒(méi)有單獨(dú)使用,而是作為conv的激活函數(shù)調(diào)用,所以是在LoadConv2D函數(shù)參照l(shuí)eaky增加相應(yīng)的代碼。其他單獨(dú)算子的實(shí)現(xiàn)也可以參考其他類(lèi)似算子的實(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并沒(méi)有找到介紹如何新增算子,但是可以參考類(lèi)似算子進(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中定義算子的類(lèi)型數(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ì)越來(lái)越方便
(2)推理引擎編譯速度快(本文目的不在于測(cè)試性能,只是驗(yàn)證tengine在推理yolov4的正確性)
(3)代碼結(jié)構(gòu)清晰,便于閱讀和調(diào)試
以上便是解答過(guò)程以及使用感受。
更多Tengine相關(guān)內(nèi)容請(qǐng)關(guān)注Tengine-邊緣AI推理框架專(zhuān)欄。
審核編輯 黃昊宇
-
cpu
+關(guān)注
關(guān)注
68文章
11074瀏覽量
216932 -
Tengine
+關(guān)注
關(guān)注
1文章
47瀏覽量
3082
發(fā)布評(píng)論請(qǐng)先 登錄
在K230上部署yolov5時(shí) 出現(xiàn)the array is too big的原因?
RK3576 yolov11-seg訓(xùn)練部署教程

labview調(diào)用yolo目標(biāo)檢測(cè)、分割、分類(lèi)、obb
【幸狐Omni3576邊緣計(jì)算套件試用體驗(yàn)】RKNN 推理測(cè)試與圖像識(shí)別
YOLOv5類(lèi)中rgb888p_size這個(gè)參數(shù)要與模型推理和訓(xùn)練的尺寸一致嗎?一致會(huì)達(dá)到更好的效果?
模型無(wú)法獲得mAP值等于1.00的原因是什么?
將YOLOv4模型轉(zhuǎn)換為IR的說(shuō)明,無(wú)法將模型轉(zhuǎn)換為T(mén)ensorFlow2格式怎么解決?
為什么深度學(xué)習(xí)中的Frame per Second高于OpenVINO?演示推理腳本?
為什么在Ubuntu20.04上使用YOLOv3比Yocto操作系統(tǒng)上的推理快?
CPU推理:AI算力配置新范式

AI推理CPU當(dāng)?shù)溃珹rm驅(qū)動(dòng)高效引擎

YOLOv6在LabVIEW中的推理部署(含源碼)

評(píng)論