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__
结果如图