本期講解便是基于 Tengine 實現(xiàn) yolov4的 cpu推理。
完成動機:
主要是為了熟悉tengine的推理部署流程
一、模型轉(zhuǎn)換
采用下面鏈接中yolov4的模型權(quán)重和配置文件
https://github.com/ultralytics/yolov3github.com
源模型使用的是darknet格式,因為yolov4新增了mish算子,所以需要增加對應(yīng)算子的序列化代碼才能正常轉(zhuǎn)換,下面是我的代碼改動,基本按照tanh算子進行相應(yīng)增加。
https://github.com/zjd1988/Tengine-Convert-Toolsgithub.com
convert tools增加算子的詳細流程,參考官方增加自定義算子步驟:
(1)在operator/include/operator目錄下增加mish.hpp 和mish/_param.hpp/_文件,/_由于mish算子不需要額外的參數(shù)配置,因此mish/_para.hpp并沒有添加。mish.hpp內(nèi)容可以參考其他類似沒有參數(shù)配置的算子(比如tanh),在operator/operator 目錄下增加mish.cpp,增加算子實現(xiàn)代碼;
(2)在operator/operator目錄下增加mish算子內(nèi)存分配的代碼,因為mish算子不涉及這部分修改,并未做任何修改
(3)在operator/operator/plugin/init.cpp文件中的operator/_plugin/_init函數(shù)中增加算子的注冊函數(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ù)實現(xiàn),同時在LoadTmOpFunc函數(shù)中增加調(diào)用LoadTmMishOp的邏輯代碼;
(4-3)在serializer/tengine/v2/tm2/_op/_save.cpp文件中增加SaveTmMishOp函數(shù)實現(xiàn),同時在SaveTmReorgOp函數(shù)中增加調(diào)用SaveTmMishOp的邏輯代碼;
(4-4)在serializer/tengine/v2/tm2/_op/_serializer.hpp,增加LoadTmMishOp和 SaveTmMishOp的函數(shù)聲明
(4-5)本次轉(zhuǎn)換模型針對darknet,所以需要對tools/darknet/darknet/_serializer.cpp文件中增加mish算子解析的相應(yīng)邏輯。 因為mish沒有單獨使用,而是作為conv的激活函數(shù)調(diào)用,所以是在LoadConv2D函數(shù)參照leaky增加相應(yīng)的代碼。其他單獨算子的實現(xiàn)也可以參考其他類似算子的實現(xiàn)方式
完成代碼改動后,按照如下操作進行編譯,即可生成轉(zhuǎn)換工具
mkdir build && cd build cmake .. make -j4 && make install
最后執(zhí)行轉(zhuǎn)換動作(提前準備好模型文件)
./install/bin/tm_convert_tool -f darknet -p yolov4.cfg -m yolov4.weights -o yolov4.tmfile
二、推理
官方代碼鏈接下的readme并沒有找到介紹如何新增算子,但是可以參考類似算子進行修改添加,下面是我參考tanh算子的實現(xiàn),進行的修改
(1-1)在inlcude/tengine/_op.h中增加mish的枚舉定義,include/tengine/_op/_name.h中增加mish的字符串宏定義
(1-2)在src/op/mish.c中增加mish算子的注冊函數(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算子實現(xiàn)代碼目錄,包括mish/_ref.c(x86)、mish/_hcl/_arm.c(arm),其中contex-a目錄下的文件為具體的kernel實現(xiàn)代碼
也可以參考下面的鏈接,查看有哪些代碼改動和文件增加:
https://github.com/zjd1988/Tenginegithub.com
測試
測試圖片使用的是標題中的圖片(512x384)test.jpg
測試代碼使用的官方代碼
examples/tm_yolov3_tiny.cpp
做了簡單修改。
三、后續(xù)
(1)合并conv和mish算子
(2)后續(xù)抽空新增一個需要配置參數(shù)的算子
四、使用感受
(1)模型轉(zhuǎn)換和推理分離,新增算子需要增加兩次,官方回復(fù)會后續(xù)考慮合并,希望會越來越方便
(2)推理引擎編譯速度快(本文目的不在于測試性能,只是驗證tengine在推理yolov4的正確性)
(3)代碼結(jié)構(gòu)清晰,便于閱讀和調(diào)試
以上便是解答過程以及使用感受。
更多Tengine相關(guān)內(nèi)容請關(guān)注Tengine-邊緣AI推理框架專欄。
審核編輯 黃昊宇
-
cpu
+關(guān)注
關(guān)注
68文章
10854瀏覽量
211576 -
Tengine
+關(guān)注
關(guān)注
1文章
47瀏覽量
2845
發(fā)布評論請先 登錄
相關(guān)推薦
評論