RetinaFace学习记录:Python,C++

一、介绍

RetinaFace是一款实用的单级SOTA人脸检测模型,整个模型整合了:人脸检测、人脸对齐、像素级的人脸分析、3D密集通信回归。

虽然在未受控制的人脸检测方面取得了巨大进步,但野外准确有效的面部定位仍然是一个开放的挑战。这篇文章提出了一个强大的单阶段人脸检测器,名为RetinaFace,它利用联合监督和自我监督的多任务学习,在各种人脸尺度上执行像素方面的人脸定位。
具体来说,我们在以下五个方面做出了贡献:

  • (1)我们在WIDER FACE数据集上手动注释五个面部标志,并在这个额外的监督信号的帮助下观察硬面检测的重要改进。
  • (2)我们进一步增加了一个自监督网格解码器分支,用于与现有的受控分支并行地预测像素三维形状的面部信息。
  • (3)在WIDER FACE硬测试装置上,RetinaFace的性能优于现有技术平均预测(AP)1.1%(达到AP等于91.4%)。
  • (4)在IJB-C测试集上,RetinaFace使最先进的方法(ArcFace)能够改善他们在面部验证中的结果(FAR = 1e-6的TAR = 89.59%)。
  • (5)通过采用轻量级骨干网络,RetinaFace可以在单个CPU内核上实时运行,以实现VGA分辨率的显示。

论文地址:
https://arxiv.org/pdf/1905.00641.pdf
Github地址:(基于Python平台,MXNet框架)
https://github.com/deepinsight/insightface/tree/master/RetinaFace
数据:
https://pan.baidu.com/s/1Laby0EctfuJGgGMgRRgykA
http://shuoyang1213.me/WIDERFACE/WiderFace_Results.html

效果:

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

二、安装

1.安装MXNet并支持GPU。
2.如果您使用基于DCN的主干,请从Deformable-ConvNets安装Deformable Convolution V2运算符。
3.键入make以构建cxx工具。

三、测试(Python)

源码GitHub:https://github.com/deepinsight/insightface
run test.py for testing.
步骤:

$ git clone https://github.com/deepinsight/insightface.git
$ cd insightface
$ make
$ python test.py

问题1

我运行test.py时遇到错误:

from ..cython.bbox import bbox_overlaps_cython
ImportError: No module named bbox
# issue上指明要先‘$ make’
# 然而make之后仍然是这个错误。
## 我在调用cython之前使用:
#import pyximport
#pyximport.install()
## 又得到如下错误:
#raise CompileError, msg
#ImportError: Building module rcnn.cython.bbox failed: ["CompileError: command 'gcc' failed with exit status 1\n"]

# 我将‘bbox.cpython-36m-x86_64-linux-gnu.so’改名为`bbox.so`,得到了另一个错误:
ImportError: /home/toson/projects/insightface/RetinaFace/rcnn/cython/bbox.so: undefined symbol: _Py_FalseStruct

而在我查找上述问题时,我得到了指点:看起来你用python3编译了lib,但是试图用python2运行它。
参阅:https://github.com/deepinsight/insightface/issues/395
问题原因:make的时候编译使用的python版本,和最后run test.py的python版本不一致。(可以查看makefile文件,即一目了然。)
两种解决办法
1.使用我们运行用的版本的pyhton来编译setup.py脚本。
(比如我用的python2,就要用python2去编译,命令如下:)

$ cd rcnn/cython/
$ ~/anaconda2/bin/python setup.py build_ext --inplace

2.也不用再去编译,直接使用编译的那个版本的python来运行test.py。

运行结果

一次前向传播时间:约300ms。


四、C++示例代码

示例1:基于ncnn框架

GitHub:https://github.com/Charrin/RetinaFace-Cpp

  • 作者将mobilenet-0.25 mxnet模型(由yangfly培训)转换为caffe模型:
    https://github.com/Charrin/RetinaFace-Cpp/tree/master/convert_models/mnet
    RetinaFace-MobileNet0.25为第三方模型。
  • 作者将R50 mxnet模型转换为caffe模型:
    BaiDuYun:https://pan.baidu.com/s/1By24gkB1a76qJvxsg-gIgQ
    Google云端硬盘:https://drive.google.com/drive/folders/1hA5x3jCYFdja3PXLl9EcmucipRmVAj3W?usp=sharing
    RetinaFace-R50是一款具有ResNet50骨干的中型机型。它可以在单个前向传递中输出面部边界框和五个面部地标。

示例2:基于Caffe框架

GitHub:https://github.com/cholihao/Retinaface-caffe

代码需要修改,修改好之后能够运行mnet(.prototxt)(.caffemodel)模型。
注:mnet模型文件为RetinaFace-MobileNet模型。

运行mnet结果

运行报错:Check failed: status == CUDNN_STATUS_SUCCESS (4 vs. 0) CUDNN_STATUS_INTERNAL_ERROR
模型文件需要修改:
mnet.prototxt文件中,提示错误的那层网络的convolution_param里,添加engine: CAFFE

  • 1.CPU
    一次前向传播时间:318ms:。
    1000 times Forward() cost: 318107ms.
  • 2.GPU
    运行异常:
    Check failed: status == CUDNN_STATUS_SUCCESS (8 vs. 0) CUDNN_STATUS_EXECUTION_FAILED
运行R50结果

注:R50模型文件为RetinaFace-ResNet50模型。
运行异常:模型文件需要修改。

  • 1.CPU
    一次前向传播时间:1.8s:。
    10 times Forward() cost: 18140ms.
  • 2.GPU
    显存不够(RTX2060)。
    Check failed: error == cudaSuccess (2 vs. 0) out of memory
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章