RetinaFace在win10+CPU版mxnet+python36下配置運行

簡介

從原insightface上clone下來的RetinaFace在win10平臺上(python3.6)運行,想要只使用mxnet的CPU版,遇到一些問題,這裏記錄下來供有需求的同學一起討論。

代碼clone,CPU版mxnet安裝

代碼網址:RetinaFace,目標是安裝相關依賴,跑通test.py測試文件。
安裝CPU版mxnet:

  1. 在pypi.org上找到mxnet包;
  2. 選擇對應python的版本;
  3. 使用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編譯爲其他文件纔可以運行。
這裏也踩了很多坑:

  1. 百度有給出RCNN的同樣的錯誤,可以直接修改setup.py這個文件,沒成功解決。
  2. 忽然想到git上有提示要運行make的,去到對應路徑下make(win上必須安裝minGW配置環境變量後纔可以make),發現依然有這個錯誤,然後打開Makefile查看發現是Linux下的Makefile文件,因此直接運行setup.py文件,又提示錯誤: AttributeError: 'MSVCCompiler' object has no attribute 'compiler_so',找解決辦法,無果。
  3. 期間出現了一個錯誤提示: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,成功運行出了示例圖像:
在這裏插入圖片描述

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