Ubuntu20.04下进行Caffe编译,针对opencv4版本

1.首先介绍一下caffe是什么

Caffe(Convolutional Architecture for Fast Feature Embedding)是一个流行的深度学习框架,最初由加州大学伯克利分校的研究人员开发。它专注于卷积神经网络(CNN)的实现,旨在进行图像分类和识别等计算机视觉任务。

这个框架的设计着眼于简单性和可扩展性,它通过使用“层”的概念来组织网络结构,这些层包括卷积层、池化层、全连接层等。用户可以通过配置网络结构和参数来创建自定义的深度学习模型。

Caffe支持CPU和GPU加速,并提供了Python和MATLAB接口,使得它在各种平台上都很流行。虽然最初是为图像处理任务设计的,但Caffe也可以用于其他领域,如语音识别和自然语言处理,尤其是在一些先进的网络架构被提出后,Caffe的功能得到了进一步扩展。

2.我的caffe编译环境

因为我的python版本是3.11,所以安装的opencv4,故这篇文章主要是以opencv4进行编译,需要做一些修改。

这是我的部分环境配置

Ubuntu20.04,ros noetic,cuda12.0+cudnn8.9.3,opencv4.2.0

其他版本的cuda应该也可以,在对应文件修改之后,即可编译。后面会提示不同版本的cuda需要怎么改

cuda版本查询命令

nvcc -V

cudnn版本查询命令

cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
或者
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

 opencv命令查询

pkg-config opencv4 --modversion   #版本4查询命令
pkg-config opencv --modversion   #版本3以下查询命令

3.caffe编译

下载caffe

一定一定要cd到home目录

我之前在home目录下单独创建的一个文件夹,再在里面下载caffe。导致后面编译CNN的时候,出现'Caffe' is not installed. 'lidar_cnn_seg_detect' will not be built.,意思是我没有编译好caffe。

最后我把caffe文件夹移到主目录就解决了。

当然出现这种问题,还有一种情况就是make之后,没有执行make distribute,用于生成一个distribute文件

话不多说,直接执行下面命令,开始下载

cd ~        
git clone https://github.com/BVLC/caffe

下载完成如下图所示

安装依赖

下载好项目文件之后,这里我是创建了一个虚拟环境caffe,用于安装caffe各种依赖

conda create -n caffe python=3.8.10
#
#
#创建好虚拟环境之后,激活虚拟环境,执行一下命令安装依赖
conda activate caffe
#
#
sudo apt-get install  -y libopencv-dev
sudo apt-get install -y build-essential cmake git pkg-config
sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install -y liblapack-dev
sudo apt-get install -y libatlas-base-dev 
sudo apt-get install -y --no-install-recommends libboost-all-dev
sudo apt-get install -y libgflags-dev libgoogle-glog-dev liblmdb-dev
sudo apt-get install -y python-numpy
sudo apt-get install -y python3-pip
sudo apt-get install -y python3-numpy python3-scipy

进入caffe/python/目录,执行下面的命令,安装依赖项

for req in $(cat requirements.txt); do pip install $req; done

可能会出现不兼容的情况,

matplotlib 3.7.5 requires python-dateutil>=2.7, but you have python-dateutil 1.5 which is incompatible.

pandas 2.0.3 requires python-dateutil>=2.8.2, but you have python-dateutil 1.5 which is incompatible.

大概意思就是matplotlib 和 pandas 都需要较新版本的 python-dateutil(>=2.7 和 >=2.8.2),但实际安装的版本是较旧的(1.5),导致冲突。这里可以修改python文件夹里面的requirements.txt。

然后为了导入caffe Python模块,可以在命令行执行

export PYTHONPATH=/path/to/caffe/python:$PYTHONPATH

但这只是暂时的,一旦关闭终端,就必须再执行一次,要一直这样的话,可以修改配置文件

sudo gedit ~/.bashrc
#将下面的内容添加在出现的bashrc文件里
export PYTHONPATH="${PYTHONPATH}:/home/tang/caffe/python"
#然后保存推出,执行
source ~/.bashrc

 #检查是否添加成功

echo $PYTHONPATH

输出下面的内容,即表示成功

编译caffe

官网给出了两种编译方式,一种是通过make编译,另一种是通过cmake编译。我采用的make编译,即使用Makefile文件进行编译。执行官网给出的几条命令即可,但是因为我是opencv4版本的,所以要做一些改动,确保编译成功。如果使用的是opencv3,下面的opencv_version只用取消#。

另外我编译的时候没有使用cudnn,因为caffe只支持到cudnn7.x,所以有需要的朋友可以下载这里,一个适用于cudnn8的caffe,我没有成功过,索性放弃使用cudnn

1.Makefile.config文件修改

首先将Makefile.config.example复制并改名为Makefile.config,可以执行下面的命令完成这个操作

cp Makefile.config.example Makefile.config

 执行修改文件命令

gedit Makefile.config

然后再修改Makefile.config里面的内容

1.将下面的代码:
#USE_OPENCV := 0
#OPENCV_VERSION := 3
#WITH_PYTHON_LAYER := 1
改成:(注意要删掉#)
USE_OPENCV := 1
OPENCV_VERSION := 4
WITH_PYTHON_LAYER := 1

2.将下面代码:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
改成:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/ /usr/include/opencv4
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial /usr/bin
# 注意这些文件的路径
将下面代码:
PYTHON_INCLUDE := /usr/include/python2.7 \
                /usr/lib/python/dist-packages/numpy/core/include
改成:
PYTHON_INCLUDE := /usr/include/python3.8 \
                /usr/lib/python3/dist-packages/numpy/core/include
#同样根据自己文件路径修改,注意自己python版本

3.修改cuda的架构
CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
		-gencode arch=compute_20,code=sm_21 \
		-gencode arch=compute_30,code=sm_30 \
		-gencode arch=compute_35,code=sm_35 \
		-gencode arch=compute_50,code=sm_50 \
		-gencode arch=compute_52,code=sm_52 \
		-gencode arch=compute_60,code=sm_60 \
		-gencode arch=compute_61,code=sm_61 \
将上面的内容改成匹配的架构,因为我是cuda12.0,所以直接改成
CUDA_ARCH := -gencode arch=compute_89,code=sm_89 \

不同版本的cuda,对应架构不一样,可参考cuda架构匹配

2.Makefile文件修改

gedit Makefile

 修改Makefile文件里面的内容

将代码
NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS)
修改为:
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
#添加了 -D_FORCE_INLINES这一部分用于提高程序的执行效率
 
将代码:
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5
修改为:
LIBRARIES += glog gflags protobuf boost_system boost_filesystem hdf5_hl hdf5 m opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs
#用以解决undefined reference to cv::imread(cv::String const&, int)...,可参考https://github.com/BVLC/caffe/issues/2348
 
将代码:
PYTHON_LIBRARIES ?= boost_python python2.7
修改为:
PYTHON_LIBRARIES ?= boost_python38 python3.8
#这是要指定要链接的 Python 库,具体要参考自己的python版本

3. 在src/caffe/data_transformer.cpp中添加opencv的头文件

gedit src/caffe/data_transformer.cpp
 
将代码:
#ifdef USE_OPENCV
#include <opencv2/core/core.hpp>
#endif  // USE_OPENCV
修改为:
#ifdef USE_OPENCV
#include <opencv2/core/core.hpp>
#include <opencv2/core/mat.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/opencv.hpp>
#endif  // USE_OPENCV

4.在include/caffe/common.hpp中增加opencv4支持

gedit include/caffe/common.hpp
 
将下面代码添加在相应位置(第71行复制上去):
// Supporting OpenCV4
#if (CV_MAJOR_VERSION == 4)
#define CV_LOAD_IMAGE_COLOR cv::IMREAD_COLOR
#define CV_LOAD_IMAGE_GRAYSCALE cv::IMREAD_GRAYSCALE
#endif
 
以下为原代码(参考定位):
// See PR #1236
namespace cv { class Mat; }

5.修改完上面的代码之后,就可以进行编译caffe了

命令行执行

make -j4    
#后面的j4是指同时运行 4 个编译任务具体根据你的cpu性能来,也可以j2或之直接make,避免卡死。


#如果编译失败,执行
make clean   
#这个命令可以确保在重新编译项目时,从一个干净的状态开始,以避免之前的编译产生的一些问题。
#而且make clean不会删除源代码文件,只是清理编译过程中生成的中间文件和目标文件,因此不会影响源代码
#的内容。

编译完成如下所示

然后执行下面两条命令,用于运行测试,二者的区别在于,前者是执行项目的单元测试,是针对软件中的单个模块或组件进行的测试,旨在验证其功能是否按预期工作;后者用于运行项目的整体测试套件,通常涵盖更广泛的功能,并可能涉及多个模块之间的交互。

make test
make runtest

make test结果如图

make runtest结果如图

之后可以运行

make distribute 

用于创建一个 distribute 目录,其中包含所有Caffe头文件、编译库、二进制文件等,以便分发到其他机器。这里也是编译CNN的一个重要步骤,不然就会出现一个'Caffe' is not installed. 'lidar_cnn_seg_detect' will not be built.

测试caffe是否安装成功

如果是在虚拟环境下进行的caffe,最好激活虚拟环境再测试。

#激活环境
conda activate xxx
#输入
python

import caffe

caffe.__version__

结果如图

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是在 Ubuntu 20.04 系统中编译安装 OpenCV-Python 的步骤: 1. 安装依赖项 ```bash sudo apt-get update sudo apt-get upgrade sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install python3-dev python3-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev ``` 2. 克隆 OpenCV 仓库 ```bash git clone https://github.com/opencv/opencv.git cd opencv git checkout 4.5.2 ``` 3. 克隆 OpenCV-contrib 仓库(可选) ```bash cd .. git clone https://github.com/opencv/opencv_contrib.git cd opencv_contrib git checkout 4.5.2 ``` 4. 编译 OpenCV ```bash cd ../opencv mkdir build cd build cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ -D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python3 \ -D PYTHON3_EXECUTABLE=/usr/bin/python3 \ -D PYTHON3_INCLUDE_DIR=/usr/include/python3.8 \ -D PYTHON3_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.8.so \ -D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include \ -D BUILD_opencv_python3=YES \ -D BUILD_opencv_python2=NO \ -D BUILD_EXAMPLES=NO \ -D BUILD_TESTS=NO \ -D BUILD_PERF_TESTS=NO .. make -j8 sudo make install sudo ldconfig ``` 其中,`-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules` 参数是为了编译 OpenCV-contrib 模块,如果不需要可以省略。 5. 测试 OpenCV-Python ```bash python3 >>> import cv2 >>> cv2.__version__ ``` 如果输出的版本号是 4.5.2,则说明安装成功。 以上是在 Ubuntu 20.04 系统中编译安装 OpenCV-Python 的步骤,希望能帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值