PP-YOLOE: An evolved version of YOLO
以下为x86 Linux平台的运行过程
python环境
为了导出模型,您需要安装以下python包
- mmengine >= 0.7.1
- mmcv >= 2.0.0rc4
- mmdet >= 3.0.0rc6
- mmyolo >= 0.3.0
ncnn
可以从ncnn的Release页面直接下载预编译包,或者按照ncnn的wiki从源码进行编译安装
如果您选择预编译包,解压缩后将ncnn-xxxx-xx目录移动到detective目录下,并重命名为ncnn
如果您从源码编译,将编译后得到的install目录移动到detective目录下,并重命名为ncnn
opencv-mobile
-
如果您已经安装了opencv,可以选择跳过这一步,并相应地修改CMakeLists.txt,使其能够链接opencv
-
如果您是从源码编译ncnn,并且开启了NCNN_SIMPLEOCV选项(如下所示),同样可以跳过这一步,删除CMakeLists.txt中OpenCV的部分
option(NCNN_SIMPLEOCV "minimal opencv structure emulation" ON)
- 可以从opencv-mobile的Release页面选择一个版本下载预编译包,解压缩后移动到detective目录下,并重命名为opencv-mobile
pnnx
可以从pnnx的Release页面直接下载预编译包
目录结构
在使用opencv-mobile的情况下,当前工程应当有如下结构
detective
├── assets
├── ppyoloe-plus
├── ncnn
│ ├── bin
│ ├── include
│ └── lib
├── opencv-mobile
│ ├── bin
│ ├── include
│ ├── lib
│ └── share
├── ...
├── LICENSE
├── README.md
PP-YOLOE+的模型中含有HardSigmoid层,如果使用pytorch->onnx->ncnn的导出方式,得到的onnx算子比较碎,这里我们采用pnnx的导出方式。关于pnnx的详细介绍可参考pnnx。另外,PP-YOLOE+使用了重参数化技术,在导出前需要将RepVGGBlock切换到deploy模式,详见这里
- 下载权重文件,并放到export目录下;
- 导出pt文件:
cd detective/ppyoloe-plus/export
python export.py
- 得到model.pt后,导出ncnn
./pnnx model.pt \
inputshape=[1,3,640,640] \
inputshape2=[1,3,416,416] \
moduleop=mmcv.cnn.bricks.hsigmoid.HSigmoid
- 将转换后的model.ncnn.param和model.ncnn.bin重命名为ppyoloe-plus-small.param和ppyoloe-plus-small.bin,并放到assets目录下
注意
在导出pt时我们对head_module的forward_single进行了如下修改
def forward_single(self, x, cls_stem, cls_pred, reg_stem, reg_pred):
avg_feat = F.adaptive_avg_pool2d(x, (1, 1))
cls_logit = cls_pred(cls_stem(x, avg_feat) + x)
bbox_dist_preds = reg_pred(reg_stem(x, avg_feat))
return cls_logit, bbox_dist_preds.permute(0, 2, 3, 1)
虽然这里bbox_dist_preds进行了permute,但pnnx会自动删除最后的permute层,最终这个permute实际上是不起作用的。在ncnn推理时bbox_dist_preds的大小仍然是CxHxW。
而在YOLOv8中,我们使用了onnx的导出方式,permute会被保留,因此在ncnn推理时bbox_dist_preds的大小是HWC。
cd detective/ppyoloe-plus
mkdir -p build
cd build/
cmake ..
make -j4
./ppyoloe ../../assets/dog.jpg