miemie2013 / ncnn_ppyolov2

ncnn impl of ppyolov2 and ppyolo and ppyoloe.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ncnn

概述

ncnn实现PPYOLOv2和PPYOLO和PPYOLOE!这是ncnn第一个支持可变形卷积和MatrixNMS的模型,PPYOLO和PPYOLOv2的导出部署非常困难,因为它们使用了可变形卷积、MatrixNMS等对部署不太友好的算子。但现在咩酱在ncnn中实现了可变形卷积DCNv2、CoordConcat、PPYOLODecodeMatrixNMS等自定义层,使得使用ncnn部署PPYOLO和PPYOLOv2成为了可能!其中的可变形卷积层 也已经被合入ncnn官方仓库。

开源摘星计划(WeOpen Star) 是由腾源会 2022 年推出的全新项目,旨在为开源人提供成长激励,为开源项目提供成长支持,助力开发者更好地了解开源,更快地跨越鸿沟,参与到开源的具体贡献与实践中。

不管你是开源萌新,还是希望更深度参与开源贡献的老兵,跟随“开源摘星计划”开启你的开源之旅,从一篇学习笔记、到一段代码的提交,不断挖掘自己的潜能,最终成长为开源社区的“闪亮之星”。

我们将同你一起,探索更多的可能性!

开源摘星计划: https://github.com/weopenprojects/WeOpen-Star/blob/main/README.md

ncnn贡献指南: weopenprojects/WeOpen-Star#27

快速开始

按照miemiedetection 文档导出ncnn的PPYOLOv2和PPYOLO模型。

按照官方how-to-build 文档进行编译ncnn。

编译完成后, 将导出的ppyolov2_r50vd_365e.param、ppyolov2_r50vd_365e.bin、...这些文件复制到ncnn_ppyolov2的build/examples/目录下,最后在ncnn_ppyolov2根目录下运行以下命令进行ppyolov2的预测:

cd build/examples
./test2_06_ppyolo_ncnn ../../my_tests/000000013659.jpg ppyolo_r18vd.param ppyolo_r18vd.bin 416
./test2_06_ppyolo_ncnn ../../my_tests/000000013659.jpg ppyolo_r50vd_2x.param ppyolo_r50vd_2x.bin 608
./test2_06_ppyolo_ncnn ../../my_tests/000000013659.jpg ppyolov2_r50vd_365e.param ppyolov2_r50vd_365e.bin 640
./test2_06_ppyolo_ncnn ../../my_tests/000000013659.jpg ppyolov2_r101vd_365e.param ppyolov2_r101vd_365e.bin 640

每条命令最后1个参数416、608、640表示的是将图片resize到416、608、640进行推理,即target_size参数。

test2_06_ppyolo_ncnn的源码位于ncnn_ppyolov2仓库的examples/test2_06_ppyolo_ncnn.cpp。PPYOLOv2和PPYOLO算法目前在Linux和Windows平台均已成功预测。

测速

输入以下命令测速

cd build/examples

./test2_06_ppyolo_ncnn ../../my_tests/000000013659.jpg ppyolov2_r50vd_365e.param ppyolov2_r50vd_365e.bin 640 0 0 1 1

./test2_06_ppyoloe_ncnn ../../my_tests/000000013659.jpg ppyoloe_crn_l_300e_coco.param ppyoloe_crn_l_300e_coco.bin 640 0 0 1 1

./test2_06_ppyoloe_ncnn ../../my_tests/000000000019.jpg ppyoloe_crn_s_300e_coco.param ppyoloe_crn_s_300e_coco.bin 640 0 0 1 1

参数解释:

  • 倒数第4个参数=0表示最后不弹窗,=1表示最后弹窗;
  • 倒数第3个参数=0表示不使用vulkan,=1表示使用vulkan;
  • 倒数第2个参数表示use_packing_layout,即是否使用pack;
  • 倒数第1个参数表示use_sgemm_convolution,即是否使用im2col+MatMul卷积优化算法;

以下是咩酱的一些测速结果:

# ubuntu, amd + 3060(6GB), 不使用vulkan, 默认12线程

ppyoloe_crn_l_300e_coco, use_packing_layout=1, use_sgemm_convolution=1, 推理时间 avg = 340.15
ppyoloe_crn_l_300e_coco, use_packing_layout=1, use_sgemm_convolution=0, 推理时间 avg = 363.04
ppyoloe_crn_l_300e_coco, use_packing_layout=0, use_sgemm_convolution=1, 推理时间 avg = 313.78
ppyoloe_crn_l_300e_coco, use_packing_layout=0, use_sgemm_convolution=0, 推理时间 avg = 972.89

(实验1) ppyolov2_r50vd_365e, use_packing_layout=1, use_sgemm_convolution=1, 推理时间 avg = 398.29
(实验2) ppyolov2_r50vd_365e, use_packing_layout=1, use_sgemm_convolution=0, 推理时间 avg = 523.38
(实验3) ppyolov2_r50vd_365e, use_packing_layout=0, use_sgemm_convolution=1, 推理时间 avg = 413.42
(实验4) ppyolov2_r50vd_365e, use_packing_layout=0, use_sgemm_convolution=0, 推理时间 avg = 2831.22

(可变形卷积换成普通卷积推理时间)
(实验5) ppyolov2_r50vd_365e, use_packing_layout=1, use_sgemm_convolution=1, 推理时间 avg = 397.74
(实验6) ppyolov2_r50vd_365e, use_packing_layout=1, use_sgemm_convolution=0, 推理时间 avg = 407.44
(实验7) ppyolov2_r50vd_365e, use_packing_layout=0, use_sgemm_convolution=1, 推理时间 avg = 391.33
(实验8) ppyolov2_r50vd_365e, use_packing_layout=0, use_sgemm_convolution=0, 推理时间 avg = 832.75

结论:

对比实验5和实验6,推理时间几乎不变,再看实验1和实验2,DCN非常依赖im2col+MatMul,直接计算DCN会很慢;

对比实验4和实验8,naive DCN(既不使用pack也不使用im2col+MatMul)是非常慢的;

Q:如何把ppyolov2_r50vd_365e的可变形卷积换成普通卷积?

A:miemiedetection的exps/ppyolo/ppyolov2_r50vd_365e.py配置文件,修改self.backbone的dcn_v2_stages=[3]为dcn_v2_stages=[-1],再按上面的步骤导出,把导出的ppyolov2_r50vd_365e.param、ppyolov2_r50vd_365e.bin复制到ncnn_ppyolov2的build/examples/目录下即可。

部署到其它电脑

ppyoloe部署到其它电脑,需要:

  • 可执行文件test2_06_ppyoloe_ncnn.exe;
  • 动态链接库D://opencv/build/x64/vc15/bin/opencv_world455.dll;
  • 模型文件;

ppyoloe的一些测速结果(win11、amd r5、rtx3060笔记本,单位:毫秒/张):

模型 torch(cuda) ncnn(cpu) ncnn(vulkan)
ppyoloe_s(640x640) 27 112 13
ppyoloe_l(640x640) 37 339 25

传送门

算法1群:645796480(人已满)

算法2群:894642886

粉丝群:704991252

关于仓库的疑问尽量在Issues上提,避免重复解答。

B站不定时女装: _糖蜜

知乎不定时谢邀、写文章: 咩咩2013

西瓜视频: 咩咩2013

微信:wer186259

本人微信公众号:miemie_2013

技术博客:https://blog.csdn.net/qq_27311165

AIStudio主页:asasasaaawws

欢迎在GitHub或上面的平台关注我(求粉)~

About

ncnn impl of ppyolov2 and ppyolo and ppyoloe.

License:Other


Languages

Language:C++ 49.9%Language:C 30.9%Language:GLSL 11.6%Language:Python 5.0%Language:CMake 0.8%Language:JavaScript 0.5%Language:M4 0.5%Language:Yacc 0.5%Language:Shell 0.2%Language:Makefile 0.0%Language:Starlark 0.0%Language:Batchfile 0.0%Language:HLSL 0.0%Language:SWIG 0.0%