用NCNN部署mmdetection的yolov3

最近这段时间一直在学习NCNN以及c++代码,由于之前并未看过检测器的后处理部分(属于是半吊子),导致在部署过程中非常迷惑。为了熟悉部署的流程,下面以mmdetection中的yolov3为例,将部署流程分享给大家参考参考。目前检测的框还存在问题,可能是我后处理部分还有点问题,也可能是前处理的问题,等解决后再放相关代码(目前还是个菜鸟~)。放一些niuhui大佬和三木君大佬的参考学习链接:

详细记录u版YOLOv5目标检测ncnn实现-nihui

详细记录u版YOLOv5目标检测ncnn实现(第三版)

部署流程

1. 准备权重文件

我是直接在mmdetection官方下载的yolov3_d53_320_273e_coco-421362b6.pth文件,也可自己训练。然后我的环境如图(版本比较老):

2. 导出ONNX文件

利用mmdetection中自带的tools/pytorch2onnx.py即可,但需要注意的是,后处理的部分算子ncnn可能不支持,这部分需要自己用c++重写。我们将后处理部分在导出的时候省略即可,如下图。你只需看mmdet/models/detectors/yolo.py和mmdet/models/dense_heads/yolo_head.py的相关代码。

省略后处理导出

导出后的onnx可视化,有三个类似的输出

先看前者,找到其继承的父类,可以看到导出的是bbox_list,但bbox_list已经是经过后处理的(get_bboxes),去yolo_head.py看相关后处理代码:

你只需在c++重新这部分的代码即可,最后放上错误的检测结果图(虽然是错的,就当记录下学习历程,待我解决后再更新哈哈哈哈~)。

经排查,由于导出的模型是320×320,在检测出结果后,需根据x和y方向的缩放比例映射回原图,如下图,img_w和img_h还是int类型,最后导致scale_x和scale_y是int类型,导致映射回原图的框位置有问题,强制转换一下即可,c++的代码能力还是太菜,还需学习。

强制转换类型

ncnn

pytorch

左下角的人未检测出来,精度有些损失。继续学习。。。

最后贴一下代码,关于NCNN的环境配置自行上网查询:

YOLOV3-NCNNicon-default.png?t=N7T8https://github.com/marvellee1/YOLOV3-NCNN

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值