原本以为小case,没想到是个大坑,唉,说多了都是泪啊。
环境配置
参见另一篇博客:https://blog.youkuaiyun.com/A_Student_OF_SHANDA/article/details/83507085#PyCuda_84
更改Anaconda目录
先cd到根目录,然后输入d:即可进入d盘
C:\Users\11495>cd ..
C:\Users>cd ..
C:\>d:
D:\RayNet>
RayNet安装
可以选择在线或者离线安装。
在线:pip install --user raynet
离线:
# Clone the repository
git clone git@github.com:paschalidoud/raynet.git
cd raynet
# Local installation in development mode
pip install --user -e .
第一个错误:fatal error: numpy/arrayobject.h: No such file or directory
解决方案:
修改setup.py,
...
from Cython.Build import cythonize
import numpy
...
def setup_package():
extensions = [
Extension(
"raynet.utils.fast_utils",
["raynet/utils/fast_utils.pyx"],
include_dirs=[numpy.get_include()]
),
Extension(
"raynet.ray_marching.ray_tracing",
["raynet/ray_marching/ray_tracing.pyx"]
)
]
...
ext_modules=cythonize(extensions),
...
再运行pip install --user -e .
第二个错误: collect2.exe: error: ld returned 1 exit status
原因是编译安装时python用的mingw32的gcc而不是用msvc,因此一直有些问题
solution:
- 进入python安装目录(anaconda目录),找到Lib,进入
- 找到distutils包,进入找到distutils.cfg文件
用anaconda的话是这样的
[build]
compiler=mingw32
改为:
[build]
compiler=msvc
我的distutils.cfg文件是在
Anaconda安装目录\pkgs\libpython-2.1-py36_0\Lib\distutils
再运行pip install --user -e .
第三个错误: LINK : fatal error LNK1158: 无法运行“rc.exe”
解决方案:
将C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin
下的RC.Exe和RcDll.Dll复制到VS2015安装目录\VC\bin
下
再运行pip install --user -e .
终于安装好了!!!
其实最困难的就是开始第一个错误,不知道该怎么改,看了 https://jacobz.top/2017-12/CythonIntro/ 后知道了setup.py是咋写的后才改好,又被浪费了一天,唉。。。。
事实证明,只pip install --user -e .
并不能用raynet_pretrain
,要再做
python setup.py install
然后就可以用raynet_pretrain
做训练了
RayNet使用python2写的,可以直接用python3自带工具转成python3的:
首先到python安装目录,anaconda的话是在你的安装目录\Anaconda3_5.2.0\Scripts
打开Anaconda Prompt,转到这里,然后输入: python 2to3-script.py -w 你的文件(夹)路径
然后执行就可以了
RayNet要用到PyCuda,然而pycuda不支持cuda9.0,下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#pycuda
所以没办法,我直接pip install pycuda
,
测试:
import pycuda.autoinit
import pycuda.driver as drv
import numpy
from pycuda.compiler import SourceModule
mod = SourceModule("""
__global__ void multiply_them(float *dest, float *a, float *b)
{
const int i = threadIdx.x;
dest[i] = a[i] * b[i];
}
""")
multiply_them = mod.get_function("multiply_them")
a = numpy.random.randn(400).astype(numpy.float32)
b = numpy.random.randn(400).astype(numpy.float32)
dest = numpy.zeros_like(a)
multiply_them(
drv.Out(dest), drv.In(a), drv.In(b),
block=(400,1,1), grid=(1,1))
print(dest-a*b)
保存成test_pycuda.py,运行:
居然成功了!
raynet_forward tmp/aerial_dataset/ tmp/foo/CHS6ZQM3RZLJNN79VUYG/depth_maps/ --weight_file tmp/foo/CHS6ZQM3RZLJNN79VUYG/weights/weights.39.hdf5 --scene_idx 2 --network_architecture simple_cnn --forward_pass_factory multi_view_cnn --dataset_type restrepo --start_end 0,20