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