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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章