经过一顿折腾,终于跑通了tensorflow版的faster rcnn,mark一下。
git源代码:git clone --recursive https://github.com/smallcorgi/Faster-RCNN_TF.git。这是github上面star最多的,也还有其他的实现,不过这个应该是最靠谱的。
进入Fater-RCNN/lib目录,执行make,正常情况下,会在roi_pooling_layer和utils目录下面生成.so文件,然后下载模型,再执行python tools/demo.py --model model_path,就可以进行目标检测了。
其中,模型指的是别人训练好的模型,如github主页(https://github.com/smallcorgi/Faster-RCNN_TF)上面说的在PASCAL VOC 2007数据集上面训练的VGG16网络,但模型是在[Google Drive] [Dropbox],想要下载得搭梯子。
但是,在make和运行demo过程中,会出现各种问题,如roi_pooling.so: undefined symbol、undefined symbol: __cudaPopCallConfiguration、undefined symbol: _ZTIN10tensorflow8OpKernelE、undefined symbol: _ZN10tensorflow7strings6StrCatERKNS0_8AlphaNumES3_等等错误,甚至还出现了ImportError: libcudart.so.9.2: cannot open shared object file: No such file这个错误(明明我安装的是CUDA9.0,无奈把tensorflow和CUDA都卸载了重新安装)。
经过一番搜索,发现问题出在lib/make.sh这个文件上面,可能对不同版本的tensorflow不太友好,一顿尝试之后,终于成功解决。
make.sh代码如下:
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())')
CUDA_PATH=/usr/local/cuda/
CXXFLAGS=''
if [[ "$OSTYPE" =~ ^darwin ]]; then
CXXFLAGS+='-undefined dynamic_lookup'
fi
cd roi_pooling_layer
if [ -d "$CUDA_PATH" ]; then
nvcc -std=c++11 -c -o roi_pooling_op.cu.o roi_pooling_op_gpu.cu.cc \
-I $TF_INC -D GOOGLE_CUDA=1 -x cu -Xcompiler -fPIC $CXXFLAGS \
-arch=sm_37 --expt-relaxed-constexpr \
g++ -std=c++11 -shared -o roi_pooling.so roi_pooling_op.cc \
roi_pooling_op.cu.o -I $TF_INC -D GOOGLE_CUDA=1 -fPIC $CXXFLAGS -D_GLIBCXX_USE_CXX11_ABI=1 \
-lcudart -L $CUDA_PATH/lib64 \
-L$TF_LIB -ltensorflow_framework \
else
g++ -std=c++11 -shared -o roi_pooling.so roi_pooling_op.cc \
-I $TF_INC -fPIC $CXXFLAGS
fi
cd ..
其中,主要修改的地方有:
添加第二行: TF_LIB=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_lib())')
修改CUDA_PATH为自己的cuda安装目录
添加了--expt-relaxed-constexpr参数,这个是为了避免warnning:calling a constexpr __host__ function from a __host__ __device__ function is not allowed
修改参数-D_GLIBCXX_USE_CXX11_ABI=1 (如果不行,可以试试把这个参数改成0)
添加参数 -L$TF_LIB -ltensorflow_framework