Ubuntu - Caffe 安装:在layer_factory.cpp中捕获多态类型



我正在尝试在我的虚拟 Ubuntu 机器上安装 Caffe(仅限 CPU 版本(,但我在使用 Python 层(layer_factory.cpp 文件(时遇到了问题。我有以下系统信息:

  • Ubuntu 20.04 LTS (64 位(
  • 蟒蛇 3.8.2
  • OpenCV 4.3.0

我完全按照此处的说明进行操作 https://qengineering.eu/install-caffe-on-ubuntu-18.04-with-opencv-4.1.html(没有 CUDA 或 CUDNN(。当我尝试在 caffe-master 目录中执行"make all"命令时,出现以下错误:

nina@nina-VirtualBox:~/caffe-master$ make all
PROTOC src/caffe/proto/caffe.proto
CXX .build_release/src/caffe/proto/caffe.pb.cc
CXX src/caffe/data_transformer.cpp
...
CXX src/caffe/syncedmem.cpp
CXX src/caffe/layer_factory.cpp
src/caffe/layer_factory.cpp: In instantiation of ‘boost::shared_ptr<caffe::Layer<Dtype> > caffe::GetPythonLayer(const caffe::LayerParameter&) [with Dtype = float]’:
src/caffe/layer_factory.cpp:304:1:   required from here
src/caffe/layer_factory.cpp:298:5: warning: catching polymorphic type ‘struct boost::python::error_already_set’ by value [-Wcatch-value=]
298 |   } catch (bp::error_already_set) {
|     ^~~~~
src/caffe/layer_factory.cpp: In instantiation of ‘boost::shared_ptr<caffe::Layer<Dtype> > caffe::GetPythonLayer(const caffe::LayerParameter&) [with Dtype = double]’:
src/caffe/layer_factory.cpp:304:1:   required from here
src/caffe/layer_factory.cpp:298:5: warning: catching polymorphic type ‘struct boost::python::error_already_set’ by value [-Wcatch-value=]
AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so.1.0.0
/usr/bin/ld: cannot find -lboost_python3
/usr/bin/ld: cannot find -lpython3.8m
collect2: error: ld returned 1 exit status
make: *** [Makefile:596: .build_release/lib/libcaffe.so.1.0.0] Error 1

错误在layer_factory.cpp文件的以下部分中引发:

#ifdef WITH_PYTHON_LAYER
template <typename Dtype>
shared_ptr<Layer<Dtype> > GetPythonLayer(const LayerParameter& param) {
Py_Initialize();
try {
bp::object module = bp::import(param.python_param().module().c_str());
bp::object layer = module.attr(param.python_param().layer().c_str())(param);
return bp::extract<shared_ptr<PythonLayer<Dtype> > >(layer)();
} catch (bp::error_already_set) {
PyErr_Print();
throw;
}
}

有人可以帮我解决这个问题吗? :-(

通过更改来解决它

catch (bp::error_already_set)

catch (bp::error_already_set&)

似乎是一个通用的解决方案 ->而是通过引用而不是按值捕获异常。

最新更新