簡介
從原insightface上clone下來的RetinaFace在win10平臺上(python3.6)運行,想要只使用mxnet的CPU版,遇到一些問題,這裏記錄下來供有需求的同學一起討論。
代碼clone,CPU版mxnet安裝
代碼網址:RetinaFace,目標是安裝相關依賴,跑通test.py測試文件。
安裝CPU版mxnet:
- 在pypi.org上找到mxnet包;
- 選擇對應python的版本;
- 使用pip安裝;
採坑經歷
安裝完畢,修改test.py裏面對應模型文件(在git上下載)路徑和測試圖片,運行,提示錯誤:
Traceback (most recent call last):
File "D:/PycharmProject/facereg/insightface/RetinaFace/test.py", line 19, in <module>
from retinaface import RetinaFace
File "D:\PycharmProject\facereg\insightface\RetinaFace\retinaface.py", line 13, in <module>
from rcnn.processing.bbox_transform import clip_boxes
File "D:\PycharmProject\facereg\insightface\RetinaFace\rcnn\processing\bbox_transform.py", line 4, in <module>
from ..cython.bbox import bbox_overlaps_cython
ModuleNotFoundError: No module named 'rcnn.cython.bbox'
打開\rcnn\processing\bbox_transform.py查看發現:
from ..cython.bbox import bbox_overlaps_cython
查看對應路徑下發現包含了對應的.pyx文件:
百度大致意思是說必須要把pyx編譯爲其他文件纔可以運行。
這裏也踩了很多坑:
- 百度有給出RCNN的同樣的錯誤,可以直接修改setup.py這個文件,沒成功解決。
- 忽然想到git上有提示要運行make的,去到對應路徑下make(win上必須安裝minGW配置環境變量後纔可以make),發現依然有這個錯誤,然後打開Makefile查看發現是Linux下的Makefile文件,因此直接運行setup.py文件,又提示錯誤:
AttributeError: 'MSVCCompiler' object has no attribute 'compiler_so'
,找解決辦法,無果。 - 期間出現了一個錯誤提示:
Unable to find vcvarsall.bat
,大致意思上是說在win下編譯,缺少這個文件,百度說讓安裝對應版本的VS,我電腦上已經安裝過VS2017和VS2015了,對應的這個文件也有,但是一直提示該錯誤。
到這裏感覺沒辦法進行下去了,感覺哪裏出了問題。
問題解決
期間一直找方法,都有問題,其中百度了兩個文章(1,2),感覺還是在setup.py文件上出了問題,可能因爲原來的文件是在Linux下的,於是按照這兩個裏面的思路,將rcnn/Cython/setup.py改爲:
try:
from setuptools import setup
from setuptools import Extension
except ImportError:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy as np
###這裏的try...except...是百度的網上的帖子,必須加上,否則會出現Unable to find vcvarsall.bat錯誤。
try:
numpy_include = np.get_include()
except AttributeError:
numpy_include = np.get_numpy_include()
ext_modules = [
Extension(
"bbox",
["bbox.pyx"],
extra_compile_args=["/openmp"],
include_dirs=[numpy_include]
),
Extension(
"anchors",
["anchors.pyx"],
extra_compile_args=["/openmp"],
include_dirs=[numpy_include]
),
Extension(
"cpu_nms",
["cpu_nms.pyx"],
extra_compile_args=["/openmp"],
include_dirs = [numpy_include]
),
]
setup(
name='frcnn_cython',
ext_modules=ext_modules,
# inject our custom trigger
# cmdclass={'build_ext': custom_build_ext},
cmdclass={'build_ext': build_ext},
)
按照Makefile裏的命令運行:python setup.py build_ext --inplace
,發現成功生成了.c文件和.pyd文件:
之後滿懷期待的去重新運行test.py文件,依然出錯:
C:\Jenkins\workspace\mxnet-tag\mxnet\src\storage\storage.cc:119: Compile with USE_CUDA=1 to enable GPU usage
發現是代碼中默認使用了GPU的方式運行,我們安裝的是CPU的,所以當然不能成功。找到對應代碼更改參數:
gpuid = -1 ###禁止使用GPU
detector = RetinaFace(r'D:\PycharmProject\facereg\insightface\RetinaFace\models\R50', 0, gpuid, 'net3')
運行,又又又出錯:
Traceback (most recent call last):
File "D:/PycharmProject/facereg/insightface/RetinaFace/test.py", line 49, in <module>
faces, landmarks = detector.detect(img, thresh, scales=scales, do_flip=flip)
File "D:\PycharmProject\facereg\insightface\RetinaFace\retinaface.py", line 361, in detect
keep = self.nms(pre_det)
File "D:\PycharmProject\facereg\insightface\RetinaFace\rcnn\processing\nms.py", line 17, in _nms
return cpu_nms(dets, thresh)
File "cpu_nms.pyx", line 25, in cpu_nms.cpu_nms
ValueError: Buffer dtype mismatch, expected 'int_t' but got 'long long'
大意是在cpu_nms中出現了數據不匹配的情況,dbug代碼,發現是因爲cpu_nms裏cdef np.ndarray[np.int_t, ndim=1] order = scores.argsort()[::-1]
的函數nparray.argsort()默認返回的是int64類型的數組,而數據類型定義爲np.int_t型,因此更改這行代碼爲:
cdef np.ndarray[np.int_t, ndim=1] order = scores.argsort()[::-1].astype(np.int32)
重新運行python setup.py build_ext --inplace
編譯,finally,成功運行出了示例圖像: