是在参考这篇文章的基础以及作者的相关博客来进行的,在这里只是补充一些自己在整个过程中遇到的问题,建议详细阅读远原文章,作者讲解的非常详细。
首先在克隆工程和编译Cython模块时遇到了一些问题。在进入到lib文件下使用make命令进行时遇到了一些错误提示,大概意思就是没有安装Cython.Distutils和TensorFlow等等,然而自己明明安装了的。最终想到自己的Mac上已经安装了Python3,但是在lib文件夹下的make.sh和MakeFile文件中使用的是Python开头的命令:
修改成Python3即可:
另外,由于原版是Python2 写的,运行时一直出错,左后无奈我从Python3切换到了Python2。依然报错:undefined symbol: _ZTIN10tensorflow8OpKernelE。查到了资料发现是和TensorFlow的动态库链接时出现了错误。然而我们采用的是TTFRCNN, 并不是Faster-RCNN_TF,对于Faster-RCNN_TF,感觉有一篇博客写的相当不错,可以参考一下。 TTFRCNN中有些pooling文件还不一样。而网上大部分给出的是Faster-RCNN_TF,照着网上大部分答案并不能解决问题。最后通过替换的方式把make.sh文件内容替换为:
#!/usr/bin/env bash
TF_INC=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_include())')
TF_LIB=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_lib())')
echo $TF_INC
NSYNC_INC=$TF_INC"/external/nsync/public"
CUDA_PATH=/usr/local/cuda/
CXXFLAGS='-D_GLIBCXX_USE_CXX11_ABI=0'
#if [[ "$OSTYPE" =~ ^darwin ]]; then
# CXXFLAGS+='-undefined dynamic_lookup'
#fi
cd roi_pooling_layer
nvcc -std=c++11 -c -o roi_pooling_op.cu.o roi_pooling_op_gpu.cu.cc \
-I $TF_INC -I $NSYNC_INC -D GOOGLE_CUDA=1 -x cu -Xcompiler -fPIC $CXXFLAGS \
-arch=sm_37 -L $TF_LIB -ltensorflow_framework
g++ -std=c++11 -shared -o roi_pooling.so roi_pooling_op.cc \
roi_pooling_op.cu.o -I $TF_INC -I $NSYNC_INC -D GOOGLE_CUDA=1 -fPIC $CXXFLAGS \
-lcudart -L $CUDA_PATH/lib64 -L $TF_LIB -ltensorflow_framework
cd ..
# add building psroi_pooling layer
cd psroi_pooling_layer
nvcc -std=c++11 -c -o psroi_pooling_op.cu.o psroi_pooling_op_gpu.cu.cc \
-I $TF_INC -I $NSYNC_INC -D GOOGLE_CUDA=1 -x cu -Xcompiler -fPIC $CXXFLAGS \
-arch=sm_37 -L $TF_LIB -ltensorflow_framework
g++ -std=c++11 -shared -o psroi_pooling.so psroi_pooling_op.cc \
psroi_pooling_op.cu.o -I $TF_INC -I $NSYNC_INC -D GOOGLE_CUDA=1 -fPIC $CXXFLAGS \
-lcudart -L $CUDA_PATH/lib64 -L $TF_LIB -ltensorflow_framework
## if you install tf using already-built binary, or gcc version 4.x, uncomment the two lines below
g++ -std=c++11 -shared -D_GLIBCXX_USE_CXX11_ABI=0 -o psroi_pooling.so psroi_pooling_op.cc \
psroi_pooling_op.cu.o -I $TF_INC -I $NSYNC_INC -D GOOGLE_CUDA=1 -fPIC $CXXFLAGS \
-lcudart -L $CUDA_PATH/lib64 -L $TF_LIB -ltensorflow_framework
cd ..
成功解决问题。
继续填坑.....
于在跑该程序的时候,是在新安装的Ubuntu电脑上配置的Python来跑的,有了这个错误提示:ImportError: libcublas.so.9.0: cannot open shared object file: No such file...
该错误提示可能存在很多原因,要么就是TensorFlow-gpu版本对应的cudn或者cudnn的版本不匹配所致,要么就是没有和动态库相连接,这种没有动态库链接的解决方法在stackoverflow上给出了解决方法链接。总的来说就是,现在/usr/local/cuda-9.0/lib64/文件夹下查看是否有libcudart.so.9.0这个文件,如果有的话在命令行中输入:
echo 'export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda- 9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}' >> ~/.bashrc
source ~/.bashrc
另外一种方法或许也有效:在命令行输入
sudo ldconfig /usr/local/cuda-9.0/lib64
pip管理指向python还是python3
由于在电脑上安装了Python2又安装了Python3,本来pip应当指向Python2,而pip3指向Python3。但是经过多次折腾,电脑上的pip和pip3都指向了Python3,这样如果python2里面缺少模块,安装新的模块成了新的问题。使用pip2固然可以指向python2。但是pip2的版本过低,升级有成了问题。那么如果使pip重新指向python2呢。通过以下命令:
which pip
我电脑所在输出:/usr/local/bin/pip
然后用vim命令对pip进行编辑:vim /usr/local/bin/pip
在第一行可以看到以下内容
/usr/local/opt/python@2/bin/python3.5
进入vim环境敲击字母:i ,进入插入模式。将3.5去掉或者改成2.7即可。然后点击esc,回到普通模式,最后qw! 退出保存即可