Deep-Image-Analogy
一篇风格转换的论文,基于caffe,github地址:
https://github.com/msracver/Deep-Image-Analogy/tree/linux
编译前须知
- 首先,是需要服务器环境能正确编译BVLC Caffe。建议使用Makefile.config 而不是 cmake
方式,因为更改的东西比较少。cmake也有好处,可以在编译前检查依赖是否安装。
关于BVLC的编译,基本上就是官方git上拉下来,修改Makefile.config,make,make test…
如果编译正版caffe出现诸如“nvcc fatal : not specify device library”之类的错误,原因是nvidia driver没有安装正确。正确安装的方法见我的另一篇博客https://mp.csdn.net/postedit/84199606 - 如果可以正确编译BVLC-Caffe,一个一般的想法是可不可以用官方Caffe的源码替换Deep-Image-Analogy中的Caffe源码,岂不是编译就容易多了?或者干脆用官方编译好的caffe.so库?
这样是不行的。
这样在编译deep-image-analogy的时候会报错:undefined reference : caffe::Net::Net错误。网上一搜索说是别处安装了caffe,其实不是(也可能是,最好检查一下,别的地方的删掉)。原因就是caffe源代码不同导致官网编出来的lib,deep-image-analogy用不了。因为Deep-Image-Analogy核心算法代码依赖他自己内部的caffe编译的lib,他自己的lib的实现与官方Caffe的实现不一定一样,因此不能只替换了事。事实也证明确实不一样。因此正确的做法就是拉取deep-image-analogy的代码,先编译其中的caffe,不要试图用自己的caffe替换它的;然后再编译deep-image-analogy的算法代码。
编译
到这里已经可以正确编译官方Caffe
直接拉deep-image-analogy来编译会遇到一些问题,原因是此工程内包含有老的caffe源码,作者的核心算法依赖老的caffe源码编译的lib,因此第一步是编译deep-image-analogy内部的caffe。
编译Deep-Image-Analogy内部Caffe
出现的问题汇总:
-
sh: cicc: not found
解决办法:cicc在nvvm中,nvvm在cuda中。因此只需要系统的PATH添加cuda/nvvm/bin即可。 -
/usr/local/cuda/include/surface_functions.h(134): error: expected a ";"
解决办法:https://github.com/caffe2/caffe2/issues/529 -
cudnn.hpp:127:41: error: too few arguments to function ‘cudnnStatus_t cudnnSetPooling2dDescriptor
解决办法:
(1). 将./include/caffe/util/cudnn.hpp 换成最新版的caffe里的cudnn的实现,即相应的cudnn.hpp.
(2). 将./include/caffe/layers里的,所有以cudnn开头的文件,例如cudnn_conv_layer.hpp。 都替换成最新版的caffe里的相应的同名文件。
(3). 将./src/caffe/layer里的,所有以cudnn开头的文件,例如cudnn_lrn_layer.cu,cudnn_pooling_layer.cpp,cudnn_sigmoid_layer.cu。都替换成最新版的caffe里的相应的同名文件。 -
undefind reference:hdf5, hdf5_hl
解决办法:/usr/local/hdf5中的so路径让makefile知道,并编译选项加flag:-lhdf5 -lhdf5_hl
有时候usr/local中不一定有hdf5,那么就在/usr/lib/x86_64-linux-gnu/hdf5/serial/ -
‘gflags’ not declared
解决办法:注释caffe/include/common.hpp 中 gflags=google上下的#if_def语句。 -
caffe.pb.h not found
这个问题的产生原因是之前谁把caffe.pb.h放到了/usr/local/include中导致出现build_release/src/caffe/proto/caffe.pb.h:12:2: error: #error This file was generated by a newer version of protoc which is… 的错误。这个错误就是说你用的caffe.pb.h是新版本生成的,而自己的工程库里proto文件版本旧。因此在哪里有一个新的caffe.pb.h得删掉。
解决办法:自己生成。
到src/caffe/proto中:
$ /usr/bin/protoc --cpp_out=./ caffe.proto
会生成两个文件caffe.pb.cpp与caffe.pb.h,将后者拷贝到include/caffe/proto中。 -
undefined reference to
cv::imread(cv::String const&, int)' and undefined reference to
cv::imdecode(cv::_InputArray const&, int)
解决:may be using OpenCV 3. You need to set the OPENCV_VERSION variable in Makefile.config. -
/usr/bin/ld: warning: libOpenCV_core.so.3.1, needed by //usr/local/lib/libopencv_imgcodecs.so, may conflict with libopencv_core.so.2.4
/usr/bin/ld: /tmp/ccDhjMld.o: undefined reference to symbol '_ZN2cv6String10deallocateEv’
高低版本opencv导致。解决办法:sudo apt-get autoremove libopencv-dev -
在make deep-image-analogy的时候还会遇到这个问题:/usr/bin/ld: .build_release/examples/cpp_classification/classification.o: undefined reference to symbol ‘_ZN2cv6imreadERKNS_6StringEi’
//usr/local/lib/libopencv_imgcodecs.so.3.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
解决:adding -lopencv_imgcodecs worked great for my g++ compile -
2018/11/19更新
在安装了anaconda3后,并把anaconda3的lib加进.zshrc中,重新编译DeepImageAnalogy中的Caffe报错:/usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8: undefined reference to `TIFFIsTiled@LIBTIFF_4.0’ 搜了一下,说是anaconda3中的libtiff与系统中的libtiff冲突。
解决办法:不要将anaconda3/lib 放在 LD_LIBRARY_PATH中。
编译Deep-Image-Analogy
遇到的问题见上一节。
2018/12/25更新
编译caffe时
问题:
In file included from .build_release/src/caffe/proto/caffe.pb.cc:5:0:
.build_release/src/caffe/proto/caffe.pb.h:12:2: error: #error This file was generated by a newer version of protoc which is
#error This file was generated by a newer version of protoc which is
^
.build_release/src/caffe/proto/caffe.pb.h:13:2: error: #error incompatible with your Protocol Buffer headers. Please update
#error incompatible with your Protocol Buffer headers. Please update
原因:我用python去编译caffe时缺少protoc, 我conda install protobuf. 所以电脑在有两个protoc。
解决:
参考:http://blog.csdn.net/elysion122/article/details/64523339
http://blog.csdn.net/a237072751/article/details/78716778
若想用/usr/bin/protoc则: