Yolo-Fastest + TNN
本文记录使用TNN推理Yolo-Fastest完整过程。
Yolo-Fastest的Git地址:https://github.com/dog-qiuqiu/Yolo-Fastest
TNN的Git地址:https://github.com/Tencent/TNN
TNN编译
TNN提供了在Linux下一键编译的脚本build_linux.sh,编译完成后,build目录下会生成测试可执行文件test/TNNTest,可在Linux下直接运行。
添加Mem Dump
TNN提供了可以Dump中间层每一层输出的工具Mem Dump,在源码添加相关接口并增加相关配置:https://github.com/Tencent/TNN/pull/353
官方提供的Dump工具写在条件编译指令里:
因此需要在编译脚本中打开Dump开关,在CmakeList中查到相关内容:
if(TNN_QUANTIZATION_ENABLE OR TNN_MODEL_CHECK_ENABLE)
set(TNN_SYMBOL_HIDE OFF)
add_definitions(-DFORWARD_CALLBACK_ENABLE)
endif()
在build_linux.sh中修改或添加对应的编译开关。
在测试Dump工具时发现无法Dump卷积的输出,可能跟TNN的模型优化有关:
/*
* The NetOptimizeManager holds a list of network optimization processes.
* The optimization process may change the network structure accoundingly.
* eg. fuse conv+bn, conv+relu.
*/
{
// use mutex to protect net_resource and net_structure in multi-thread
std::unique_lock<std::mutex> lck(optimize_mtx_);
ret = optimizer::NetOptimizerManager::Optimize(net_structure, net_resource, net_config.device_type);
if (ret != TNN_OK) {
return ret;
}
}
TNN模型转换
官方提供的TNN模型的转换工具和转换方法:
本文直接拉取的构建好的docker镜像进行转换,也可自行编译。
Yolo-Fastest模型转换
由于种种原因,需要将Yolo-Fastest转换为caffe模型,官方也提供了转换工具Darknet2Caffe。由于源码编译的Caffe不支持upsample算子,需要在caffe源码中添加upsample算子,重新编译CPU版本的Caffe。然后使用转换工具即可。
使用TNN推理Yolo-Fastest
一开始使用TNN的时候,以为-ip参数添加输入文件可以直接读图片,之后发现-ip添加的是文件流的路径,将输入图片以RGB格式读取,然后将其转换为TNN默认的排布格式NCHW。
Yolo-Fastest对图片做的预处理为归一化,将预处理后的图片数据以文件流格式送入TNN即可。