caffe上运行retinaface-caffe的mnet模型报错:CUDNN_STATUS_SUCCESS (1 vs. 0) CUDNN_STATUS_NOT_INITIALIZED

一、需求描述

目前最好的人脸检测模型为Retinaface,但其是在Mxnet框架下训练和部署的。我们项目要在前端部署,目前大部分的开发板仅支持caffe框架下的模型转换到开发板的框架,因此,我们的需求是将Retinaface的模型转换到caffe下并在caffe框架下运行

二、转换思路

1、模型转换

    即实现mxnet模型转caffe模型。转换思路在自己的开发文档上有详细的描述,这里提供一个转换好的链接:R50和Mnet。

2、 caffe实现Retinaface

    思路1:读python源码,理解其prior_box和detect_output这两层是怎么算的,然后参照caffe-ssd的prior_box_laye和detection_output_layer这两层的源码,在其上进行修改,跑通。难度较大,短时间(项目给了五天时间)难以完成。

    思路2:找到一个开源实现retinaface_caffe,感谢wzj5133329。下面的工作都是用这个进行部署。

3、 部署过程

(1)首先在Windows上部署caffe。其中趟过的坑不计其数。

(2)部署,运行其自带的mnet.caffemodel进行测试报错CUDNN_STATUS_SUCCESS (1 vs. 0) CUDNN_STATUS_NOT_INITIALIZED,这个报错折腾了我两天。

    a. 怀疑Windows上cuda计算力不够,跑到服务器上(4块RTX2080),搭建了半天的caffe,没有成功。放弃。

    b. 怀疑caffe环境搭建问题,找教程跑了一下mnist训练,没问题。

    c. 计算力不够。查找到博主介绍http://www.ishenping.com/ArtInfo/1567707.html,如下图:

                  caffe上运行retinaface-caffe的mnet模型报错:CUDNN_STATUS_SUCCESS (1 vs. 0) CUDNN_STATUS_NOT_INITIALIZED_第1张图片

        受到启发:跑mobilenet,而在原版的caffe中并没有mobilenet的depthwiseConv特殊卷积层,之前测试mobilenet的时候,  要单独将depthwise层加入到caffe中重新编译。进一步查看mnet.prototxt中的“convolution”,里面的确,和普通卷积不同,多了个group参数

                      caffe上运行retinaface-caffe的mnet模型报错:CUDNN_STATUS_SUCCESS (1 vs. 0) CUDNN_STATUS_NOT_INITIALIZED_第2张图片

就是这一个group操作,导致我rtx2060显卡显存都不够用了。

4、解决CUDNN_STATUS_SUCCESS (1 vs. 0) CUDNN_STATUS_NOT_INITIALIZED问题

既然是mobilenet导致的错误,那就针对这个问题进行解决,思路有两个:

(1)要跑mnet,要在caffe中配置depthwise的cpp和h,就是添加新层并重新编译,并且要修改mnet.prototxt中的"convolution"参数进行,按照mobilenet的模式,一般要将"type"设置为"depthwise..."。

(2)换R50-0000.caffemodel进行测试。

        将mnet.caffemodel替换为R50进行测试,通过,进一步证明了mobilenet的group操作导致显存不够用的问题

你可能感兴趣的:(算法学习)