问题描述:

Fast R-CNN(rotate)原版提供的 setup.py 是在linux中使用的,在linux里可以直接编译。
而在windows下需要修改 setup.py

解决方案:

先提供思路,最后附上代码。

1)修改 setup.py

  1. 不需要使用 CUDA 的部分:(在 setup.py 文件中搜索,在ext_modules中没有出现.cu的,就是不需要使用),将原版的 setup.py 修改为 setup_new.py
ext_modules = [Extension('rotate_polygon_nms',source=['rotate_polygon_nms_kernel.cu', 'rotate_polygon_nms.pyx']……]
  1. 使用 CUDA 的部分:(上面代码中的情况,就是需要使用),将原版的 setup.py 修改为 setup_cuda.py

2)编译修改后的 setup.py

将CMD定位到修改后的 setup.py 所在位置,运行以下命令:

python setup_new.py install
python setup_cuda.py install

如果提示Microsoft Visual C++ 9.0 is required ...,在CMD中输入以下命令:

SET VS90COMNTOOLS=%VS110COMNTOOLS% (如果电脑中装的是vs2012)
SET VS90COMNTOOLS=%VS120COMNTOOLS% (如果电脑中装的是vs2013)

最后出现Finished processing ...就编译成功了。


如果在编译过程中出现了错误,以下可能会帮到你:

  1. 错误提示'cl.exe' failed with exit status 2
    【参考】:pip 安装模块时 cl.exe failed 可能的解决办法
    如果都解决不了,可以尝试卸载VS

  2. 错误提示rbbox_overlaps_kernel.cu(156): error: expected a ";"
    找到文件的对应位置,把 and 换成 &&

  3. 错误提示error: don't know how to set runtime library search path for MSVC
    删掉下面框起来的

  4. 错误提示error C2664: 'void _rotate_nms(int *,int *,const float *,int,int,float,int)': cannot convert argument 1 from '__pyx_t_5numpy_int32_t *' to 'int *'
    错误提示nvcc fatal : No input files specified; use option --help for more information

    【参考】:windows下编译tensorflow Faster RCNN的lib/Makefile(非常非常有帮助,感谢博主!)


3)Makefile

最后,保持 CMD 定位到的 setup.py 所在位置,运行以下命令:

python setup_new.py build_ext --inplace
python setup_cuda.py build_ext --inplace

会生成类似下面这样的文件:

4)删除缓存文件

按照 Makefile 中的提示,所有编译过程结束以后,可以删除编译过程中生成的 build 文件等。

5)结语

到此为止,win10编译 Fast R-CNN 所需的setup.py(rotate) tensorflow版就全部结束了!
接下来就可以开始愉快的调试代码了~

附:代码

setup_new.py

# --------------------------------------------------------
# Windows
# Fast R-CNN
# Copyright (c) 2015 Microsoft
# Licensed under The MIT License [see LICENSE for details]
# Written by Ross Girshick
# --------------------------------------------------------import os
from os.path import join as pjoin
import numpy as np
from setuptools import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext# change for windows, by MrX
nvcc_bin = 'nvcc.exe'
lib_dir = 'lib/x64'def find_in_path(name, path):"Find a file in a search path"# Adapted from http://code.activestate.com/recipes/52224-find-a-file-given-a-search-path/for dir in path.split(os.pathsep):binpath = pjoin(dir, name)if os.path.exists(binpath):return os.path.abspath(binpath)return Nonedef locate_cuda():"""Locate the CUDA environment on the systemReturns a dict with keys 'home', 'nvcc', 'include', and 'lib64'and values giving the absolute path to each directory.Starts by looking for the CUDAHOME env variable. If not found, everythingis based on finding 'nvcc' in the PATH."""# first check if the CUDAHOME env variable is in useif 'CUDA_PATH' in os.environ:home = os.environ['CUDA_PATH']print("home = %s\n" % home)nvcc = pjoin(home, 'bin', nvcc_bin)else:# otherwise, search the PATH for NVCCdefault_path = pjoin(os.sep, 'usr', 'local', 'cuda', 'bin')nvcc = find_in_path(nvcc_bin, os.environ['PATH'] + os.pathsep + default_path)if nvcc is None:raise EnvironmentError('The nvcc binary could not be ''located in your $PATH. Either add it to your path, or set $CUDA_PATH')home = os.path.dirname(os.path.dirname(nvcc))print("home = %s, nvcc = %s\n" % (home, nvcc))cudaconfig = {'home': home, 'nvcc': nvcc,'include': pjoin(home, 'include'),'lib64': pjoin(home, lib_dir)}for k, v in cudaconfig.items():if not os.path.exists(v):raise EnvironmentError('The CUDA %s path could not be located in %s' % (k, v))return cudaconfigCUDA = locate_cuda()# Obtain the numpy include directory.  This logic works across numpy versions.
try:numpy_include = np.get_include()
except AttributeError:numpy_include = np.get_numpy_include()def customize_compiler_for_nvcc(self):"""inject deep into distutils to customize how the dispatchto cl/nvcc works.If you subclass UnixCCompiler, it's not trivial to get your subclassinjected in, and still have the right customizations (i.e.distutils.sysconfig.customize_compiler) run on it. So instead of goingthe OO route, I have this. Note, it's kindof like a wierd functionalsubclassing going on."""# tell the compiler it can processes .cu# self.src_extensions.append('.cu')# save references to the default compiler_so and _comple methods# default_compiler_so = self.spawn# default_compiler_so = self.rcsuper = self.compile# now redefine the _compile method. This gets executed for each# object but distutils doesn't have the ability to change compilers# based on source extension: we add it.def compile(sources, output_dir=None, macros=None, include_dirs=None, debug=0, extra_preargs=None,extra_postargs=None, depends=None):postfix = os.path.splitext(sources[0])[1]if postfix == '.cu':# use the cuda for .cu files# self.set_executable('compiler_so', CUDA['nvcc'])# use only a subset of the extra_postargs, which are 1-1 translated# from the extra_compile_args in the Extension classpostargs = extra_postargs['nvcc']else:postargs = extra_postargs['cl']return super(sources, output_dir, macros, include_dirs, debug, extra_preargs, postargs, depends)# reset the default compiler_so, which we might have changed for cuda# self.rc = default_compiler_so# inject our redefined _compile method into the classself.compile = compile# run the customize_compiler
class custom_build_ext(build_ext):def build_extensions(self):customize_compiler_for_nvcc(self.compiler)build_ext.build_extensions(self)ext_modules = [# unix _compile: obj, src, ext, cc_args, extra_postargs, pp_optsExtension("cython_bbox",["bbox.pyx"],extra_compile_args={'cl': []},# extra_compile_args={'gcc': ["-Wno-cpp", "-Wno-unused-function"]},include_dirs = [numpy_include]),Extension("cython_nms",["nms.pyx"],extra_compile_args={'cl': []},# extra_compile_args={'gcc': ["-Wno-cpp", "-Wno-unused-function"]},include_dirs = [numpy_include])
]setup(name='tf_faster_rcnn',ext_modules=ext_modules,# inject our custom triggercmdclass={'build_ext': custom_build_ext},
)

setup_cuda.py

【注意】:第五行的PATH需要根据自己电脑的情况进行修改:

# 没有把vs的bin路径添加到环境变量
PATH = "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin"
# 环境变量里有vs的bin路径
PATH = os.environ.get('PATH')
import numpy as np
import os# on Windows, we need the original PATH without Anaconda's compiler in it:
PATH = "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin"
from distutils.spawn import spawn, find_executable
from setuptools import setup, find_packages, Extension
from setuptools.command.build_ext import build_ext
import sys
from os.path import join as pjoin# change for windows, by MrX
nvcc_bin = 'nvcc.exe'
lib_dir = 'lib/x64'# CUDA specific config
# nvcc is assumed to be in user's PATH
nvcc_compile_args = ['-O', '--ptxas-options=-v', '-arch=sm_35', '-c', '--compiler-options=-fPIC']
nvcc_compile_args = os.environ.get('NVCCFLAGS', '').split() + nvcc_compile_argscuda_libs = ['cublas']# Obtain the numpy include directory.  This logic works across numpy versions.
try:numpy_include = np.get_include()
except AttributeError:numpy_include = np.get_numpy_include()def find_in_path(name, path):"Find a file in a search path"# Adapted fom# http://code.activestate.com/recipes/52224-find-a-file-given-a-search-path/for dir in path.split(os.pathsep):binpath = pjoin(dir, name)if os.path.exists(binpath):return os.path.abspath(binpath)return Nonedef locate_cuda():"""Locate the CUDA environment on the systemReturns a dict with keys 'home', 'nvcc', 'include', and 'lib64'and values giving the absolute path to each directory.Starts by looking for the CUDAHOME env variable. If not found, everythingis based on finding 'nvcc' in the PATH."""# first check if the CUDAHOME env variable is in useif 'CUDA_PATH' in os.environ:home = os.environ['CUDA_PATH']print("home = %s\n" % home)nvcc = pjoin(home, 'bin', nvcc_bin)else:# otherwise, search the PATH for NVCCdefault_path = pjoin(os.sep, 'usr', 'local', 'cuda', 'bin')nvcc = find_in_path(nvcc_bin, os.environ['PATH'] + os.pathsep + default_path)if nvcc is None:raise EnvironmentError('The nvcc binary could not be ''located in your $PATH. Either add it to your path, or set $CUDA_PATH')home = os.path.dirname(os.path.dirname(nvcc))print("home = %s, nvcc = %s\n" % (home, nvcc))cudaconfig = {'home': home, 'nvcc': nvcc,'include': pjoin(home, 'include'),'lib64': pjoin(home, lib_dir)}for k, v in cudaconfig.items():if not os.path.exists(v):raise EnvironmentError('The CUDA %s path could not be located in %s' % (k, v))return cudaconfigCUDA = locate_cuda()class CUDA_build_ext(build_ext):"""Custom build_ext command that compiles CUDA files.Note that all extension source files will be processed with this compiler."""def build_extensions(self):self.compiler.src_extensions.append('.cu')self.compiler.set_executable('compiler_so', 'nvcc')self.compiler.set_executable('linker_so', 'nvcc --shared')if hasattr(self.compiler, '_c_extensions'):self.compiler._c_extensions.append('.cu')  # needed for Windowsself.compiler.spawn = self.spawnbuild_ext.build_extensions(self)def spawn(self, cmd, search_path=1, verbose=0, dry_run=0):"""Perform any CUDA specific customizations before actually launchingcompile/link etc. commands."""if (sys.platform == 'darwin' and len(cmd) >= 2 and cmd[0] == 'nvcc' andcmd[1] == '--shared' and cmd.count('-arch') > 0):# Versions of distutils on OSX earlier than 2.7.9 inject# '-arch x86_64' which we need to strip while using nvcc for# linkingwhile True:try:index = cmd.index('-arch')del cmd[index:index+2]except ValueError:breakelif self.compiler.compiler_type == 'msvc':# There are several things we need to do to change the commands# issued by MSVCCompiler into one that works with nvcc. In the end,# it might have been easier to write our own CCompiler class for# nvcc, as we're only interested in creating a shared library to# load with ctypes, not in creating an importable Python extension.# - First, we replace the cl.exe or link.exe call with an nvcc#   call. In case we're running Anaconda, we search cl.exe in the#   original search path we captured further above -- Anaconda#   inserts a MSVC version into PATH that is too old for nvcc.cmd[:1] = ['nvcc', '--compiler-bindir',os.path.dirname(find_executable("cl.exe", PATH))or cmd[0]]# - Secondly, we fix a bunch of command line arguments.for idx, c in enumerate(cmd):# create .dll instead of .pyd files#if '.pyd' in c: cmd[idx] = c = c.replace('.pyd', '.dll')  #20160601, by MrX# replace /c by -cif c == '/c': cmd[idx] = '-c'# replace /DLL by --sharedelif c == '/DLL': cmd[idx] = '--shared'# remove --compiler-options=-fPICelif '-fPIC' in c: del cmd[idx]# replace /Tc... by ...elif c.startswith('/Tc'): cmd[idx] = c[3:]# replace /Fo... by -o ...elif c.startswith('/Fo'): cmd[idx:idx+1] = ['-o', c[3:]]# replace /LIBPATH:... by -L...elif c.startswith('/LIBPATH:'): cmd[idx] = '-L' + c[9:]# replace /OUT:... by -o ...elif c.startswith('/OUT:'): cmd[idx:idx+1] = ['-o', c[5:]]# remove /EXPORT:initlibcudamat or /EXPORT:initlibcudalearnelif c.startswith('/EXPORT:'): del cmd[idx]# replace cublas.lib by -lcublaselif c == 'cublas.lib': cmd[idx] = '-lcublas'# fix ID=2 errorelif 'ID=2' in c: cmd[idx] = c[:15]# replace /Tp by ..elif c.startswith('/Tp'): cmd[idx] = c[3:]# - Finally, we pass on all arguments starting with a '/' to the#   compiler or linker, and have nvcc handle all other argumentsif '--shared' in cmd:pass_on = '--linker-options='# we only need MSVCRT for a .dll, remove CMT if it sneaks in:cmd.append('/NODEFAULTLIB:libcmt.lib')else:pass_on = '--compiler-options='cmd = ([c for c in cmd if c[0] != '/'] +[pass_on + ','.join(c for c in cmd if c[0] == '/')])# For the future: Apart from the wrongly set PATH by Anaconda, it# would suffice to run the following for compilation on Windows:# nvcc -c -O -o <file>.obj <file>.cu# And the following for linking:# nvcc --shared -o <file>.dll <file1>.obj <file2>.obj -lcublas# This could be done by a NVCCCompiler class for all platforms.spawn(cmd, search_path, verbose, dry_run)cudamat_ext = [Extension('rotate_polygon_nms',sources=['rotate_polygon_nms_kernel.cu', 'rotate_polygon_nms.pyx'],language='c++',libraries=cuda_libs,extra_compile_args=nvcc_compile_args,include_dirs = [numpy_include, CUDA['include']])]setup(name='fast_rcnn',ext_modules=cudamat_ext,# inject our custom triggercmdclass={'build_ext': CUDA_build_ext},
)

win10编译 Fast R-CNN 所需的setup.py(rotate) tensorflow版相关推荐

  1. win10+python3.66+vs2017+cuda9.2下运行tensorflow版的faster-Rcnn编译训练

    win10+python3.66+vs2017+cuda9.2下运行tensorflow版的faster-Rcnn 配置Faster-RCNN(网上找的的都是基于python3.5的,不支持py3.6 ...

  2. Faster R CNN

    Faster R CNN 3 FASTER R-CNN 我们的Faster R CNN 由两个模块组成,第一个模块是 proposes regions 的全卷积网络,第二个是使用 proposed r ...

  3. win10编译OpenCV4Android系列1-Android编译环境搭建

    win10编译OpenCV4Android系列1-Android编译环境搭建 前言 一.配置JDK 1.下载JDK 2.安装JDK 二.配置AndroidSDKTools 1.下载AndroidSDK ...

  4. Win10开启远程桌面(只需4步)

    Win10开启远程桌面(只需4步) 下面是详细步骤: 第一步:我的电脑右键->属性->远程设置->远程(如下勾选) 第二步:win+R(调出运行窗口)->输入"gpe ...

  5. 解决 win10 pycurl安装出错 Command python setup.py egg_info failed with error code 10 编译安装包 安装万金油...

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/yexiaohhjk/article/d ...

  6. 20200614在ubuntu20.04的本地编译全志R系列的步骤20

    在ubuntu20.04的本地编译全志R系列的步骤20 2020/6/14 14 7:51 开始写 2020/6/14 14 14:48 完工 0.获取全志R系列的Android源码包: 请通过渠道/ ...

  7. 使用Win10系统在R中加载TensorFlow-gup加快深度学习运行之攻略

    弗朗索瓦.肖莱著<深度学习R语言版>说,用CUP进行深度学习运算可能需要数小时,但用GPU可能只要几分钟.不过,该书只叙述了在Ubuntu下安装GUP的方法,不推荐Windows下使用Te ...

  8. win10 minikube镜像位置_只需3步!教你打造精简win10,去除系统自带程序,运行更快!...

    说到win10系统,真是让人很头痛,尤其是系统不断更新的同时,也不断变大! 结果,一些配置相对没有这么好的电脑,安装win10系统之后,除了卡之外,还发现系统中有一大堆这辈子都不怎么用的系统程序组件之 ...

  9. VC使用mingw32编译ffmpeg静态库所需文件(一),ffmpegshim.c

    VC使用mingw32编译ffmpeg静态库所需文件(一),ffmpegshim.c 哈哈,这是我从一些项目里面看到的,这些函数是ffmpeg.a缺少的函数.估计大家会用得上. 当然我移植的的项目都不 ...

最新文章

  1. matlab--微积分与微分方程
  2. core identity mysql_Asp.Net Core Identity 4 改成 MySql/MariaDB
  3. c++使用Vigenere加解密文本的算法(附完整源码)
  4. 小心NLS_SORT和NLS_COMP的设置成为性能杀手
  5. web api开启错误提示_当HTTP状态代码不足时:处理Web API错误报告
  6. Zabbix 结合 bat 脚本与计划任务开启 windows 远程桌面
  7. 《商务新星.NET 4.0》发布说明
  8. 智能优化算法:金枪鱼群优化算法-附代码
  9. 【转载】张逸--ThoughtWorks(中国)程序员读书雷达
  10. 利润表模板excel_年薪60w财务总监:工作八年,这10个Excel必备财务系统,效率翻倍...
  11. 计算机网络技术实训课程报告,大学网络技术基础课程的实训报告怎么写?
  12. 从估值、稀释和倍数的角度来看 Yuga labs 、Opensea 等明星 NFT 项目
  13. win10更新(windows update)后,打印蓝屏解决方法
  14. 1M = 1048576 字节 1G = 1073741824 字节 1T = 1099511627776 字节
  15. VI 之快速查找定位
  16. 黑客入侵终端设备的5大简单方式
  17. 比较 Java 枚举成员:== 或 equals()?
  18. 丰田增设电池生产线,加快丰田电动化进程
  19. 电脑莫名奇妙地出现了嘀嗒壁纸,只有下拉的水滴图标,找不到文件所在位置,怎么删除?
  20. python最快多久学会,python学成需要多久

热门文章

  1. hololens共享视野的例子记录
  2. JOB SERVER 负载均衡
  3. Linux使用Aria2命令下载BT种子/磁力/直链文件
  4. mybatis-generator同名表的处理
  5. dd命令磁盘对拷及备份
  6. 关于域名的说法,一级,二级
  7. 云大使的返利规则是什么
  8. android商店账号密码错误,android app 自定义签名出现错误:Keystore was tampered with, or password was incorrect...
  9. 顶级域名、一级域名、二级域名、子域名如何区分
  10. 智能家居,在互联中看见全屋智能