🥇 YOLOX Deployment


👋 ncnn in C++

整个步骤过程如下:

yolox_s.pth --》 yolox.onnx --》 yolox.param + yolox.bin --》yolox-opt.param + yolox-opt.bin

所参考教程

  • YOLOX/tree/main/demo/ncnn/cpp
  • 本博文基本按照该文档进行撰写记录

📙 环境搭建


环境搭建主要包括

  • YOLOX 环境搭建
  • ncnn 编译安装环境
  • 有兴趣可参考如上两篇博文即可,此处不再赘述

📙 Step1 【ncnn 极简编译安装】


git clone https://github.com/Tencent/ncnn.git

cd ncnn

mkdir build

cmake ..

make -j

📙 Step2【 Use provided tools to generate onnx file 】


cd yoloDir/YOLOX

python3 tools/export_onnx.py -n yolox-s

# 输出如下

2021-08-xx 02:05:03.438 | INFO     | __main__:main:89 - generated onnx model named yolox.onnx
2021-08-xx 02:05:05.206 | INFO     | __main__:main:101 - generated simplified onnx model named yolox.onnx



# ll 查看 可以发现,已经成功得到 simplified onnx

yolox.onnx

📙 Step3【Generate ncnn param and bin file.】


cd ncnn
cd build/tools/ncnn

# copy 模型至当前目录
cp  xx/yolox.onnx .
./onnx2ncnn yolox.onnx yolox.param yolox.bin

# 运行输出如下

Unsupported slice step !
Unsupported slice step !
Unsupported slice step !
Unsupported slice step !
Unsupported slice step !
Unsupported slice step !
Unsupported slice step !
Unsupported slice step !

这一部分的理解

YOLOX (pytorch)模型 转 ONNX 转 ncnn 之C++运行推理【️YOLOX 实战三️】_bash


📙 Step4【Open yolox.param 对其进行修正】


YOLOX (pytorch)模型 转 ONNX 转 ncnn 之C++运行推理【️YOLOX 实战三️】_bash_02

YOLOX (pytorch)模型 转 ONNX 转 ncnn 之C++运行推理【️YOLOX 实战三️】_深度学习_03


📙 Step5 【Use ncnn_optimize to generate new param and bin】


最后的 flag 如果是 0 指的的是 fp32,如果是 1 指的是 fp16

# 我们仍然在这个目录下进行操作即可

cd ncnn/build/tools/onnx

../ncnnoptimize yolox.param yolox.bin yolox-opt.param yolox-opt.bin 1

# 运行输出如下

create_custom_layer YoloV5Focus
fuse_convolution_activation Conv_254 Sigmoid_264
fuse_convolution_activation Conv_262 Sigmoid_263
fuse_convolution_activation Conv_275 Sigmoid_285
fuse_convolution_activation Conv_283 Sigmoid_284
fuse_convolution_activation Conv_296 Sigmoid_306
fuse_convolution_activation Conv_304 Sigmoid_305
model has custom layer, shape_inference skipped
model has custom layer, estimate_memory_footprint skipped

📙 Step6 【 运行测试 刚刚优化后的 yolox-opt.param yolox-opt.bin 】


Copy or Move yolox.cpp file into ncnn/examples, modify the CMakeList.txt, then build yolox

cd ncnn/examples/

cp /xx/xx/yoloDir/YOLOX/demo/ncnn/cpp/yolox.cpp .

vim yolox.cpp

主要修改如下地方:

YOLOX (pytorch)模型 转 ONNX 转 ncnn 之C++运行推理【️YOLOX 实战三️】_当前目录_04

YOLOX (pytorch)模型 转 ONNX 转 ncnn 之C++运行推理【️YOLOX 实战三️】_bash_05

vim CMakeLists.txt

主要修改如下地方:

YOLOX (pytorch)模型 转 ONNX 转 ncnn 之C++运行推理【️YOLOX 实战三️】_计算机视觉_06

重新编译 ncnn

cd ..

# 删除 之前的 build 目录,这一步是有必要的

rm -rf build

mkdir build

cmake ..

make -j

# 环境OK,则编译顺利

📙 Step7 【Inference image with executable file yolox】


运行测试

  1. copy 一张图片到当前目录
  2. copy yolox-opt.* 到刚刚 yolox.cpp 中指定的路径
cd ncnn/build/examples

# 可以看到 一堆的 可执行文件 包括刚刚添加的 yolox

如果 模型找不到, 则报错如下

./yolox  dog.jpg 


fopen yolox-opt.param failed
fopen yolox-opt.bin failed
find_blob_index_by_name images failed
Try
find_blob_index_by_name output failed
Try

正确运行的输出

## copy 模型到 正确路径即可,我这里是copy 到当前目录

cp xx/ncnn/build/tools/onnx/yolox-opt.* .

# 正确运行输出如下

./yolox  dog.jpg 

2 = 0.80229 at 460.83 81.42 241.84 x 92.63
1 = 0.69867 at 107.73 122.94 459.45 x 383.90
15 = 0.47716 at 129.65 209.46 259.46 x 287.37

image_yolox.png saved .......

效果如下

YOLOX (pytorch)模型 转 ONNX 转 ncnn 之C++运行推理【️YOLOX 实战三️】_深度学习_07