上次安装了Caffe之后目录不幸被清空,后来找到了Faster R-CNN的Pytorch版本,安装、跑得都比较顺利,然而后面要跑的代码只有Caffe版,所以含泪继续装一遍。
以为自己会一回生二回熟,结果猝不及防地还是遇到很多无法解决的错误。
这次follow了网上的步骤很仔细地把Makefile文件都改好,不过首先安装依赖包的时候就出了很多错。
1. 忘了具体报错是啥,但是有一个建议就是有关protobuf的包,你可能会sudo apt-get install libprotobuf-dev,但是这样出错概率很高,因为自动安装版本可能会比较低,建议去网上下载新版的源包自行安装,相关教程很多。
安装后执行 protoc --version 查看版本。
2.执行 make all -j8 编译时,出现了这个错误:
Makefile:580: recipe for target '.build_release/src/caffe/data_transformer.o
搜到解决方案是缺少一些包,执行命令 sudo apt-get install --no-install-recommnds libboost-all-dev时,又出现了这个错误:
libboost-all-dev unable to correct problems, you have held broken packages
安装依赖的时候出现了这个错误提示,当时真的束手无策,apt-get完全无法解决,然后知道了一个神器,sudo apt-get aptitude,然后用aptitude去安装依赖包。上面的问题可能源于libxxx系列都互相依赖错综复杂,可能有的只依赖其他文件的低版本,版本不对应造成了一个死循环,apt-get无法解决,而aptitude很擅长解决这些依赖关系,会自动提出一些解决方案,据网上说最好拒绝第一个方案,接受第二个,会降级一些包就能完美解决了,详细请自行百度~
2. 这个错误有关opencv,我真的搞了很久快哭了TT
这里报错只贴了一部分,相关cv的一些库找不到,造成形如下列的报错:
.build_debug/lib/libcaffe.so: undefined reference to `cv::imread(cv::String const&, int)'
.build_debug/lib/libcaffe.so: undefined reference to `cv::imencode(cv::String const&, cv::_InputArray const&, std::vector<unsigned char, std::allocator<unsigned char> >&, std::vector<int, std::allocator<int> > const&)'
.build_debug/lib/libcaffe.so: undefined reference to `cv::imdecode(cv::_InputArray const&, int)'
collect2: error: ld returned 1 exit status
等等等等。但错误实际上在opencv!!!到处找了好多解决方法,github caffe源码的issue中也有人提出,详见 https://github.com/BVLC/caffe/issues/2348
这里给出了较有效的解决,这里贴上来:
- make sure you installed opencv;
- Note: in "Makefile" (not in 'Makefile.config")
add "opencv_imagecodecs
" to the end ofLIBRARIES += opencv_core opencv_highgui opencv_imgproc
这个解决方法应该很有效,无效的话首先确认相关依赖是否装好比如libprotobuf等等,然后确认自己装了opencv没,是否装了多个版本,是2还是3,如果是3,在Makefile.config中是否把 OPENCV_VERSION := 3 取消了注释?英文水平不差的话请在这个链接中仔细爬一遍楼,里面给了很多思路,当然也许你像我一样什么都试了也没有效……
然后我在这里找到了方法!https://blog.csdn.net/Dillon2015/article/details/79858116
如果你+了imgcodecs还是有问题,提示意思大概是找不到这些链接库,那么可以考虑重装一下opencv了,这可能是安装路径或是版本冲突的问题。我是直接apt-get的,看来不太靠谱,于是直接去github下载opencv源码。注意,请尽量下载3.x版本,好像有人用opencv4出现了编译错误的情况,多一事不如少一事吧……下载之后按流程装了一遍,填好了路径,再跑命令 make all -j8,完美通过!
3. make runtest也通过了,之后就是美滋滋地python → import caffe 来验证了,于是python中又得到报错 No module named 'caffe' ... 看来是有关路径的问题。
解决方案:输入 vi ~/.bashrc 更改配置。在最后加上:
export PYTHONPATH=/.../caffe/python:$PYTHONPATH
//这里...是你caffe安装包的路径,一般是/home/xxx的形式,我的文件夹叫caffe-master,就是/home/xxx/caffe-master/python的形式
在caffe路径下编译pycaffe:make pycaffe -j8
4. 更改好后出了另一个错误:
>>> import caffe
Failed to include caffe_pb2, things might go wrong!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/data1/mahaoyun/caffe-master/python/caffe/__init__.py", line 4, in <module>
from .proto.caffe_pb2 import TRAIN, TEST
File "/data1/mahaoyun/caffe-master/python/caffe/proto/caffe_pb2.py", line 5, in <module>
from google.protobuf.internal import enum_type_wrapper
ModuleNotFoundError: No module named 'google'
解决方法在这里:http://www.cnblogs.com/darkknightzh/p/5993405.html
定位到你安装protobuf的源包目录,在下面运行命令
python setup.py build
出来很多条 ‘Generating xxx' 的信息后,再进入python,import caffe就可以了,但是不要急,很可能你进入到别的目录又依旧报错,再次 vi ~/.bashrc,滑到最后添加一条:
export PYTHONPATH=/home/XXX/protobuf-2.6.1/python:$PYTHONPATH
如果刚才已经写入了PYTHONPATH,就在原来的目录前面再加上这个目录,以冒号分隔(不要忘记冒号!)。
就是这样的形式:export PYTHONPATH=/路径1...:/路径2:$PYTHONPATH
再次试着import,完美解决!