1:fatal error: caffe/proto/caffe.pb.h: No such file or directory
解决方法:用protoc从caffe/src/caffe/proto/caffe.proto生成caffe.pb.h和caffe.pb.cc
进入caffe根目录,输入命令:
protoc src/caffe/proto/caffe.proto --cpp_out=.
mkdir include/caffe/proto
mv src/caffe/proto/caffe.pb.h include/caffe/proto
再次调用就没有问题了。
2:error: ‘class caffe::MemoryDataLayer’ has no member named ‘AddMatVector’
error: ‘CVMatToDatum’ is not a member of ‘caffe’
在使用memorydata加载数据进网络时,报了这个错,其原因是未声明“USE_OPENCV”。查看memory_data_layer.hpp和io.hpp可以看到其明确包含了函数AddMatVector和CVMatToDatum,但都需要先声明USE_OPENCV才可见:
#ifdef USE_OPENCV
virtual void AddMatVector(const vector<cv::Mat>& mat_vector,
const vector<int>& labels);
#endif // USE_OPENCV
#ifdef USE_OPENCV
cv::Mat ReadImageToCVMat(const string& filename,
const int height, const int width, const bool is_color);
cv::Mat ReadImageToCVMat(const string& filename,
const int height, const int width);
cv::Mat ReadImageToCVMat(const string& filename,
const bool is_color);
cv::Mat ReadImageToCVMat(const string& filename);
cv::Mat DecodeDatumToCVMatNative(const Datum& datum);
cv::Mat DecodeDatumToCVMat(const Datum& datum, bool is_color);
void CVMatToDatum(const cv::Mat& cv_img, Datum* datum);
#endif // USE_OPENCV
解决方法:首先确认在编译caffe时,Makefile.config里确认包含了opencv模块,也即:
# Uncomment if you're using OpenCV 3
OPENCV_VERSION := 3
且注释掉USE_OPENCV := 0:
# USE_OPENCV := 0
其次,在包含文件memory_data_layer.hpp或io.hpp时,需在调用程序上方显式声明宏定义USE_OPENCV,例如:
#ifndef USE_OPENCV
#define USE_OPENCV
#include <caffe/caffe.hpp>
#include <caffe/layers/memory_data_layer.hpp>
#include <caffe/util/io.hpp>
#endif
再次编译,问题解决。