因为之前一直用TensorFlow,所以在做目标检测用Faster-RCNN时,使用的一直是GitHub上的基于TensorFlow的Faster-RCNN的Repository,改来改去,进行的各种操作。但那么几个Repositories大同小异,基本上都是基于RBG大神的py-faster-rcnn做的。因此,溯本追源,尽管其是基于caffe做出来的,但如果不好好研究一下py-faster-rcnn这个Repository的话,也似乎有点舍本逐末了。 可caffe的坑实在太多,这也是大家现在普遍都在转新的框架的原因之一吧;我一直讳谈、讳用caffe相关的东西,也大体上有这样一个原因。 果不其然,安装调试py-faster-rcnn时,就碰到了许多关于caffe的坑;当然,也有一些py-faster-rcnn自身的坑,不过多是因为该项目年久失修,解决起来并不算难。
1. caffe的问题
1.1 hdf5.h相关问题
如fatal error: hdf5.h: No such file or directory,等,可如此修改Makefile.config: 将INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include修改为: INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial 将Makefile(注意不是Makefile.config)中相应部分,由 LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5 修改为: LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial
1.2 OpenCV相关问题
出现如:.build_release/lib/libcaffe.so: undefined reference to cv::imread… 或者.build_release/lib/libcaffe.so: undefined reference to `cv::imdecode…的错误,这是由OpenCV造成的,在Makefile中对相应部分做修改: 将其修改为: LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial matio opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs 即在最后添加:opencv_imgcodecs
1.3 numpy相关问题
关于numpy的相关问题主要在py-faster-rcnn自身,但是caffe中也会碰到,如下: fatal error: numpy/arrayobject.h: No such file or directory 将Makefile.config中相应位置加一个local: 即,将原来的: PYTHON_INCLUDE := /usr/include/python2.7 \ /usr/lib/python2.7/dist-packages/numpy/core/include 修改为: PYTHON_INCLUDE := /usr/include/python2.7 \ /usr/local/lib/python2.7/dist-packages/numpy/core/include
1.4 cannot find -lopencv_imgcodecs
遇到如下错误: /usr/bin/ld: cannot find -lopencv_imgcodecs collect2: error: ld returned 1 exit status Makefile:: recipe for target ‘.build_release/lib/libcaffe.so.1.0.0-rc3’ failed make: [.build_release/lib/libcaffe.so.1.0.0-rc3] Error 1 这个错误比较罕见,在搜索引擎里也难以搜到,主要是因为搜索时,搜索引擎会将-lopencv_imgcodecs理解为不含lopencv_imgcodecs,所以将关键词屏蔽了。 仔细搜索发现,这个错误是因为系统里安装的OpenCV是2.x,而你在Makefile.config里却将USE_OPENCV := 3给取消注释了,所以导致其去找了OpenCV 3.x的lopencv_imgcodecs相关函数,却不能找到。所以将这句保持原来的样子不变(即注释掉),编译即可。
1.5 caffe新功能
py-faster-rcnn自带的caffe版本比较陈旧,有一些新的功能不能支持;而盲目的clone新版本的caffe使用,却可能会带来其他问题。 比如对1080P和cuDNN v5的支持,如这个issue中提及的那样,需要首先将最新版的caffe merge来:
cd caffe-fast-rcnn
git remote add caffe https://github.com/BVLC/caffe.git
git fetch caffe
git merge -X theirs caffe/master
然后修改:将include/caffe/layers/python_layer.hpp中的self_.attr(“phase”) = static_cast
2. py-faster-rcnn自身的问题
2.1 numpy导致的问题
py-faster-rcnn自身的问题不多,主要是在其推出后,numpy升级了一下版本,从原来的1.11逐步升级到现在的1.14,然后不再支持浮点数作索引,所以一些使用浮点数作索引的地方就报错了。 提前将索引进行一下转换即可,可以使用int,或者.astype(np.int)等等。
2.2 BB的问题
在voc_eval.py文件中,对检测结果进行了一个eval,但如果没有检测到内容的话,这个BB将会为空,因此,下面的BB = BB[sorted_ind, :]会出错,所以我们需要对BB进行一个判断,如下:
if BB.shape[0] > 0:
只有在BB不为空的时候,进行相应处理。 当然,下面的
nd = len(image_ids)
tp = np.zeros(nd)
fp = np.zeros(nd)
也需要提前放到if之前。
3. 其他参考
3.1 使用py-faster-rcnn训练自己的数据集时,这篇资料可作参考。 3.2 这里有一系列关于py-faster-rcnn的代码解读。