本期講解便是基于 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ù)參照leaky增加相應(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推理框架專欄。
審核編輯 黃昊宇
-
cpu
+關(guān)注
關(guān)注
68文章
10908瀏覽量
213087 -
Tengine
+關(guān)注
關(guān)注
1文章
47瀏覽量
2883
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論