一、介紹
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