Deep-Image-Analogy编译

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

出现的问题汇总:

  1. sh: cicc: not found
    解决办法:cicc在nvvm中,nvvm在cuda中。因此只需要系统的PATH添加cuda/nvvm/bin即可。

  2. /usr/local/cuda/include/surface_functions.h(134): error: expected a ";"
    解决办法:https://github.com/caffe2/caffe2/issues/529

  3. 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里的相应的同名文件。

  4. 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/

  5. ‘gflags’ not declared
    解决办法:注释caffe/include/common.hpp 中 gflags=google上下的#if_def语句。

  6. 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中。

  7. undefined reference to cv::imread(cv::String const&, int)' and undefined reference tocv::imdecode(cv::_InputArray const&, int)
    解决:may be using OpenCV 3. You need to set the OPENCV_VERSION variable in Makefile.config.

  8. /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

  9. 在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

  10. 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则:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值