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