使用腾讯的NCNN框架推理YOLOX
ncnn是腾讯自己开发的一款开源神经网络推理框架,从设计之初就是为了手机端的应用,现在已经支持全平台(Android、鸿蒙、iOS、MacOS、Linux)、(x86、ARM、riscv、loongarch),提供的预编译二进制文件基本上是囊括了市面上能见到的所有系统和架构,如果没有还能自己编译需要的版本 https://github.com/Tencent/ncnn/wiki/how-to-build
纯C++、无第三方库,还支持大小核调度优化,并且支持Vulkan API GPU 加速!
适用性多么好我就不说了,简直就是,具体可以看官方的README https://github.com/Tencent/ncnn
原本我是使用了OpenCV的DNN来推理,但是官方发布的预编译文件不提供包含CUDA,所以都得手动编译来获得CUDA加速特性。而且平时使用时经常会更换CUDA版本,为此还得给每个版本都编译一个OpenCV,不仅是CUDA版本,OpenCV在版本之间也是不兼容的,所以现在使用的预编译好的库早已是八百年前的版本。在发布时还得带上CUDA Runtime,整个系统包就显得十分臃肿。
尽早脱离编译苦海才是正道,所以ncnn简直是完美的替代方案。
使用前准备
首先下载ncnn提供的预编译文件: https://github.com/Tencent/ncnn/releases
根据自己的目标来下载,里面包含了二进制库文件,还有工具文件
比如下载了windows的预编译包,则包含arm、arm64、x64、x86四种架构的预编译文件
每个架构下都提供了编译完成的库文件和工具文件,内含一系列的模型转换工具、量化工具、优化模型文件工具和合并模型文件工具等。
转化模型
首先将yolox训练完的Torch文件转换为Onnx文件:
python tools/export_onnx.py --output-name yolox_1280.onnx -f .\exps\example\yolox_voc\yolox_voc_l_1280x.py -c D:\python\model\best_ckpt.pth
使用
onnx2ncnn.exe
将onnx转为ncnn格式模型文件
onnx2ncnn.exe D:\python\YOLOX\yolox_1280.onnx model.param model.bin
此时会提示
Unsupported slice step !
因为注意力模块在ncnn中并不支持,所以需要自己在代码中实现这一层。
修改模型
打开model.param
我使用的是yolox-l,这看起来和官方给的转化demo有点不一样,但是实际上结构是完全相同的。
删除Input层后的10层,添加自定义层
YoloV5Focus
images
输出到
YoloV5Focus
层,处理后再输出到
/backbone/backbone/stem/Concat_output_0
层。
再修改第二行的359层数为350,因为删除了10层并添加了一层。
在代码中实现YoloV5Focus
同时创建一个工厂函数用于ncnn来调用